
Я развернул среду разработки на 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, а затем используется, как указано выше.