WSL и Ubuntu, как переместить файл init

WSL и Ubuntu, как переместить файл init

Я развернул среду разработки на wsl и я так взволнован этим. Моя единственная проблема — существование файла initв корневом пути системы.

корневые подкаталоги

Для одного из моих клиентов мне нужен справочник /init,это ограничение, которое нельзя изменить.

Излишне говорить, что это делает мою замечательную и недавно найденную среду разработки wsl непригодной для этого проекта.

Есть ли способ изменить путь к initфайлу wsl?

решение1

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

Создайте chroot jail. Сделайте следующее как root:

  • Создайте местоположение для chroot: sudo mkdir /newroot; cd /newroot
  • Пересоздайте/смонтируйте все необходимые каталоги внутри newroot:
    • mkdir usr; mount --bind /usr usr
    • mkdir etc; mount --bind /etc etc
    • mkdir root
    • mkdir -p /home/user; mount --bind /home/user home/user(замените имя пользователя по умолчанию на экземпляр WSl).
    • mkdir var; mount --bind /var var
    • mkdir dev; mount --bind /dev dev
    • И так далее для любых других необходимых каталогов.
  • Обратите внимание на символические ссылки корневого каталога в вашем дистрибутиве. Например, по крайней мере Ubuntu также потребует:
    • ln -s usr/lib lib
    • ln -s usr/lib32 lib32
    • и так далее ...
  • mount -t proc none proc
  • mkdir init(Клиенту требовалась инициализациякаталога не "настоящий" корневой инициализаторфайл)

Теперь, чтобы запустить сеанс wsl, создайте ярлык для wsl -u root -e sh -c "cd /newroot; exec /usr/sbin/chroot /newroot/" su - username. usernameКонечно, замените на ярлык по умолчанию.

Это запустит пользователя в chroot-окружение только с выбранной вами структурой каталогов, которая, очевидно, не включает файл init, а вместо него — ваш initкаталог.

решение2

tl;dr: /initФайл не может быть удален избегДистрибутив WSL. Потому что подсистема использует этот файл и все процессы в этом работающем дистрибутиве WSL ответвляются от него.

  • Итак, что мы можем сделать? Файлзапертподсистемой во время работы этого дистрибутива. Обходной путь — подождать или завершить работу этого дистрибутива. Используйте wsl.exe --terminate Distroкоманду, где Distro— имя работающего дистрибутива WSL, который вы хотите завершить. Перейдите в папку, где установлен дистрибутив, следуйтеэтотилиэтот. Удалить initфайл.

  • Или, если вы хотите сделать tarball всего дистрибутива WSL, то нет необходимости завершать работающий дистрибутив. Создайте tarball и исключите init:

cd /
tar -cpf backup.tar --exclude=/backup.tar --exclude=/init --xattrs --one-file-system /

Проверьте все параметры командной строки перед запуском этой команды. Сохранение разрешения файла обязательно.

  • Откуда берется файл init? Файл init создается разработчиками Microsoft WSL ине похожис systemd, sysVinit или другими традиционными системами инициализации GNU/Linux. Фактический файл — System32\lxss\tools\init. При запуске дистрибутива служба Linux Subsystem Manager Service (LXSS) копирует этот файл в папку rootfs (с CopyFileW()Win32 API). ДляWSL2 сначала \toolsпапка монтируется с протоколом 9p, а затем используется, как указано выше.

Связанный контент