【问题标题】:how to reset kernel while the device is booted up?如何在设备启动时重置内核?
【发布时间】:2016-10-05 13:10:53
【问题描述】:
如何在设备启动时替换rootfs分区的内容?
我正在使用带有剥离 debian 版本的 pine64 (1GB) 并编写了一个工厂重置脚本,该脚本将在设备运行时替换 rootfs 分区中的所有文件?常驻恢复文件可以是 tar 或 img 文件。
我已经尝试了两种方法
- 将镜像中的分区添加到设备上的分区中。
sudo dd if=pine-debian.img skip=*start of rootfs partition* seek=*start of rootfs partition* of=/dev/mmcblk0
- 将压缩后的内容解压到/目录下。
sudo tar -C / -zxvf pine-debian.tar.gz
在这两种方法之后,系统可以识别任何命令,甚至不能识别 ls。任何有关如何解决此问题的帮助将不胜感激。如何在设备运行时替换 fs 内容?
【问题讨论】:
标签:
linux
linux-kernel
debian
u-boot
dd
【解决方案1】:
理想情况下,您应该有两个分区,每个分区都有一个 rootfs 的副本。您可以使用dd 写入当前未使用的分区,然后更新引导加载程序配置以指向刚刚写入的分区作为根。 swupdate支持这样的双bank场景,但它只原生支持U-Boot;如果您使用不同的引导加载程序,则必须添加一个脚本来执行交换。
如果您确实需要就地覆盖,则无法直接覆盖分区,因为该文件系统当前正在使用中。解压也会失败,因为当前正在使用某些文件 - 特别是 libc。您可以尝试将 --unlink-first 选项添加到 untar 命令,但我不确定这是否有效。
另外两个选项:
- 不要覆盖完整的 rootfs,而是使用 Debian 软件包升级。他们有安装前和安装后脚本,以确保升级安全。
- 切换到(临时的、小型的)内存根文件系统以执行升级。这个根文件系统应该只包含busybox 和执行升级的脚本。您可以杀死所有进程,然后在临时 rootfs 中执行 pivot_root,或者您可以使用
kexec --initrd=... 引导到内存中的根文件系统。