1. 重新生成 initramfs
在默认情况下,Raspberry Pi OS 的 btrfs 是支持是作为 kernel modules 存在的,需要重新生成对应的 initramfs 使内核能够挂载 btrfs 文件系统.
1 | 安装相应依赖 |
向 /etc/initramfs-tools/modules
中添加相应的 kernel modules :
1 | sudo vi /etc/initramfs-tools/modules |
保存后,使用 mkinitramfs -o /boot/initramfs-btrfs.gz
生成新的 initramfs.
之后,修改 /boot/config.txt
加载新的 initramfs.
1 | sudo vi /boot/config.txt |
重启设备,确认新的 initramfs 正常被加载.
2. 将 ext4 rootfs 转换成 btrfs 格式
在 linux 下,将装有系统的 SD卡 / 硬盘链接电脑,通过 btrfs-convert
将 rootfs 转换成 btrfs 格式,以我的硬盘为例:
注: /dev/sdb2 为 rootfs 分区,下文以它为例
1 | 如果是SD卡,将 /dev/sda 替换成对应设备 |
使用
fsck.ext4 /dev/sdb2
确认分区正常使用
btrfs-convert /dev/sdb2
将 ext4 格式的 rootfs 转换为 btrfs 格式挂载转换完成的 btrfs rootfs
1
2
3
4
5
6挂载 rootfs 和 boot
sudo mkdir /tmp/rootfs
rootfs
sudo mount /dev/sdb2 /tmp/rootfs
boot
sudo mount /dev/sdb1 /tmp/rootfs/boot在 rootfs 下创建 swap 子卷,并禁用 btrfs 的 CoW,存放 swap 文件
1 | 在树莓派 rootfs 分区下创建 ./swap 子卷存放 swap 文件 |
3. 调整挂载和系统设置
编辑
/tmp/rootfs/etc/fstab
1
2
3
4
5编辑 /etc/fstab
将 / 的挂载条目的 ext4 改为 btrfs, 并且将最后的 0 1 改为 0 0, 禁用fsck
sudo vi /tmp/rootfs/etc/fstab
# e.g.
# PARTUUID=c469d4fc-02 / btrfs defaults,noatime 0 0编辑
/tmp/rootfs/boot/cmdline.txt
1
2
3
4编辑 /boot/cmdline.txt, 将 rootfstype=ext4 改为 rootfstype=btrfs fsck.repair=yes 改为 fsck.repair=no
sudo vi /tmp/rootfs/boot/cmdline.txt
e.g.
console=serial0,115200 console=tty1 root=PARTUUID=0ee3e8a8-02 rootfstype=btrfs fsck.repair=no rootwait回到树莓派,添加一段脚本,防止以后 kernel 升级后无法启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14参考 https://www.ephestione.it/booting-btrfs-root-partition-on-raspberri-pi/
sudo vi /etc/kernel/postinst.d/btrfs-update
#!/bin/bash
if [ "x$2" != "x/boot/kernel8.img" ]; then
exit 0
fi
echo ============ UPDATE INITRAMFS ==============
mkinitramfs -o /boot/initramfs-btrfs.gz
echo ============ UPDATE COMPLETED ==============
确保权限
sudo chmod 755 /etc/kernel/postinst.d/btrfs-update重启回到系统,重新生成 swapfile
1
2
3
4sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo dphys-swapfile install
sudo dphys-swapfile swapon