介绍
欢迎精明的读者。
IT行业在安全性和可用性之间持续不断的平衡。 在这种平衡之中,性能通常会影响可用性。 在保护“休息数据”(即加密)的领域,可能会发现影响性能的三个因素,因此可用性:硬盘驱动器,CPU和RAM。 其中,硬盘将永远被证明是一个瓶颈(是的,即使是固态硬盘,SSD)。
免费软件有一个相当优雅的解决方案,用于保护Rest的数据,称为Linux统一密钥设置(LUKS)。 本着“ 自由0: 以任何目的运行计划的自由 ”的精神,请享受我对集体知识库的贡献,解决“我们如何加速羡慕”的迷人问题?
(C)2014 Justin Mitchell Bennett。 根据GNU FDL许可。
2.定义和基准
我使用Acer Aspire V5-171作为创建混合RAID 1(RAM驱动器和SATA HDD)的平台。 我注意到,经过大约一年的使用,Fedora 19很少使用超过1 GB的RAM,除了通过虚拟机管理器(libvirt / QEMU)运行Windows 7虚拟机。 由于该系统允许最大16GB DDR3,当我升级模块时,我考虑到可以舒适地利用大约10GB的RAM用于运行Fedora的RAM驱动器。
但是,我确实发现限制Fedora用于root /的硬盘空间。 我倾向于在我构建的系统上分区/(root),/ home和交换。 然而,使用这个设置,root(/)倾向于运行11-16GB,使用squid,ndjbdns,LibreOffice,Android开发工具,Eclipse等。在Fedora中,/ usr往往是根目录下最大的目录。 因为我不会进入,/ usr目前不能作为Fedora 20中的一个单独的分区挂载; 这实际上证明是有用的,因为它包含/ bin和/ sbin以及Xorg。 除非您已经有一个简化的Fedora安装,否则建议使用独立的/ opt&/ var分区。
2A。 分区
本指南假设分区的先决条件知识(即创建它们以及多个分区的优点)。 另外,对EUFI和GPT的一些熟悉,因为它们影响到Fedora 20的安装(即创建/ boot / efi和/ boot分区)。 如果使用BIOS和/或MBR,请相应地调整您的分区策略。 另外,由于缩小/增长的分区可能是一个巨大的痛苦,本指南是从新的Fedora安装或重新安装的角度写的。
2B。 逻辑卷管理(LVM)
本指南还假定熟悉逻辑卷管理。 至少,您必须了解物理卷( pv ),卷组( vg )和逻辑卷( lv ),因为它们与LVM有关。 进一步阅读: RHEL Logical Volume Manager管理
2C。 RAID 1
如本指南中所使用的,对RAID 1(镜像)的引用应理解为通过LVM2实现的RAID 1。 Red Hat的RAID开发继续发展,本指南特别关注兴趣,我们将利用lvchange --writemostly。 供参考 :
Fedora 20 LVM 2 changelog: 2.02.99-1 Peter Rajnoha 25 Jul 2013 - Add lvcreate/lvchange --[raid]{min|max}recoveryrate for raid LVs. - Add lvchange --[raid]writemostly/writebehind support for RAID1 - Add lvchange --[raid]syncaction for scrubbing of RAID LVs.
2D。 Linux统一密钥设置(LUKS)
在最简单的术语中,LUKS扩展了cryptsetup功能,目的是符合TKS1。 TKS1使用散列密钥通过加密算法执行数据去/加密。 在本指南中,具体来说,AES加密。 如果保护美国秘密分类材料足够好,它应该足够安全,以确保您的数据在休息。 进一步阅读在Cryptsetup
2E。 Fedora Live USB镜像
我使用两个USB棒进行此设置。 至少要创建一个Fedora USB媒体 。 我喜欢MATE Desktop到Gnome,我还创建了一个net-install映像。 另外,一旦从Fedora USB介质启动,请安装gparted。
2F。 CPU(AES-NI),RAM和HDD基准:
(注意,对于这些测试,我从Fedora USB介质启动)
较新的Intel(R)处理器包括AES-NI指令集。 测试你的处理器是否有这样的指令类型
cat /proc/cpuinfo | grep aes为了简洁起见,我已经跳过了这里的输出。
接下来,测试各种加密算法的CPU吞吐量。 类型
cryptsetup benchmark我的输出:
# Tests are approximate using memory only (no storage IO). PBKDF2-sha1 386073 iterations per second PBKDF2-sha256 209380 iterations per second PBKDF2-sha512 140034 iterations per second PBKDF2-ripemd160 308404 iterations per second PBKDF2-whirlpool 164870 iterations per second # Algorithm | Key | Encryption | Decryption aes-cbc 128b 434.6 MiB/s 1528.2 MiB/s serpent-cbc 128b 63.3 MiB/s 212.4 MiB/s twofish-cbc 128b 133.2 MiB/s 250.6 MiB/s aes-cbc 256b 316.0 MiB/s 1140.8 MiB/s serpent-cbc 256b 63.7 MiB/s 213.1 MiB/s twofish-cbc 256b 132.8 MiB/s 250.2 MiB/s aes-xts 256b 1264.3 MiB/s 1266.8 MiB/s serpent-xts 256b 218.7 MiB/s 207.4 MiB/s twofish-xts 256b 241.3 MiB/s 247.5 MiB/s aes-xts 512b 994.2 MiB/s 986.7 MiB/s serpent-xts 512b 218.8 MiB/s 208.9 MiB/s twofish-xts 512b 243.7 MiB/s 247.7 MiB/s
值得注意的是,具有256位密钥的AES-XTS显示出最高的吞吐量。 默认情况下,Fedora(通过Anaconda)将使用SHA1哈希安装AES-XTS 512位密钥LUKS分区。 我选择将AES密钥大小从512个减少到256个,以获得吞吐量(〜1000MiB / s vs〜1260MiB / s),并将密钥散列增加到SHA512,SHA1已经记录为弱点。
在我的系统上,我有16GB DDR3L 1600MHz PC3 12800内存。 要显示当前内存,请键入
type sudo dmidecode --type 17 | less
从那里,寻找以下内容:
Size: 8192 MB Form Factor: SODIMM Type: DDR3 Speed: 1600 MHz Configured Clock Speed: 1600 MHz
(Sidenote - 从工厂出发,ACER出货了6GB的RAM,但是,2GB的Stick已经是DDR3 1333MHz,放慢了另一个棒,4GB的1600MHz到1333Mhz)
假设您有足够的RAM,创建一个1GB的RAM磁盘来测试吞吐量:
sudo modprobe brd rd_nr=1 rd_size-1048576 max_part=0
现在通过hdparm测试读取速度:
sudo hdparm -t /dev/ram0
/dev/ram0: Timing buffered disk reads: 5050 MB in 3.00 seconds = 1683.23 MB/sec
经过这样的测试,RAM磁盘可以被删除
sudo rmmod brd
为了比较,对硬盘进行测试。 在这种情况下,升级的Travelstar 0J42251 / dev / sda3已经完全分区为LVM2物理分区(sda1 = / boot / efi @ 256MiB,sda2 = / boot @ 512 MiB):
(Sidenote - 虽然SATA 3 6GB / s驱动器,由于不明原因,宏碁发布了一个BIOS更新,将主板限制在SATA 2,尽管芯片组指定了SATA 3功能)
sudo hdparm -t /dev/sda3
/dev/sda3: Timing buffered disk reads: 302 MB in 3.00 seconds = 100.51 MB/sec
在创建RAID 1镜像时,我们试图将Fedora(OS)的加密吞吐量从100.51 MB /秒 (HDD速度)推送到1260 Mib / 〜1321 MB / s,从而将加密瓶颈放在CPU上。
3.LVM或创建PV,VG和LG
3A。 物理量(pv)
我不完全确定为什么Fedora不再维护一个LVM GUI。 鉴于底层LVM的一些增加的复杂性,我确实了解如何在利用LVM的一些高级功能(即RAID 1创建时)GUI下降很短。
我选择了以下分区方案:sda1 / boot / efi 256 MiB,sda2 / boot 512 MiB,sda3 LVM2所有剩余空间(〜930.76 MiB)
pvcreate /dev/sda3
3B。 卷组(vg)
接下来我创建了卷组。 Fedora(anaconda)将其vg命名为Fedora_ [Hostname]。 我的主机名是gintonbo(银蜻蜓的日语):
vgcreate fedora_gintonbo /dev/sda3
3C。 逻辑卷
系统中的其余分区(/,/ opt,/ var,与/ home不同的命令):
lvcreate -L 16G -n lv_root fedora_gintonbo
lvcreate -L 16G -n lv_swap fedora_gintonbo
lvcreate -L 16G -n lv_opt fedora_gintonbo
lvcreate -L 16G -n lv_var fedora_gintonbo
剩下足够的空间,我使用了90%的空间为lv_home:
lvcreate -l 90%FREE -n lv_home fedora_gintonbo
从Cryptsetup FAQ 2.19“如何擦除加密等级随机的设备?” 接下来预驱动驱动器。 *警告*是的,这将需要一段时间,有一个饮料或两个选择方便这一步:
cryptsetup open --type plain -d /dev/urandom /dev/fedora_gintonbo/lv_root to_be_wiped
cat /dev/zero > /dev/mapper/to_be_wiped
cryptsetup close /dev/fedora_gintonbo/lv_root
重复剩余的逻辑卷创建,最好保存/ dev / fedora_ [hostname] / lv_home最后,因为它将需要最长的!
3D。 RAM磁盘范围
在等待cryptsetup完成或在完成使用加密随机填充分区时,请创建用于RAID的RAM磁盘。 内核模块brd使用K,所以1048576K = 1GiB ,因此时间10(10GiB)= 10485760 。 但是,之前创建的lv_root分区是16GiB。 我们将在下一步中删除该分区,并将其降低到10GiB,然而,对于10的幂与2的幂的数学变得模糊非常快。 更好地超越你的lv_root并缩小它,而不是试图猜测你需要多少RAM。
内核模块brd创建了Ram Drive,这次是10GB:
sudo modprobe brd rd_nr=1 rd_size-10485760 max_part=0
用Ram磁盘创建一个pv:
pvcreate /dev/ram0
创建一个临时VG来获取/ dev / ram0的总扩展数据
vgcreate testvg
接下来使用100%的RAM驱动器创建一个逻辑卷:
lvcreate 100%FREE -n lv_test testvg
现在我们来看看驱动器上有多少个*盘点*
vgs -o +vg_free_count,vg_extent_count
在RAM磁盘上,这个总数达到了2559个。
我们现在可以删除LV
lvremove /dev/testvg/lv_test
然后删除VG
vgremove testvg
接下来删除PV
pvremove /dev/ram0
最后卸载RAM磁盘
sudo rmmod brd
请注意,LVM不期望RAM磁盘是PV,并且对于无法找到PV(think powerloss)非常敏感。 始终干净地关闭您的RAM磁盘,由于RAM擦除无法启动,将不会有趣。 你被警告了。
3E。 lv_root通过范围删除和重新创建
从上面我们想出了2559个盘区,现在我们将把硬盘尺寸与之对应。 以与上述相似的方式,删除lv_root:
lvremove /dev/fedora_[hostname]/lv_root
然后重新创建它,指定范围,而不是MB:
lvcreate -l2559 -n lv_root fedora_[hostname]
LUKS AES加密和Ext4文件系统
此时,系统上应该有五(5)个LV,lv_root〜10GiB,lv_opt 16GiB,lv_var 16 Gib,lv_swap 16 Gib和lv_home〜768GiB。
在cryptsetup基准测试中,使用256位密钥时,aes-xts-plain具有最高的吞吐量。 另外,而不是SHA1,我们将使用SHA512,并在哈希迭代中指定花费5秒(-i 5000)。 通过映射程序安装时,Fedora在/ dev / mapper / luks- [UUID]上挂载LUKS加密分区。 然而,当我们通过映射器手动安装分区时,我们需要使用cryptsetup luksUUID [dev]来获取UUID。
对于五个LV中的每一个,您将重复以下步骤。 我将说明其中两个,以显示什么变化:
cryptsetup luksFormat -y -c aes-xts-plain -s 256 -h SHA512 -i 5000 --use-urandom /dev/mapper/fedora_gintonbo-lv_root
cryptsetup luksUUID /dev/mapper/fedora_gintonbo-lv_root
cryptsetup luksOpen /dev/mapper/fedora_gintonbo-lv_root luks-[UUID]
mkfs.ext4 -m1 -L gintonbo-root /dev/mapper/luks-[UUID]
lv_home
cryptsetup luksFormat -y -c aes-xts-plain -s 256 -h SHA512 -i 5000 --use-urandom /dev/mapper/fedora_gintonbo-lv_home
cryptsetup luksUUID /dev/mapper/fedora_gintonbo-lv_home
cryptsetup luksOpen /dev/mapper/fedora_gintonbo-lv_home luks-[UUID]
mkfs.ext4 -m1 -L gintonbo-home /dev/mapper/luks-[UUID]
再次,因为我有一个新的硬盘,我会把LVMs,LUKS和EXT4分支机构转向一个新的Fedora安装。 用这种方式分区系统也可以与Anaconda工作无关,只需解锁驱动器即可。
5. RAM磁盘和(LVM)RAID 1
将根分区与RAM磁盘匹配的大小一直是这项努力中最难的部分。 在最后一步中安装分区后,我将通过带有MATE的网络安装来安装Fedora 20。 因为根分区已经通过扩展大小(2559 =〜10GiB)表示,所以RAM磁盘作为RAID组件变得简单易行。
5A。 要创建RAM磁盘并将其添加到LVM RAID 1中:
sudo modprobe brd rd_nr=1 rd_size=10485760 max_part=0
sudo pvcreate /dev/ram0
sudo vgextend fedora_gintonbo /dev/ram0
(Optionally display your LVs at this point) sudo lvs -a -o name,copy_percent,devices fedora_gintonbo
sudo lvconvert --type raid1 -m1 fedora_gintonbo/lv_root
观看镜面建筑的百分比
sudo lvs -a -o name,copy_percent,devices fedora_gintonbo
最后,将HDD更改为writemostly,因此读取从RAM磁盘发生:
sudo lvchange --writemostly /dev/sda3:y fedora_gintonbo/lv_root
5B。 要从LVM RAID 1中删除RAM磁盘(系统powerloss事件之前!)
sudo lvchange --writemostly /dev/sda3:n fedora_gintonbo/lv_root
sudo lvconvert -m0 fedora_gintonbo/lv_root /dev/ram0
sudo vgreduce fedora_gintonbo /dev/ram0
sudo rmmod /dev/ram0
6. Systemd单元文件
作为整理,系统管理RAM磁盘和RAID 1创建/删除。 我们将创建一个名为2Ro2L(LVM和LUKS上的RAMdisk RAID)和两个脚本的系统单元:
sudo pluma /lib/systemd/system/2Ro2L.service
[Unit] Description=Enable RAMdisk RAID 1 on LVM & LUKS After=multi-user.target [Service] RemainAfterExit=yes ExecStart=/usr/sbin/2Ro2Lstart ExecStop=/usr/sbin/2Ro2Lstop Type=oneshot [Install] WantedBy=multi-user.target
sudo chmod 644 /lib/systemd/system/2RoRL.service
然后创建启动和停止脚本:
sudo pluma /usr/sbin/2Ro2Lstart
#!/bin/sh # create the RAM disk modprobe brd rd_nr=1 rd_size=10485760 max_part=0 # create an LVM Physical Volume on created RAMdisk: pvcreate /dev/ram0 # Extend Volume Group to include above pv vgextend fedora_gintonbo /dev/ram0 # Convert the Logical Volume to a RAID 1 configuration lvconvert --type raid1 -m1 fedora_gintonbo/lv_root # Change the Logical Volume RAID properties lvchange --writemostly /dev/sda3:y fedora_gintonbo/lv_root
sudo pluma /usr/sbin/2Ro2Lstop
#!/bin/sh # Remove Logical Volume RAID properties lvchange --writemostly /dev/sda3:n fedora_gintonbo/lv_root # Remove the RAMdisk from the RAID lvconvert -m0 fedora_gintonbo/lv_root /dev/ram0 # Remove the RAMdisk from the Volume Group vgreduce fedora_gintonbo /dev/ram0 # Remove the RAMdisk altogether rmmod brd
sudo chmod 755 /usr/sbin/2Ro2Ls*
启动服务,停止服务,如果一切顺利,启用多用户目标服务
sudo systemctl start 2Ro2L.service
sudo systemctl stop 2Ro2L.service
如果那些运行没有错误,比启用服务:
sudo systemctl enable 2Ro2L.service特别感谢 Sergey Davidoff , FedoraZram为systemd的单位信息!