假设您只能远程访问 (SSH) 嵌入式 Linux 设备,并且目标是将操作系统升级到新版本。该设备只有一个分区,但有超过 50% 的未使用空间,并且该设备有大约 256 MB 的 RAM 可供使用。一个人会怎样做呢?我认为解决方案可能涉及 tempfs 和pivot_root。
这是我对如何执行此操作的模糊想法:
- 将新的 rootfs 结构上传到设备上的目录
- 在 RAM 中挂载临时文件系统并复制所需的系统资源,以在处理 rootfs 时保持系统运行
- 使用pivot_root或chroot或两者将root更改为tempfs,不太确定
- 从上传的目录中复制rootfs结构来替换旧的
- 重新启动到新版本的操作系统
现在,我认为这听起来太简单而无法实际工作。您能否指出我的计划中的漏洞并告诉我我错过了什么,或者更好地指导我如何正确执行?有人有做这样的事情的经验吗?
答案1
chroot 只会更改当前进程的根目录,因此更改分区的其余部分很可能会让系统死亡(因此,您当前的进程也会死亡)。
对于pivot_root也是如此:
hub_root 移动根文件系统当前进程的到目录 put_old 并使 new_root 成为新的根文件系统。
当我必须更新树莓派的根文件系统时,我将 USB 驱动器连接到它并从那里启动。临时文件系统运行良好,我可以更改“真正的”根文件系统,而无需移除 SD 卡。 (树莓派很难够到,但我可以插入 USB 记忆棒)。
我想不出一种仅“启动”到 RAM 磁盘的正确方法,因为在里面系统的最终启动仍然来自于媒体。想想所有需要一直插入 CD 的 Linux Live CD,尽管最多系统的内容已经在 RAM 中。
如果您可以对文件系统重新分区,则可以在第二个分区中安装“新”操作系统,并将该操作系统标记为活动且可引导。
- 为第二个分区重新分区文件系统(针对新操作系统)
- 将新分区标记为活动且可启动
- 格式化新分区
- 在第二个分区中安装新操作系统(或临时操作系统)
- 更新引导加载程序(grub、LILO...)以从新的(第二个)分区引导
- 重启
- 删除第一个分区的内容
- 将新操作系统安装到第一个分区
- 更新引导加载程序(grub、LILO...)以从第一个分区引导
- 重启
- 删除第二个分区的内容
- 删除第二个分区
- 将第一个分区的大小调整为完整大小
跑步时调整大小很困难,但是这个网站声称这可能是可能的。它声称(2007 年!)他需要 2 GB RAM 来执行此操作......