Можно ли размонтировать корневую файловую систему в Linux?

Колодец(выход ),

The exit utility shall cause the shell to exit from its current execution environment [...]

и(2.12. Среда выполнения оболочки)

A subshell environment shall be created as a duplicate of the shell environment, [...] Additionally, each command of a multi-command pipeline is in a subshell environment; as an extension, however, any or all commands in a pipeline may be executed in the current environment. All other commands shall be executed in the current shell environment.

Таким образом, exitв конвейере запускается в собственной среде выполнения/подоболочке и выходит только из нее, в то время как команда в простой команде exit > /dev/nullзапускается в основной среде оболочки. (Как отмечалось в комментариях, перенаправление на самом деле никак на это не влияет.)

Обратите внимание, что часть в середине второй кавычки означает, что некоторая оболочка может запускать все команды конвейера в основной среде, таким образом выходя из всей оболочки даже в этом случае. На практике это чаще всего делается для последней команды конвейера.

В Bash с lastpipe, например:

$ bash -c 'true | exit; echo end.'
end.

Но

$ bash -O lastpipe -c 'true | exit; echo end.'

ничего не печатает.

0
16.04.2021, 08:51
1 ответ

Во-первых, вам нужно знать, что такое rootfsна самом деле.

Из документации исходного кода ядра Linux:

What is rootfs?

Rootfs is a special instance of ramfs (or tmpfs, if that's enabled), which is always present in 2.6 systems. You can't unmount rootfs for approximately the same reason you can't kill the init process; rather than having special code to check for and handle an empty list, it's smaller and simpler for the kernel to just make sure certain lists can't become empty.

Most systems just mount another filesystem over rootfs and ignore it. The amount of space an empty instance of ramfs takes up is tiny.

If CONFIG_TMPFS is enabled, rootfs will use tmpfs instead of ramfs by default. To force ramfs, add "rootfstype=ramfs" to the kernel command line.

Итак, rootfsне является реальным типом файловой системы :изначально он может быть экземпляром ramfsили tmpfsв зависимости от конфигурации ядра. Но как только initramfs выполнила свою работу, rootfsфактически становится фиктивным заполнителем, гарантирующим, что список смонтированных файловых систем ядра никогда не будет полностью пустым, чтобы избежать необходимости иметь специальный -case-код для обработки этой ситуации.

Обычно вы не можете просто размонтировать настоящую корневую файловую систему; если бы вы могли это сделать, вы бы столкнулись с ситуацией, когда у вас нет возможности открыть какие-либо файлы (и не открыть существующие файлы, потому что открытие каких-либо файлов в старой корневой файловой системе предотвратит ее размонтирование ). В этот момент вы не сможете загружать новые исполняемые файлы. Поскольку не будет места, куда можно было бы установить /dev, /procили /sys, вы также не сможете получить доступ к большинству устройств. Таким образом, система с размонтированной корневой файловой системой не очень полезна, кроме как в качестве последнего шага перед перезагрузкой или выключением.

Реальный способ переключения с одной корневой файловой системы на другую (, например. от времени загрузки -initramfsдо реальной корневой файловой системы )используется системный вызовpivot_root(2).

Существует также инструмент командной строки -switch_root(8), но он предназначен для использования только при переходе от initramfs к реальной корневой файловой системе:

WARNING: switch_root removes recursively all files and directories on the current root filesystem.

Это то, что позволяет initramfs становиться пустым и уменьшаться до незначительности, когда система переходит от initramfs к настоящей корневой файловой системе во время загрузки. Но попытка использовать switch_rootдля перехода с одной реальной корневой файловой системы на другую приведет к удалению содержимого старой корневой файловой системы, поэтому это бесполезно для неразрушающего перехода -с корневой файловой системы на основе одного диска -. другому.

До ядер 2.6.xx, я думаю, кто-то сделал доказательство -концепции -брандмауэра Linux, который просто устанавливал сетевые интерфейсы, маршрутизацию и брандмауэр ipchains/iptables, а затем просто останавливал ядро. Тогда остановка просто означала остановку пользовательских -пространственных процессов, а ядро ​​продолжало работать. Я думаю, что это был скорее интересный трюк / разговор, чем серьезный дизайн для чего-либо. Но единственные вещи, которые вы могли бы сделать с размонтированной корневой файловой системой, вероятно, были бы чем-то подобным.

1
28.04.2021, 22:52

Теги

Похожие вопросы