将您的 Raspberry Pi 文件系统设为只读 --Raspbian Buster
原文链接:
https://medium.com/swlh/make-your-raspberry-pi-file-system-read-only-raspbian-buster-c558694de79
Raspberry Pi 通常用于信息面板应用程序,其唯一目的是将预加载的 HTML5 内容从 SD 卡提供到其连接的 HDMI 屏幕。这是一种非常常见的设置,但有时您会遇到因 SD卡损坏而导致的奇怪问题。
本指南最初是为 Raspbian Stretch 创建的,并已针对 Raspbian Buster 进行了更新。您仍然可以在[此处](https://medium.com/@andreas.schallwig/how-to-make-your-raspberry-pi-file-system-read-only-raspbian-stretch-80c0f7be7353)找到 Raspbian Stretch 的指南。
在我们的案例中,通常在大约 6 个月后,我们会遇到随机崩溃并找到如下日志消息:
end_request: I/O error, dev mmcblk0, sector 148225
mmcblk0: error -110 transfering data, sector 148226, nr 254, response 0x900, card status 0xb00
这里发生了什么?!
后来通过谷歌快速搜索,我们知道这些是 SD 卡坏的典型迹象。这些卡不是为 24/7 运行而设计的,并且会在一段时间后开始积累坏扇区。
此外,kiosk 应用程序通常没有正确关闭,而是简单地拔掉了电源。重复此操作会增加文件系统损坏的风险。
幸运的是,在 Raspbian Buster 上,您可以强制文件系统进入“只读模式”。在只读模式下,系统无法将任何数据写入您的 SD 卡,从而显着延长卡的使用寿命。
为此,我们需要采取以下步骤:
- 配置操作系统以将所有临时文件写入驻留在内存中的“tmpfs”文件系统。
- 配置其他服务以也使用 tempfs 文件系统。
- 将所有系统日志文件重定向到内存。
- 添加一些可选脚本以打开/关闭只读模式
让我们开始吧
重要提示:在学习本教程之前,您绝对应该创建 SD 卡的备份映像。我已经在无数 Pi 上成功地使用了这种方法,但您仍然需要自担风险。如果有任何问题不要怪我😉
准备工作
通过 SSH 登录到您的 Raspberry。我建议您首先再次更新您的 Pi 以获取所有最新的软件包:
sudo apt-get update && apt-get upgrade
做一些整理并删除以下软件包。如果一开始没有安装这些,则跳过此步骤:
sudo apt-get remove --purge triggerhappy logrotate dphys-swapfile
清理你的包:
sudo apt-get autoremove --purge
禁用交换和文件系统检查并将其设置为只读
编辑文件 /boot/cmdline.txt 并在行尾添加以下三个单词:
fastboot noswap ro
该行现在应该类似于:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 lift=deadline rootwait fastboot noswap ro
更换您的日志管理器
我们希望避免将任何系统日志文件写入 SD 卡。因此,我们会将日志文件的标准 syslog 输出删除到 /var/log,并用busybox内存记录器替换它:
sudo apt-get install busybox-syslogd
sudo apt-get remove --purge rsyslog
提示:从现在开始使用 sudo logread
检查您的系统日志。
将文件系统设为只读并添加临时存储
更新文件 /etc/fstab
并将 ,ro
标志添加到所有块设备。更新后的文件应如下所示:
proc /proc proc defaults 0 0
PARTUUID=fb0d460e-01 /boot vfat defaults,ro 0 2
PARTUUID=fb0d460e-02 / ext4 defaults,noatime,ro 0 1
还要在文件末尾添加临时文件系统的条目:
tmpfs /tmp tmpfs nosuid,nodev 0 0
tmpfs /var/log tmpfs nosuid,nodev 0 0
tmpfs /var/tmp tmpfs nosuid,nodev 0 0
将一些系统文件移动到临时文件系统
注意:这部分不同于以前的 Raspbian 版本(Stretch 等)。在 Raspbian Buster 上,不要移动 /var/lock 和 /var/run 目录,因为它们已经符号链接到 tmpfs 目录。您可以在 Debian Buster tmpfs 文档中阅读有关这些更改的更多信息。
sudo rm -rf /var/lib/dhcp /var/lib/dhcpcd5 /var/spool /etc/resolv.conf
sudo ln -s /tmp /var/lib/dhcp
sudo ln -s /tmp /var/lib/dhcpcd5
sudo ln -s /tmp /var/spool
sudo touch /tmp/dhcpcd.resolv.conf
sudo ln -s /tmp/dhcpcd.resolv.conf /etc/resolv.conf
更新 systemd 随机种子
将随机种子文件链接到 tmpfs
位置:
sudo rm /var/lib/systemd/random-seed
sudo ln -s /tmp/random-seed /var/lib/systemd/random-seed
编辑服务配置文件 /lib/systemd/system/systemd-random-seed.service
以在启动时创建该文件。在 [Service] 部分下添加行 ExecStartPre=/bin/echo "" >/tmp/random-seed
。
修改后的 [Service] 部分应如下所示:
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/echo "" >/tmp/random-seed
ExecStart=/lib/systemd/systemd-random-seed load
ExecStop=/lib/systemd/systemd-random-seed save
TimeoutSec=30s
此时重新启动后,您应该有一个处于只读模式的工作 Raspberry Pi 👋 👋 👋。干杯🍺!
可选:添加一些有用的命令来在 RO 和 RW 模式之间切换
此步骤是可选的,但在您需要更新或调试系统时,可以更方便地在只读和读写模式之间切换。
在这里,我们创建了两个 shell 命令 ro(只读)和 rw(读写),可以随时在模式之间切换。此外,它还会在您的命令提示符中添加一个指示器以显示当前模式。
编辑文件 /etc/bash.bashrc 并在末尾添加以下行:
set_bash_prompt() {
fs_mode=$(mount | sed -n -e "s/^\/dev\/.* on \/ .*(\(r[w|o]\).*/\1/p")
PS1='\[\033[01;32m\]\u@\h${fs_mode:+($fs_mode)}\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
}
alias ro='sudo mount -o remount,ro / ; sudo mount -o remount,ro /boot'
alias rw='sudo mount -o remount,rw / ; sudo mount -o remount,rw /boot'
PROMPT_COMMAND=set_bash_prompt
最后确保文件系统在您注销后恢复为只读状态。编辑(或创建)文件 /etc/bash.bash_logout
并在末尾添加以下行:
mount -o remount,ro /
mount -o remount,ro /boot
你完成了!现在只需重新启动系统:
sudo reboot
❤️ 非常感谢您的阅读! I️如果您有任何意见或建议,请在评论中开始对话。 ❤️