initramfs 中 squashfs 分區的可預測分區名稱
TL;DR:如何從具有可預測分區名稱的 initramfs 引導 squashfs 分區?
/dev/sda2
將無法工作,因為設備名稱會隨機重新排序,有時它會從錯誤的分區啟動。我們使用一個自定義安裝的 Gentoo,如下所示:
/dev/sda1: /boot ext4 (unencrypted) /dev/sda2: / squashfs (unencrypted) /dev/sda3: /home ext4 (dm-crypt) /dev/sda4: - swap
我們製作了一個自定義的 initramfs 腳本,將根分區和一個 tmpfs 作為覆蓋文件系統掛載在它之上。我們使用了本指南,它看起來像這樣:
#!/bin/busybox sh mount -t proc none /proc mount -t sysfs none /sys # Mount the root filesystem. mount -t squashfs -o ro /dev/sda2 /mnt/overlay # (some stuff to set up the overlay with tmpfs is done here) # Clean up. umount /proc umount /sys # Boot the real thing. exec switch_root /mnt/overlay /sbin/init
只要這是系統上唯一的磁碟,它就會正常啟動並且一切正常,因為
/dev/sda2
它始終是只有一個磁碟的系統中的根分區。我們正在開發一個自動更新系統,因為這種定制安裝將運送到其他城市,理想情況下,我們的客戶應該能夠通過簡單地插入 U 盤並等待更新完成來更新他們的系統。不能通過 Internet 進行更新。確保我們的數據安全是重中之重,我們相信我們選擇的分區方案對於我們的需求來說是足夠安全的,儘管如果這意味著解決我們的問題,我們願意接受新的想法:
USB 記憶棒更新系統是原始 Gentoo 安裝的副本,並使用完全相同的分區方案。但是,USB 記憶棒中的 initramfs 腳本會混淆,通常會選擇原始安裝的根目錄,而不是 USB 更新程序的根目錄。顯然,更新程序(位於 U 盤的根目錄)永遠不會像這樣執行。
我們嘗試
/dev/sda2
在 U 盤的 initramfs 腳本中替換為
/dev/disk/by-id/usb*part2
,它已經在 GRUB2 菜單中起作用,但在 initramfs 腳本中不起作用,因為/dev/disk
此時不存在(順便問一下,為什麼它存在於 GRUB 中?)$(findfs PARTUUID="partid-of-usb-squashfs-root")
, 沒用$(findfs UUID="x")
,如果 squashfs 分區具有文件系統 UUID,這將起作用(這適用於 ext4 和其他文件系統)該指南建議在初始化時使用 devtmpfs 或 mdev 進行填充
/dev
,但我們不知道這有什麼幫助,因為這/dev/disk
似乎是 udev 的工作,並且devtmpfs
從 initramfs 腳本開始似乎沒有幫助。當根分區沒有文件系統 UUID 時,我們如何在 initramfs 腳本中獲得可預測/持久的分區名稱?
更改我們的分區方案有點困難,我們不希望我們的 squashfs root 或我們的 /home 分區對普通 Windows 使用者可見,但如果有其他東西可以讓我們可靠地啟動,我們會嘗試做一些事情每次都來自同一個分區,比如 LVM 或其他我們沒有想到的東西。
無需為此依賴任何特殊工具。
知道 squashfs 分區在分區方案中始終排在第二位就足夠了:只需設置 pendrive 的第一個分區的 UUID,使用
$(findfs UUID=first-pendrive-partition)
並sed s/1/2/
在結果上執行。系統現在總是檢測到正確的分區。
在這種情況下,LVM 是一個候選者,但會增加 bootloader/initramfs 的複雜性。
你能保證只有一個
squashfs
文件系統作為塊設備存在嗎?如果是這樣,那麼您可以使用它findfs TYPE=squashfs
來找到正確的根文件系統。但是,您注意到您的 USB 密鑰幾乎完全相同,因此還包含一個
squashfs
文件系統。因此,您需要開始尋找放置追踪資訊的替代位置。你的/boot
音量看起來不錯;在 USB 密鑰上,它可以具有將其標記為可移動設備的東西;在硬碟驅動器上,它可以有一些將其標記為真實安裝的東西。