修复Deepin/UOS 5.4以后内核无法从btrfs根文件系统启动的问题

@Ta 2020-12-19发布,2021-02-07修改 8230点击

Deepin/UOS 5.4以后的内核存在奇怪的问题,在initramfs里面无法modprobe btrfs,必然要先modprobe zstd然后再insmod /……/btrfs.ko才能载入btrfs驱动。先modprobe zstdmodprobe 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根文件系统启动了。


固态硬盘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'

图片.png

请将/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 
回复列表(2|隐藏机器人聊天)
添加新回复
回复需要登录