Когда Вы использовали бы pivot_root по switch_root?

Определять местоположение файлов по имени:

find /mount/point -type f \( \
    \( -name '*.zip' -o -name '*.o[dt][bcfghipst]' \) -exec unzip -t {} \; \
    -o -name '*.7z' -exec 7z t {} \; \
    …   \)

find /mount/point -type f \( -name '*.7z' -o -name '*.o[dt][bcfghipst]' \) -exec unzip -t {} \;

Определять местоположение файлов типом:

find /mount/point -type f -exec sh -c '
  case "$(file --mime-type -b - <"$0")" in
    application/zip) unzip -t "$0";;
    application/x-7z-compressed) 7z t "$0";;
    application/rar) unrar t "$0";;
    …
  esac
' {} \;
20
25.04.2014, 01:21
1 ответ

Я нашел замечательное объяснение здесь . Однако позвольте мне попытаться поставить в более короткий формат того, что я понял в ответ.

Более короткая версия

  1. , в то время как системные сапоги нуждается в раннем пространстве. Может быть достигается с помощью initramfs или initrd.
  2. initrd загружен в Ramdisk, который является фактической файловой системой .
  3. initramfs не файловая система .
  4. Для используется initrd pivot_root и для initramfs используется Switch_root .

Дольше версия

Теперь до подробного объяснения того, что я поставил выше.

в то время как initramfs, так и initrd служат той же цели, там 2 различия. Наиболее очевидная разница в том, что initrd загружен в рамдиск. Он состоит из фактической файловой системы (обычно Ext2) который установлен в рамадиске. Initramfs, с другой стороны, это не файловая система. Это просто (сжатый) CPIO Archive (типа Newc), который распакован в TMPF. Это имеет побочный эффект создания initramfs немного более оптимизирован и способен загрузки немного Ранее в процессе загрузки ядра, чем initrd. Кроме того, размер initramfs в памяти меньше, так как ядро ​​может адаптировать размер TMPF к тому, что на самом деле загружен, а не полагается на предопределенные размеры Ramdisk, и он также может очистить оперативную память, которая была Используются, тогда как Ramdisks имеют тенденцию оставаться в использовании (из-за деталей Реализация pivot_root).

Существует также другая побочная разница: как корневое устройство (и Переключение к нему) обрабатывается. Поскольку initrd - это фактическая файловая система Распаковывается в оперативную память, корневое устройство должно быть на самом деле Ramdisk. За initramfs, есть ядро ​​«rootfs», которое становится TMPF, которые initramfs распакован (если ядро ​​загружает initramfs; если нет, то rootfs - это просто файловая система, указанная через root = Параметр загрузки ядра), но эти временные rootfs не должны быть указано в качестве корня = параметр загрузки (и не будет способа Сделайте это, так как к нему нет устройства). Это означает, что вы все еще может пройти ваше настоящее root-устройство в ядро ​​при использовании initramfs. С initrd вы должны обрабатывать, что реальный корень Устройство сам. Также, поскольку «настоящее» корневое устройство с initrd Является ли Ramdisk, ядро ​​должно действительно свисать корневые устройства от одного Реальное устройство (Ramdisk) к другому (ваш реальный корень). В случае initramfs, пространство initramfs (TMPFS) не является настоящим устройством, Таким образом, ядро ​​не переключает реальные устройства. Таким образом, пока команда pivot_root используется с initrd, другая команда должна быть использована для initramfs. Busybox предоставляет switch_root сделать это, Пока Klibc предлагает New_root.

17
27.01.2020, 19:44

Теги

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