私はeMMCからブートする組み込みシステムを持っており、実用的な理由から、PXEブートなどに頼らずにSSHを介してeMMC全体をフラッシュする簡単な方法が必要です。
パーティションに新しいカーネルと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に直接使っても安全ですか?
編集する:
私はメモリにロードされたのがgzipで圧縮されたCPIOで、次のコアで解凍されることに気づきました。したがって、その後、kexec
すべてが明らかにメモリにあり、eMMCの元のファイルはもはや重要ではありません。
今私の考えでは、この揮発性rootfsは実際にユーティリティがtmpfs
報告するように処理されるようです。shared
free
私は正しいですか?