解决三星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:~$