【问题标题】:how to reset kernel while the device is booted up?如何在设备启动时重置内核?
【发布时间】:2016-10-05 13:10:53
【问题描述】:

如何在设备启动时替换rootfs分区的内容?
我正在使用带有剥离 debian 版本的 pine64 (1GB) 并编写了一个工厂重置脚本,该脚本将在设备运行时替换 rootfs 分区中的所有文件?常驻恢复文件可以是 tar 或 img 文件。
我已经尝试了两种方法

  1. 将镜像中的分区添加到设备上的分区中。
    sudo dd if=pine-debian.img skip=*start of rootfs partition* seek=*start of rootfs partition* of=/dev/mmcblk0
  2. 将压缩后的内容解压到/目录下。
    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 命令,但我不确定这是否有效。

    另外两个选项:

    1. 不要覆盖完整的 rootfs,而是使用 Debian 软件包升级。他们有安装前和安装后脚本,以确保升级安全。
    2. 切换到(临时的、小型的)内存根文件系统以执行升级。这个根文件系统应该只包含busybox 和执行升级的脚本。您可以杀死所有进程,然后在临时 rootfs 中执行 pivot_root,或者您可以使用 kexec --initrd=... 引导到内存中的根文件系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2012-10-16
      • 2018-03-14
      • 2021-12-26
      相关资源
      最近更新 更多