Gentoo

initramfs 中 squashfs 分區的可預測分區名稱

  • March 28, 2017

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 腳本中替換為

  1. /dev/disk/by-id/usb*part2,它已經在 GRUB2 菜單中起作用,但在 initramfs 腳本中不起作用,因為/dev/disk此時不存在(順便問一下,為什麼它存在於 GRUB 中?)
  2. $(findfs PARTUUID="partid-of-usb-squashfs-root"), 沒用
  3. $(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 密鑰上,它可以具有將其標記為可移動設備的東西;在硬碟驅動器上,它可以有一些將其標記為真實安裝的東西。

引用自:https://unix.stackexchange.com/questions/297690