dm-integrity 獨立映射器設備在重新啟動後失去
我目前嘗試使用 dm-integrity 在獨立模式下執行。為此,我在虛擬機 VM 中安裝了一個普通的 ubuntu 伺服器 20.04。
在接下來的步驟中,我創建 dm-integrity 設備、一個 ext4 文件系統並掛載它:
integritysetup format /dev/sdb integritysetup open /dev/sdb hdd-int mkfs.ext4 /dev/mapper/hdd-int mkdir /data mount /dev/mapper/hdd-int /data echo "/dev/mapper/hdd-int /data ext4 defaults 0 0" >> /etc/fstab
**注意:**為簡化起見,我使用
/dev/sdb
而不是/dev/disk/by-id/<ID>
.現在我重新啟動,發現設備 /dev/mapper/hdd-int 不存在,因此掛載
/data
失敗。現在我的問題:如何永久保存 dm-integrity 設備的資訊,以便重啟後的掛載已經存在?應該在
/etc/fstab
? 還是有其他配置文件?
**免責聲明:**這無論如何都不是標準實現,也沒有在實踐中經過實戰測試。它可能隨時破裂。使用風險自負。做好備份!!!
因此,除了我的理論答案之外,這裡是全新 Ubuntu 20.04 桌面安裝中獨立 DM-Integrity 的範例實現。第 1-4 步是設置和安裝過程,第 5-8 步是自定義 udev 規則和掛鉤。
原料:
- 使用 GPT 分區方案的驅動器(用於提供
PARTLABEL
,因為完整性缺少 UUID)- 一個或多個使用 DM-Integrity 的分區,由
integrity-somename
標籤標識。- 自定義 udev 規則為每個標記的分區設置 DM-Integrity
- 自定義 initramfs 掛鉤以包含
integritysetup
二進製文件以及用於早期設置的 udev 規則分步實施:
1.創建分區
這裡的關鍵點是每個完整性分區都有一個分區標籤,在本例中為 one
integrity-root
和 oneintegrity-home
,分別用於根分區/
和/home
分區。# parted /dev/vda GNU Parted 3.3 Using /dev/vda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) unit mib (parted) mklabel gpt (parted) disk_set pmbr_boot on (parted) mkpart grub 1MiB 2MiB (parted) set 1 bios_grub on (parted) mkpart boot 2MiB 1024MiB (parted) set 2 lvm on (parted) mkpart integrity-root 1024MiB 10240MiB (parted) set 3 lvm on (parted) mkpart integrity-home 10240MiB 100% (parted) set 4 lvm on (parted) print free Model: Virtio Block Device (virtblk) Disk /dev/vda: 19456MiB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: pmbr_boot Number Start End Size File system Name Flags 0.02MiB 1.00MiB 0.98MiB Free Space 1 1.00MiB 2.00MiB 1.00MiB grub bios_grub 2 2.00MiB 1024MiB 1022MiB boot lvm 3 1024MiB 10240MiB 9216MiB integrity-root lvm 4 10240MiB 19455MiB 9215MiB integrity-home lvm 19455MiB 19456MiB 0.98MiB Free Space (parted) Information: You may need to update /etc/fstab.
驗證分區是否出現在
/dev/disk/by-partlabel
相應的下方:# ls -l /dev/disk/by-partlabel total 0 lrwxrwxrwx 1 root root 10 May 2 17:52 boot -> ../../vda2 lrwxrwxrwx 1 root root 10 May 2 17:52 grub -> ../../vda1 lrwxrwxrwx 1 root root 10 May 2 17:52 integrity-home -> ../../vda4 lrwxrwxrwx 1 root root 10 May 2 17:52 integrity-root -> ../../vda3
2. 建立誠信
設置好分區後,您實際上必須將它們變成完整性設備。
# integritysetup format /dev/disk/by-partlabel/integrity-root WARNING! ======== This will overwrite data on /dev/disk/by-partlabel/integrity-root irrevocably. Are you sure? (Type uppercase yes): YES Formatted with tag size 4, internal integrity crc32c. Wiping device to initialize integrity checksum. You can interrupt this by pressing CTRL+c (rest of not wiped device will contain invalid checksum). Finished, time 01:14.903, 9081 MiB written, speed 121.2 MiB/s # integritysetup open /dev/disk/by-partlabel/integrity-root integrity-root
對 重複相同的操作
/dev/disk/by-partlabel/integrity-home
,然後驗證它是否存在於/dev/mapper
:# ls -l /dev/mapper total 0 crw------- 1 root root 10, 236 May 2 2020 control lrwxrwxrwx 1 root root 7 May 2 18:07 integrity-home -> ../dm-1 lrwxrwxrwx 1 root root 7 May 2 18:07 integrity-root -> ../dm-0
請注意,此命名方案在技術上與 LVM 衝突,因此您不應將
integrity
其用作 VG 名稱。3. 文件系統、RAID 或 LVM
有了完整性,您還必須創建一個文件系統。否則,Ubuntu 安裝程序不知道如何處理這個神秘設備,而是嘗試在其上創建一個分區表。
# mkfs.ext4 /dev/mapper/integrity-root # mkfs.ext4 /dev/mapper/integrity-home
所以這就是你將文件系統放在完整性設備上的地方。
或者,您可以在此處使用 RAID 或 LVM。我想你也可以使用 LUKS,但是當 LUKS2 已經內置了對 Integrity 的支持時,你為什麼要這樣做呢?如果您在這裡選擇 LUKS,那麼您很可能是按照錯誤的教程進行操作。
4. 安裝 Ubuntu
Ubuntu 桌面安裝程序在技術上根本不支持完整性,但是由於您手動設置文件系統,因此無論如何它都允許您使用它們。如果沒有以下進一步的步驟,它將無法啟動。
- 在“安裝類型”對話框中,選擇“其他”(用於手動分區)
- “更改”
integrity-root
到掛載點/
- “更改”
integrity-home
到掛載點/home
不要忘記您的引導程序!(不可能使用完整性設備)
- “更改”
/dev/vda1
為“保留的 BIOS 引導區”- “更改”
/dev/vda2
到掛載點/boot
- 保留其他分區(不要格式化完整性設備)
請注意,這對於 UEFI 安全啟動設置將完全不同。為簡單起見,此範例使用良好的舊式 bios grub 引導。
最後它應該是這樣的:
點擊“立即安裝”。
如果繼續,下面列出的更改將寫入磁碟。否則,您將能夠手動進行進一步的更改。
警告:這將破壞您已刪除的任何分區以及將要格式化的分區上的所有數據。
以下設備的分區表已更改:
Virtual disk 1 (vda)
以下分區將被格式化:
LVM VG integrity, LV home as ext4 LVM VG integrity, LV root as ext4 partition #2 of Virtual disk 1 (vda) as ext2
由於我們基本上是在欺騙安裝程序使用完整性設備作為目標,因此它錯誤地假定了 LVM VG-LV 星座。忽略它並繼續。
但是,不要重新啟動。暫時還不行。
lsblk
在安裝執行時,您可以通過在終端中執行來驗證它是否順利進行:# lsblk vda 252:0 0 19G 0 disk ├─vda1 252:1 0 1M 0 part ├─vda2 252:2 0 1022M 0 part /target/boot ├─vda3 252:3 0 9G 0 part │ └─integrity-root 253:0 0 8.9G 0 crypt /target └─vda4 252:4 0 9G 0 part └─integrity-home 253:1 0 8.9G 0 crypt /target/home
甚至
lsblk
還不支持完整性設備,它錯誤地假設它們是加密設備。/target
無論如何,如果誠信根是,誠信之家是/target/home
並且/dev/vda2
是,一切都會去正確的地方/target/boot
。安裝完成後,選擇“繼續測試”而不是“立即重啟”。
5. Chroot & 安裝完整性設置
要使 Ubuntu 真正支持安裝獨立完整性分區,您必須 chroot 進入全新安裝並設置自定義 udev 規則和 initramfs 掛鉤。
# mount /dev/mapper/integrity-root /target # mount /dev/mapper/integrity-home /target/home # mount /dev/vda2 /target/boot # mount --bind /dev /target/dev # mount --bind /proc /target/proc # mount --bind /run /target/run # mount --bind /sys /target/sys # chroot /target
現在,
integritysetup
可能還沒有安裝。如果您使用 RAID 或 LVM,這也是您必須確保的地方mdadm
,lvm
並且其他的也已安裝。# apt-get install cryptsetup
6.自定義udev規則
自定義 udev 規則進入
/etc/udev/rules.d
. 作為參考,創建/dev/disk/by-partlabel/
連結的標準規則如下所示:ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
所以我們的自定義規則可能如下所示:
ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="integrity-?*", RUN+="/usr/sbin/integritysetup open $env{DEVNAME} $env{ID_PART_ENTRY_NAME}"
將其另存為
/etc/udev/rules.d/99-integrity.rules
.這應該使 udev 為具有
integrity-xyz
分區標籤的每個分區打開完整性設置。請注意,這些名稱在系統範圍內必須是唯一的,因此在 RAID 設置中,每個驅動器需要使用不同的分區標籤。7. 自定義 initramfs 鉤子(特定於 Ubuntu)
如果 root本身不在 Integrity 上,則 udev 規則本身可能已經正常工作。
/
標準的initramfs應該掛載一個非完整性的 rootfs,此時整個系統將接管處理其他所有事情。但是對於 Integrity 上的 rootfs 本身,我們需要initramfs為我們設置它,否則它將無法掛載 rootfs,並且引導失敗。這意味著添加
integritysetup
二進製文件以及 udev 規則本身。使用 Ubuntu 的 initramfs-tools,這可以通過創建自定義鉤子腳本來實現:
#!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions # Begin real processing below this line force_load dm_integrity copy_exec /usr/sbin/integritysetup /usr/sbin copy_file text /etc/udev/rules.d/99-integrity.rules
將其另存為
/etc/initramfs-tools/hooks/integrity
.8.更新initramfs
與對 initramfs 配置的所有更改一樣,您必須重新建構 initramfs 才能生效:
# update-initramfs -u -k all update-initramfs: Generating /boot/initrd.img-5.4.0-28-generic cryptsetup: WARNING: target 'integrity-root' not found in /etc/crypttab update-initramfs: Generating /boot/initrd.img-5.4.0-26-generic cryptsetup: WARNING: target 'integrity-root' not found in /etc/crypttab
不幸的是,Ubuntu 的預設 cryptsetup 鉤子被混淆了,並且將完整性設備誤認為是 cryptsetup 的。值得慶幸的是,警告是無害的,可以忽略。
9.重啟
如果一切順利,從 Live CD 重新啟動到已安裝的系統後,終端中
lsblk
應該會像這樣向您致意:integrity@ubuntu $ lsblk vda 252:0 0 19G 0 disk ├─vda1 252:1 0 1M 0 part ├─vda2 252:2 0 1022M 0 part /boot ├─vda3 252:3 0 9G 0 part │ └─integrity-root 253:0 0 8,9G 0 crypt / └─vda4 252:4 0 9G 0 part └─integrity-home 253:1 0 8,9G 0 crypt /home
由於
lsblk
錯誤地將它們辨識為crypt
設備,請檢查dmsetup table
它們是否實際上是integrity
設備:integrity@ubuntu:~$ sudo dmsetup table [sudo] password for integrity: integrity-root: 0 18598008 integrity 252:3 0 4 J 6 journal_sectors:130944 interleave_sectors:32768 buffer_sectors:128 journal_watermark:50 commit_time:10000 internal_hash:crc32c integrity-home: 0 18595960 integrity 252:4 0 4 J 6 journal_sectors:130944 interleave_sectors:32768 buffer_sectors:128 journal_watermark:50 commit_time:10000 internal_hash:crc32c
到那時,你就完成了。享受具有獨立完整性的新 Linux 系統!
(無論如何,直到它破裂。使用風險自負,進行備份!!!)