由于树莓派需要经常意外断电,防止文件系统出现坏块,所以日常使用只读模式,将需要持久化的数据保存在U盘。

关闭交换分区

1
2
3
4
5
6
7
8
sudo swapoff -a 
sudo rm -rf /swapfile
free # 查看是否生效

pi@raspbian:~/pi3-script/overlayfs$ free
total used free shared buff/cache available
Mem: 977980 491368 27672 13900 458940 430668
Swap: 0 0 0

将/boot分区也修改为只读,修改 fstab 文件,把/boot 对应的行改为ro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
sudo vi /etc/fstab
pi@raspbian:~/pi3-script/overlayfs$ cat /etc/fstab
proc /proc proc defaults 0 0
PARTUUID=daf1c5e3-01 /boot vfat ro 0 2
PARTUUID=daf1c5e3-02 / ext4 defaults,noatime,nodiratime 0 1
# 注释掉下面这行
#/swapfile swap swap defaults 0 0
add script to /sbin
cp ./overlayRoot.sh /sbin/


# add command to ~/.bashrc
``` bash
function reboot_rw(){
sudo mount -o remount,rw /boot
sudo sed -i 's/ init=\/sbin\/overlayRoot.sh//g' /boot/cmdline.txt
sudo reboot
}
function reboot_ro() {
sudo mount -o remount,rw /boot
sudo sed -i 's/\($\)/ init=\/sbin\/overlayRoot.sh/g' /boot/cmdline.txt
sudo reboot
}
function rw() {
sudo mount -o remount,rw /ro
sudo mount -o remount,rw /boot
}

切换overlayfs指令

1
2
3
4
5
6
reboot_ro # enter overlayfs
mount # 查看是否生效 /dev/mmcblk0p2 改为挂载在 /ro ,并且是只读;/boot 也挂载为只读;而 / 的 type 变成了overlay
#/dev/mmcblk0p2 on /ro type ext4 (ro,noatime,data=ordered)

reboot_rw # exit overlayfs
rw # 不切换系统的时候挂载读写

临时想读写

1
2
sudo mount -o remount,rw /ro
sudo mount -o remount,rw /boot

docker兼容问题处理

“storage-driver”: “vfs”, 是为了兼容overlayfs只读模式,如想还原回去修改vfs为overlay2
为了兼容overlayfs只读模式, 还需要执行下面的命令,注意:此时以前的容器会看不到了 \

1
2
3
4
5
6
7
8
9
10
11
12
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"storage-driver": "vfs",
"registry-mirrors": ["https://vlv9r1l5.mirror.aliyuncs.com"]
}
EOF


sed -i 's/ExecStart/ExecStartPre=mv \/var\/lib\/docker\/runtimes \/var\/lib\/docker\/runtimes-old\nExecStart/g' /lib/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker