Ext4 to Btrfs 转换手记
想了N久开头怎么写,最后决定不废话,直接进入正题!
Btrfs是Linux新推出的文件系统格式,关于它的介绍可以看这里,本文就不再多说了。
一、安装btrfs-tools:
sudo apt-get install btrfs-tools
二、准备:
首先确定你的内核版本在2.6.31以上,目前Ubuntu上2.6.35-25是比较新的内核版本,推荐使用,另外/boot必须是单独分区,因为grub暂时不支持btrfs,所以无法读取,这也就意味着/和/boot分在一个区的话,将不能对/进行转换。
然后要确定你的分区是不是都以UUID为识别方式挂载,因为转换为btrfs之后,分区的UUID会改变,所以如果使用UUID来挂载的话,会造成转换后无法挂载分区,特别是要转换系统分区的用户要注意。另外,Ubuntu默认的grub设置里也是用UUID来识别分区,这个我们都需要进行处理,步骤如下:
查看当前的文件系统:
mount
会看到类似下面的输出:
/dev/sdb6 on / type ext4 (rw) proc on /proc type proc (rw,noexec,nosuid,nodev) none on /sys type sysfs (rw,noexec,nosuid,nodev) fusectl on /sys/fs/fuse/connections type fusectl (rw) none on /sys/kernel/debug type debugfs (rw) none on /sys/kernel/security type securityfs (rw) none on /dev type devtmpfs (rw,mode=0755) none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) none on /dev/shm type tmpfs (rw,nosuid,nodev) none on /var/run type tmpfs (rw,nosuid,mode=0755) none on /var/lock type tmpfs (rw,noexec,nosuid,nodev) /dev/sdb2 on /boot type ext2 (rw) /dev/sdb8 on /usr type ext4 (rw) /dev/sdb7 on /home type ext4 (rw) /dev/sda6 on /media/DOC type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) /dev/sdb1 on /media/OFAN-Mobile_ type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) /dev/sda7 on /media/OTHER type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) /dev/sda5 on /media/PROG type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) /dev/sda1 on /media/Win7 type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev) gvfs-fuse-daemon on /home/ofan/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=ofan)
这里重点看ext4的部分:
/dev/sdb6 on / type ext4 (rw) /dev/sdb8 on /usr type ext4 (rw) /dev/sdb7 on /home type ext4 (rw) /dev/sdb2 on /boot type ext2 (rw)
这里需要记下哪个分区对应了哪个挂载点,另外你可能需要用笔记下/boot的设备路径,然后以root用户身份打开并编辑/etc/fstab,更改之前务必做好备份,这里用是vim:
sudo cp /etc/fstab{,.bak} sudo vim /etc/fstab
打开之后将挂载点的UUID部分全部替换为分区的设备路径,注意对应,因为/boot分区和其他非ext分区不需要转换,所以就不用改了:
proc /proc proc nodev,noexec,nosuid 0 0 /dev/sdb6 / btrfs defaults 0 1 UUID=4e968ab2-cbd8-446b-b4eb-4bbef87521ea /boot ext2 defaults 0 2 /dev/sdb7 /home btrfs rw 0 0 UUID=5EF043EBF043C84B /media/DOC ntfs-3g defaults,nosuid,nodev,locale=zh_CN.utf8 0 0 UUID=96F60915F608F771 /media/OFAN-Mobile_ ntfs-3g defaults,nosuid,nodev,locale=zh_CN.utf8 0 0 UUID=762E4A0E2E49C837 /media/OTHER ntfs-3g defaults,locale=zh_CN.utf8 0 0 UUID=406E3EBC6E3EAA94 /media/PROG ntfs-3g defaults,locale=zh_CN.utf8 0 0 UUID=DCA0F1B9A0F19A6A /media/Win7 ntfs-3g defaults,locale=zh_CN.utf8 0 0 /dev/sdb8 /usr btrfs defaults 0 2 UUID=06b702fc-87c6-4fa8-b9f1-2bcfd70667f8 none swap sw 0 0
不要急着重启,检查下btrfs-convert这个工具是否可用:
type btrfs-convert
记下返回的路径,一般为/sbin/btrfs-convert
重启,进入grub的菜单后按e编辑启动命令,在以'linux'开头的那一行,将内核参数,即‘root=UUID’之后的(包括‘root=UUID’)的都删掉,但不要删掉下一行,然后输入'initramfs',按下 Ctrl-X 开始引导。
不出意外,一会会进入Busybox的终端,命令提示符为'(initramfs)',此时系统没有挂载任何分区。
三、执行转换
首先我们需要btrfs-convert这个工具:
挂载根目录分区'/dev/sdb6'(这个路径应该在之前有记录),
mkdir ext4_root mount -t ext4 /dev/sdb6 ext4_root
拷贝,并卸载,
cp ext4_root/sbin/btrfs-convert /sbin/ umount /dev/sdb6
检查分区错误,
fsck.ext4 -f /dev/sdb6 fsck.ext4 -f /dev/sdb7 fsck.ext4 -f /dev/sdb8
转换,
btrfs-convert /dev/sdb6 btrfs-convert /dev/sdb7 btrfs-convert /dev/sdb8
转换需要一定的时间,注意不要终端电源或关机。
四、完成
当所有分区都转换完成后,不要急着重启,还记得/boot分区的设备路径么,马上就用到它。
重启,进入grub菜单后,按下e编辑启动命令,在内核参数即以'root=UUID'开头的部分,将'root='后的UUID删除掉,换为之前记录的根目录的设备路径,我的是 /dev/sdb6,就改为'root=/dev/sdb6',务必要设置正确,否则内核会无法挂载根目录分区。
最后内核参数应该是这样的形式:
linux ... root=/dev/sdb6 ro ...
按下Ctrl-X开始引导,进入系统后需要更新一下grub:
sudo update-grub
至此,转换结束。
Enjoy!
2010年10月20日 16:37
好文章,不过我还是等btrfs稳定版了再试
数据重要呀 :D
2010年12月20日 05:48
使用betrfs文件系统后启动慢了不少, 没有ext4文件系统快。
2011年8月19日 18:10
在虚拟机下试,发现btrfs占用很大的空间
2018年7月19日 12:34
Very useful info, thanks !
2020年4月09日 14:04
Very useful information I will post the post and come back to find out your information. Thanks for the dark post that will definitely come back.