当我的 fstab 中有 Thunderbolt 外部 SSD 时,我的系统无法启动。
我认为也许 systemd 正在尝试在 boltd 运行之前安装驱动器,但我不确定如何验证这是问题所在,或者如果确实是问题所在,如何纠正。
我有一台 2018 Mac Mini(英特尔),并且在上面安装了 Ubuntu 22.04。
该盒子只有 128 GB 内部空间,因此我购买了一个 1TB 外部 SSD,即 SanDisk PRO-G40。
这是雷电设备,所以我执行了“boltctl”命令,该命令显示了设备的 UUID,然后执行了“boltctl authorize”。这在重启后不会持续存在,所以我执行了“boltctl enroll”来解决这个问题。
$ boltctl
● SanDisk Professional PRO-G40
├─ type: peripheral
├─ name: PRO-G40
├─ vendor: SanDisk Professional
├─ uuid: cc030000-0062-6c0e-8342-bf90cef33103
├─ generation: Thunderbolt 3
├─ status: authorized
│ ├─ domain: c7010000-0062-640e-03fc-9a92ccf13003
│ ├─ rx speed: 40 Gb/s = 2 lanes * 20 Gb/s
│ ├─ tx speed: 40 Gb/s = 2 lanes * 20 Gb/s
│ └─ authflags: none
├─ authorized: Sun 20 Aug 2023 02:02:26 AM UTC
├─ connected: Sun 20 Aug 2023 02:02:23 AM UTC
└─ stored: Fri 18 Aug 2023 09:14:53 PM UTC
├─ policy: auto
└─ key: no
SSD 带有两个分区,一个 200M EFI 分区和一个 930G APFS 分区。我保留了 EFI 分区并删除了 APFS 分区,并在其位置添加了一个 ext4 分区。现在我的 lsblk 如下所示:
$ lsblk -o NAME,LABEL,FSTYPE,SIZE,UUID,MOUNTPOINTS
NAME LABEL FSTYPE SIZE UUID MOUNTPOINTS
loop0 squashfs 4K /snap/bare/5
loop1 squashfs 63.4M /snap/core20/1974
loop2 squashfs 63.5M /snap/core20/2015
loop3 squashfs 73.9M /snap/core22/858
loop4 squashfs 237.2M /snap/firefox/2987
loop5 squashfs 237.2M /snap/firefox/3026
loop6 squashfs 349.7M /snap/gnome-3-38-2004/143
loop7 squashfs 485.5M /snap/gnome-42-2204/120
loop8 squashfs 485.5M /snap/gnome-42-2204/126
loop9 squashfs 91.7M /snap/gtk-common-themes/1535
loop10 squashfs 12.3M /snap/snap-store/959
loop11 squashfs 53.3M /snap/snapd/19457
loop12 squashfs 452K /snap/snapd-desktop-integration/83
nvme0n1 113G
├─nvme0n1p1 EFI vfat 300M 5F66-17ED /boot/efi
├─nvme0n1p2 apfs 33.5G 416419fe-742b-4653-b709-42e0ff78f4ec
├─nvme0n1p3 swap 4.7G f7bac42d-0730-40da-be0d-f6de7f4788f2 [SWAP]
├─nvme0n1p4 vfat 954M 32B6-990F
└─nvme0n1p5 ext4 73.6G 2532f568-b33b-4583-abd6-2f6e41bb8e28 /
nvme1n1 931.5G
├─nvme1n1p1 EFI vfat 200M 67E3-17ED
└─nvme1n1p2 ext4 931.3G cb9940d0-5b0b-4273-97d7-b4dd29768926
最后,我将我的驱动器添加到 /etc/fstab(最后一行):
# / was on /dev/nvme0n1p5 during installation
UUID=2532f568-b33b-4583-abd6-2f6e41bb8e28 / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=5F66-17ED /boot/efi vfat umask=0077 0 1
# swap was on /dev/nvme0n1p3 during installation
UUID=f7bac42d-0730-40da-be0d-f6de7f4788f2 none swap sw 0 0
# external SSD mounted to /opt
UUID=cb9940d0-5b0b-4273-97d7-b4dd29768926 /opt ext4 rw,relatime 0 2
然后我做了一个“mount -a”,轰的一声,胜利了!
$ mount | grep opt
/dev/nvme1n1p2 on /opt type ext4 (rw,relatime)
$ df -h /opt
Filesystem Size Used Avail Use% Mounted on
/dev/nvme1n1p2 916G 28K 870G 1% /opt
除了...重新启动时,系统无法启动!
[ TIME ] Timed out waiting for device /dev/disk/by-uuid/cb9940d0-5b0b-4273-97d7-b4dd29768926.
[DEPEND] Dependency failed for /opt.
[DEPEND] Dependency failed for Local File Systems.
[DEPEND] Dependency failed for File System Check on /dev/disk/by-uuid/cb9940d0-5b0b-4273-97d7-b4dd29768926.
然后:
[FAILED] Failed to start Set Up Additional Binary Formats.
See 'systemctl status systemd-binfmt.service' for details.
我得到了一个进入维护模式的选项。在那里,我执行了 lsblk,但我没有看到外部驱动器(只有内部驱动器)。
我尝试运行 boltctl 命令,但系统挂起了;我不得不重新启动。
正如我一开始所说的,我认为当 systemd 尝试安装驱动器时,boltd 可能没有运行。我没有太多证据证明这一点。任何帮助都值得感激。
-- 迈克
编辑1:我发现一篇文章关于 VirtualBox 共享文件夹的类似问题。
编辑2:我了解到boltd 由 systemd/udev 启动,因此我尝试修改 /etc/fstab 条目,使其看起来像这样:
UUID=cb9940d0-5b0b-4273-97d7-b4dd29768926 /opt ext4 x-systemd.requires=systemd-udevd.service,rw,relatime 0 2
我希望这会让这个挂载单元在启动之前依赖于 udev(因此也依赖于 boltd)。不幸的是,这并没有改变我所看到的任何内容。我也尝试了 x-systemd.after,但没有成功。
编辑3:为了清楚起见,我的问题是“如何在启动时安装外部雷电 SSD?”
答案1
胜利了!我有一个解决方案和一个变通方法。
解决方法:
本文启发我从我的 fstab 中删除挂载,并将挂载命令添加到我的 /etc/rc.local。
mount -t ext4 -o rw,noatime -U cb9940d0-5b0b-4273-97d7-b4dd29768926 /opt
这可以完成工作,但这不是一个好的解决方案,因为在启动期间驱动器的内容不能被任何东西使用。
例如,如果我将我的 docker 镜像放在外部分区上,我假设 docker 将在 rc.local 之前启动,尝试在我的外部驱动器上找到自动启动镜像并失败。
解决方案:
我创建了一个单元挂载文件/etc/systemd/system/opt.mount
:
# External thunderbolt SSD. Thunderbolt drives require the boltd daemon which is launched by udev.
[Unit]
After=systemd-udevd.service
Requires=systemd-fsck@dev-disk-by\x2duuid-cb9940d0\x2d5b0b\x2d4273\x2d97d7\x2db4dd29768926.service
Requires=systemd-udevd.service
After=systemd-fsck@dev-disk-by\x2duuid-cb9940d0\x2d5b0b\x2d4273\x2d97d7\x2db4dd29768926.service
After=blockdev@dev-disk-by\x2duuid-cb9940d0\x2d5b0b\x2d4273\x2d97d7\x2db4dd29768926.target
[Mount]
Where=/opt
What=/dev/disk/by-uuid/cb9940d0-5b0b-4273-97d7-b4dd29768926
Type=ext4
Options=rw,relatime,nofail
[Install]
WantedBy=multi-user.target
我相信这Requires=systemd-udevd.service
行是骗局。我不知道为什么x-systemd.requires
fstab 中的选项不起作用。
需要使用以下命令启用该单元文件:
sudo systemctl enable opt.mount
现在,当我重新启动时,我的雷电 SSD 已经安装好了!