什么是MSD
Mass storage device 即 大容量存储设备
闪存芯片的U盘 SD卡 硬盘 固态都行
本次用的就是三星的32GU盘
启动USB BOOT 模式 需要安装两个文件 start.elf
bootcode.bin
这两个文件存在于 github仓库 rpi-firmware的next分支里
https://github.com/Hexxeh/rpi-firmware/tree/next
开始
首先,下载raspbian的系统镜像。 下载地址
我推荐下载lite版本的
不过 lite版本需要一个额外的步骤:
sudo apt-get install rpi-update
然后进行raspberry的更新 和 rpi-update的安装
$ sudo apt-get update;
$ sudo apt-get install rpi-update
因为需要从github的仓库里下载文件,所以需要一个比较好的网络环境
我经过测试发现最好的环境是:
树莓派上安装shadowsocks
sudo apt-get install python-pip
pip install shadowsocks
然后安装 配置 proxychains 代理socks5
sudo apt-get install proxychains
sudo nano /etc/proxychains.conf
将socks4 127.0.0.1 9095改为
socks5 127.0.0.1 port 这边port取决于sslocal配置的本地端口号,我的就是1080
然后
sudo BRANCH=next proxychains rpi-update
PS: 这是我网络环境,即使路由器翻墙了依旧有点问题,所以需要proxychains进行代理,不然会出现很多错误(见 最下面的 More )
BRANCH=next 是将环境变量 BRANCH 设置为 next, 这样固件更新的时候会选择next分支而不是branch分支
大致升级过程的显示信息是这样的,期间会有curl进行文件的下载,不过我没截图
允许USB启动:
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
重启
sudo reboot
这边我们对重启前后的信息进行对比
重启前
固件版本:
显示OTP寄存器的信息:
重启后
这边显示 17:3020000a才说明更新成功
USB存储设备的系统安装
准备一个USB存储设备,我用的是U盘,硬盘应该也行。需要格式化,所以注意备数据的备份。
sudo parted /dev/sda # 使用parted对U欧盘进行分区
(parted) mktable msdos # 创建msdos格式的分区表
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
(parted) mkpart primary fat32 0% 100M # 分 100M 格式成fat32
(parted) mkpart primary ext4 100M 100% # 剩下的全都格式成ext4
一般都是sda,不过分不清楚的话可以用 $sudo fdisk -l | grep sd
查看。
创建BOOT 和root 文件系统
sudo mkfs.vfat -n BOOT -F 32 /dev/sda1
sudo mkfs.ext4 /dev/sda2
创建文件挂载U盘
sudo mkdir /mnt/target
sudo mount /dev/sda2 /mnt/target/
sudo mkdir /mnt/target/boot
sudo mount /dev/sda1 /mnt/target/boot/
安装rsync
sudo apt-get update
sudo apt-get install rsync
将root和boot文件系统同步到U盘上去
sudo rsync -ax --progress / /boot /mnt/target
重新生成SSH key
cd /mnt/target
sudo mount --bind /dev dev
sudo mount --bind /sys sys
sudo mount --bind /proc proc
sudo chroot /mnt/target
rm /etc/ssh/ssh_host*
dpkg-reconfigure openssh-server
exit
sudo umount dev
sudo umount sys
sudo umount proc
编辑 cmdline.txt
文件,fstab
文件
sudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/target/boot/cmdline.txt
sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/target/etc/fstab
也可以手动修改
卸载U盘, 关机
cd ~
sudo umount /mnt/target/boot
sudo umount /mnt/target
sudo poweroff
接下来要做的就是拔掉microSD卡然后用U盘启动了
More
A :是否能在pi1 pi2 上使用
不能,因为关于boot的代码只在BCD2837上有(也就是raspberry pi 3 这一代)。
Tips :
最好所用的U盘比microSD卡的容量(准确来说是raspbian的文件系统容量)要大
因为网络原因出现过的一些问题
参考链接
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md
https://github.com/raspberrypi/documentation/blob/master/hardware/raspberrypi/bootmodes/msd.md
Youtube : https://www.youtube.com/watch?v=hxV3yrn8FK8
转自 简书 http://www.jianshu.com/p/c182d285d9c6