Deepin/UOS 5.4以后的内核存在奇怪的问题,在initramfs里面无法modprobe btrfs
,必然要先modprobe zstd
然后再insmod /……/btrfs.ko
才能载入btrfs驱动。先modprobe zstd
后modprobe btrfs
也无法载入btrfs驱动,不知道为什么。所以如果你的根文件系统是btrfs,升级到这些内核之后就无法正常启动了,开机会停留在initramfs
控制台。
下面提供一个解决该问题的方法。
先从其他内核启动(或者从其他Linux系统启动,然后挂载Deepin/UOS分区,再chroot),然后执行:
sudo dedit /etc/initramfs-tools/scripts/init-premount/0000-insmod-btrfs
把以下内容粘贴进去:
#!/bin/sh
if [ "$1" = "prereqs" ]; then
echo ""
exit 0
fi
modprobe zstd_compress
modprobe zstd
insmod /lib/modules/$(uname -r)/kernel/fs/btrfs/btrfs.ko
exit 0
保存,然后执行:
sudo chmod +x /etc/initramfs-tools/scripts/init-premount/0000-insmod-btrfs
sudo update-initramfs -k all -u
这样就可以让Deepin/UOS 5.4以后的内核从btrfs根文件系统启动了。
如果你是固态硬盘,并且内核版本大于等于5.6,建议在/etc/fstab
中使用以下btrfs挂载参数:
rw,relatime,ssd,space_cache,discard=async
完整的/etc/fstab
示例(请不要抄我的UUID
,否则你的系统会无法启动!每个人的UUID
都不同!)
# /dev/nvme1n1p2
UUID=fb5899d8-57a4-4476-9f22-1c4f7e364d81 / btrfs rw,relatime,ssd,space_cache,discard=async 0 0
# /dev/nvme1n1p1 LABEL=EFI\040System\040Partition
UUID=2A5B-83D2 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2
但是如果内核版本低于5.6,就不应该在/etc/fstab
中使用discard=async
挂载参数,否则会遇到这样的错误:
unrecognized mount option 'discard=async'
请将/etc/fstab
中的discard=async
改成discard
,但是这样一来,在某些硬盘上发生discard
操作时可能会轻微卡顿。
所以如果没有必要,不建议使用低于5.6的内核。如果你目前是5.4内核,可以考虑安装5.7内核以获得更好的btrfs性能:
sudo apt install linux-headers-5.7.7-deepin-amd64 linux-image-5.7.7-deepin-amd64
老虎应该去统信上班