RAM驱动器和SATA HDD的混合RAID 1(镜像)在Fedora Linux上使用带有LUKS的LVM和[and systemd unit file]

介绍

欢迎精明的读者。

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 DavidoffFedoraZram为systemd的单位信息!
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏