首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脚本中的umount根

脚本中的umount根
EN

Unix & Linux用户
提问于 2016-08-31 15:31:41
回答 1查看 999关注 0票数 0

我正在编写一个bash脚本,在SD卡上将我的rootfs更改为另一个。

这些步骤大致如下:

代码语言:javascript
复制
mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root

这在交互模式下可以正常工作,但在脚本中不能工作,因为解释器在old-root中运行,我无法卸载它。

因此,我尝试使用一个中间脚本,其中一个脚本像下面这样杀死了父脚本:

代码语言:javascript
复制
# parent
exec chroot sd_card_fs sh -c script.sh

# son
cat script.sh

..。 kill -9 $PPID umount /旧-root.

这在儿子自杀、杀死父母的过程中行不通,我觉得这个解决方案有点肮脏。

所以我的问题是:

  • 有比调用另一个脚本来完成这项工作更干净的方法吗?如果没有,我怎样才能修好它?

我真的想尽量减少人与人之间的交互,所以调用一个脚本,等待它完成启动另一个脚本是一个拒绝,除非没有其他的解决方案。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2016-09-01 08:46:27

但“父”脚本中的最后一个命令将其替换为“子”。这就是exec所做的。您不应该有任何可以杀死的父进程。

只有当脚本为PID 1时,这样的脚本才能工作,这样就没有其他进程*。您一定是用init=/bin/bash启动的。记住使用exec调用脚本,这样它就可以代替PID 1。

不要使用延迟卸载,这意味着您将不会看到错误消息。

我有99%的信心你懒散的坐骑还没完成。我不知道如何测试这一点,除了使用ext4或ext3之外,file -s /dev/$ROOT_DEV应该显示“需要日志恢复”(即没有干净地卸载)。

如果您删除kill并遵循上面粗体的说明,我希望您的第一次尝试能够奏效。不过,我可能漏掉了什么。

*或者,您需要告诉init重新执行它自己,在安排了它的exec在目标文件系统上的路径之后。但对我来说这听起来是个糟糕的主意。简单点就行了。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/306993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档