我有一个在 eMMC 上启动的嵌入式系统,出于实际原因,我希望有一种简单的方法可以通过 ssh 刷新整个 eMMC,而不必依赖 PXE 启动或类似的东西。
我可以轻松地在分区上删除一个新内核和一个包含整个 rootfs 的新 initrd CPIO /
,然后执行以下操作:
kexec -l /home/root/bzImage --initrd=/home/root/initrd.cpio.gz
systemctl kexec
它按预期工作,我在之后断开了 SSH 连接,systemctl kexec
并可以在几秒钟后登录到新的“实时”系统。
我看到mount
输出:
rootfs on / type rootfs (rw,size=3913004k,nr_inodes=978251,inode64)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=4096k,nr_inodes=131072,mode=755,inode64)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,inode64)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,size=1595352k,nr_inodes=819200,mode=755,inode64)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k,inode64)
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=29,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)
none on /run/credentials/systemd-sysusers.service type ramfs (ro,nosuid,nodev,noexec,relatime,mode=700)
所以看起来一切都在 RAM 中,我现在可以安全地执行诸如dd if=stuff.img of=/dev/mmcblk0
更改和格式化新分区等操作。
然而,当查看free -m
输出时,我看到:
total used free shared buff/cache available
Mem: 7789 89 7217 473 483 7158
Swap: 0 0 0
我对这个值感到困惑used
,我希望它至少是我的完整未压缩实时 rootfs 的大小(~ 500 Mb)。它是标记为的东西吗shared
?
在这种状态下直接在我的 eMMC 上写入是否安全?
编辑:
我刚刚意识到加载到内存中的是 gzipped CPIO,然后由下一个内核解压缩。所以,之后kexec
,一切显然都在内存中,eMMC 上的原始文件不再重要了。
我现在的猜测是,这个易失性 rootfs 实际上被视为,实用程序tmpfs
报告为。shared
free
我对么?