就地远程更新根文件系统

就地远程更新根文件系统

假设您只能远程访问 (SSH) 嵌入式 Linux 设备,并且目标是将操作系统升级到新版本。该设备只有一个分区,但有超过 50% 的未使用空间,并且该设备有大约 256 MB 的 RAM 可供使用。一个人会怎样做呢?我认为解决方案可能涉及 tempfs 和pivot_root。

这是我对如何执行此操作的模糊想法:

  1. 将新的 rootfs 结构上传到设备上的目录
  2. 在 RAM 中挂载临时文件系统并复制所需的系统资源,以在处理 rootfs 时保持系统运行
  3. 使用pivot_root或chroot或两者将root更改为tempfs,不太确定
  4. 从上传的目录中复制rootfs结构来替换旧的
  5. 重新启动到新版本的操作系统

现在,我认为这听起来太简单而无法实际工作。您能否指出我的计划中的漏洞并告诉我我错过了什么,或者更好地指导我如何正确执行?有人有做这样的事情的经验吗?

答案1

chroot 只会更改当前进程的根目录,因此更改分区的其余部分很可能会让系统死亡(因此,您当前的进程也会死亡)。

对于pivot_root也是如此:

hub_root 移动根文件系统当前进程的到目录 put_old 并使 new_root 成为新的根文件系统。

当我必须更新树莓派的根文件系统时,我将 USB 驱动器连接到它并从那里启动。临时文件系统运行良好,我可以更改“真正的”根文件系统,而无需移除 SD 卡。 (树莓派很难够到,但我可以插入 USB 记忆棒)。

我想不出一种仅“启动”到 RAM 磁盘的正确方法,因为在里面系统的最终启动仍然来自于媒体。想想所有需要一直插入 CD 的 Linux Live CD,尽管最多系统的内容已经在 RAM 中。

如果您可以对文件系统重新分区,则可以在第二个分区中安装“新”操作系统,并将该操作系统标记为活动且可引导。

  1. 为第二个分区重新分区文件系统(针对新操作系统)
  2. 将新分区标记为活动且可启动
  3. 格式化新分区
  4. 在第二个分区中安装新操作系统(或临时操作系统)
  5. 更新引导加载程序(grub、LILO...)以从新的(第二个)分区引导
  6. 重启
  7. 删除第一个分区的内容
  8. 将新操作系统安装到第一个分区
  9. 更新引导加载程序(grub、LILO...)以从第一个分区引导
  10. 重启
  11. 删除第二个分区的内容
  12. 删除第二个分区
  13. 将第一个分区的大小调整为完整大小

跑步时调整大小很困难,但是这个网站声称这可能是可能的。它声称(2007 年!)他需要 2 GB RAM 来执行此操作......

相关内容