红联Linux门户
Linux帮助

将你的Raspberry Pi 2根文件系统由EXT4迁移到f2fs

发布时间:2016-06-12 10:41:09来源:linux网站作者:呼延小夜

解决三星SD卡不兼容问题。


缘起:
我是用的是一张三星16G的SD卡型号为:MB-MP16D,上网查看树莓派支持情况,发现列表里没有我使用的型号,于是就想试试看。
树莓派2到手后按照官方的方法安装了Raspbian,启动正常,心想这张卡还真可以。可是好久不长,关机再启动,发现不能进系统了。经过一番折腾,发现系统启动极不稳定,有时候能进,有时候进不去。最后换了一张金士顿的32G卡,安装系统后一切正常。
然后我在http://elinux.org/RPi_SD_cards发现了SD卡支持情况的详细说明,就是这张卡在EXT4分区下是不行的,但使用f2fs可以。“man:0x00001b oem:0x534d name:00000 hwrev:0x1 fwrev:0x0 Tested on B+ model with 2014-12-24-wheezy-raspbian - Runs apt-get update without a problem - Raspberry Pi 2 model B, corruption if ext3/4, no problem with f2fs for two weeks”
由于我感觉32G有点大,所以就想换回我的16G卡,另外,听说f2fs性能更好,又能支持我的16G卡性能又好何乐而不为呢?
由于是新手,上网查询相关文章,发现根本没有,所以自己就开始了各种折腾,其中走了些弯路,具体过程就不写了,只写成功的迁移方法。


操作环境:
运行Ubuntu(或其他发行版)系统的电脑。(在虚拟机中运行也可以,我的事在VirtualBox中的Ubuntu15.04)
官方Raspbian系统。(我用的是2015-05-05-raspbian-wheezy.img)


迁移过程:
迁移过程其实很简单,就是将可以运行的系统备份出来,然后将系统原来的跟文件系统由EXT4格式化成f2fs,最后再将备份的系统恢复到f2fs分区中。然后配置一下cmdline.txt 和 fstab 就完成了。
以下是具体步骤
1、将2015-05-05-raspbian-wheezy.img刷到SD卡中,具体方法可参阅其他文章。

2、在Ubuntu中安装f2fs工具:
sudo apt-get install f2fs-tools

3、备份原系统:
将写有系统的SD卡插入到电脑中,我的识别的是/dev/sdb1 和 /dev/sdb2。不一样的环境识别出来的可能不一样。/dev/sdb2是我的树莓派跟分区。
执行以下命令
mkdir mnt
sudo mount /dev/sdb2 mnt
cd mnt
sudo tar -zcpf raspi_bak_20150628.tar.gz *  (注意,这个操作要执行很长......的时间)
以上tar执行完后将期考出到本地
sudo mv raspi_bak_20150628.tar.gz ../

4、格式化树莓派跟文件系统
sudo umount /dev/sdb2
sudo mkfs.f2fs /dev/sdb2

5、挂载分区并恢复
sudo mount /dev/sdb2 mnt
sudo tar -xpf raspi_bak_20150628.tar.gz -C mnt/  (注意,这个操作要执行时间也很长)

6、修改cmdline.txt
mkdir boot
sudo mount /dev/sdb1 boot/
sudo vi boot/cmdline.txt

将rootfstype=ext4 改为 rootfstype=f2fs

7、修改 fstab
sudo vi mnt/etc/fstab

将挂在跟分区的命令行修改为:
/dev/mmcblk0p2   /   f2fs   default,noatime,discard  0 0
注意,你的/dev/mmcblk0p2可能和我的不一样。

8、卸载读卡器,将SD卡插入树莓派中,你的系统已经使用新的f2fs分区了。


另外:使用以上方法要确定内核支持f2fs,我是重新编译了最新版的内核 Linux raspberrypi 4.0.6-v7+ #1 SMP PREEMPT Sat Jun 27 14:23:20 CST 2015 armv7l GNU/Linux ,树莓派2默认的Raspbian应该也是支持的,不过我没有试过。

把系统迁移到f2fs后,SD卡果然能可靠运行了,大喜!


附录:f2fs 与 ext4 在SD卡上的性能对比,不知道什么原因,我测出来的性能相当,可能是系统的原因,仅供参考。

f2fs 与 EXT4 读写性能测试:

使用201505 的 raspbian 系统测试
SD卡:Kingston SDHC 32G SDC10/32G


f2fs读写性能:

pi@raspberrypi:~$ uname -a                                                                   
Linux raspberrypi 4.0.6-v7+ #1 SMP PREEMPT Sat Jun 27 14:23:20 CST 2015 armv7l GNU/Linux

pi@raspberrypi:~$ time dd if=/dev/zero of=./test.dbf bs=8k count=200000                      
记录了200000+0 的读入
记录了200000+0 的写出
1638400000字节(1.6 GB)已复制,138.408 秒,11.8 MB/秒

real    2m18.541s
user    0m0.290s
sys     0m16.610s

pi@raspberrypi:~$ time dd if=./test.dbf of=/dev/null bs=8k
记录了200000+0 的读入
记录了200000+0 的写出
1638400000字节(1.6 GB)已复制,93.7311 秒,17.5 MB/秒

real    1m33.749s
user    0m0.290s
sys     0m7.100s

pi@raspberrypi:~$ time dd if=/dev/zero of=./test.dbf bs=500k count=4096
记录了4096+0 的读入
记录了4096+0 的写出
2097152000字节(2.1 GB)已复制,189.32 秒,11.1 MB/秒

real    3m9.331s
user    0m0.210s
sys     0m21.100s

pi@raspberrypi:~$ time dd if=./test.dbf of=/dev/null bs=500k
记录了4096+0 的读入
记录了4096+0 的写出
2097152000字节(2.1 GB)已复制,120.668 秒,17.4 MB/秒

real    2m0.685s
user    0m0.050s
sys     0m8.880s
pi@raspberrypi:~$


EXT4 读写性能:

pi@raspberrypi:~$ uname -a
Linux raspberrypi 4.0.6-v7+ #1 SMP PREEMPT Sat Jun 27 14:23:20 CST 2015 armv7l GNU/Linux
pi@raspberrypi:~$ time dd if=/dev/zero of=./test.dbf bs=8k count=200000
记录了200000+0 的读入
记录了200000+0 的写出
1638400000字节(1.6 GB)已复制,135.614 秒,12.1 MB/秒

real    2m15.766s
user    0m0.310s
sys     0m18.420s
pi@raspberrypi:~$ time dd if=./test.dbf of=/dev/null bs=8k
记录了200000+0 的读入
记录了200000+0 的写出
1638400000字节(1.6 GB)已复制,94.1443 秒,17.4 MB/秒

real    1m34.165s
user    0m0.320s
sys     0m7.090s
pi@raspberrypi:~$

pi@raspberrypi:~$ time dd if=/dev/zero of=./test.dbf bs=500k count=4096                      
记录了4096+0 的读入
记录了4096+0 的写出
2097152000字节(2.1 GB)已复制,175.986 秒,11.9 MB/秒

real    2m55.998s
user    0m0.000s
sys     0m23.620s
pi@raspberrypi:~$ time dd if=./test.dbf of=/dev/null bs=500k                                 
记录了4096+0 的读入
记录了4096+0 的写出
2097152000字节(2.1 GB)已复制,121.118 秒,17.3 MB/秒

real    2m1.135s
user    0m0.060s
sys     0m8.990s
pi@raspberrypi:~$


本文永久更新地址:http://www.linuxdiyf.com/linux/21447.html