
Ich habe eine Entwicklungsumgebung auf WSL bereitgestellt und bin so begeistert davon. Mein einziges Problem ist die Existenz einer init
Datei im Stammpfad des Systems.
Für einen meiner Kunden brauche ich ein /init
Verzeichnis,Dies ist eine Einschränkung, die nicht geändert werden kann.
Es ist unnötig zu erwähnen, dass dies meine spannende und neu entdeckte WSL-Entwicklungsumgebung für dieses Projekt unbrauchbar macht.
Gibt es eine Möglichkeit, den Pfad der WSL- init
Datei zu ändern?
Antwort1
Zu spät für die Antwort; das ursprünglich erwähnte Projekt ist mit ziemlicher Sicherheit beendet; und niemand sonst wird dieses Bedürfnis wahrscheinlich jemals wieder haben. Aber na ja, los geht’s …
Erstellen Sie ein Chroot-Jail. Führen Sie als Root die folgenden Schritte aus:
- Erstellen Sie einen Speicherort für das Chroot:
sudo mkdir /newroot; cd /newroot
- Erstellen Sie alle erforderlichen Verzeichnisse neu bzw. mounten Sie sie per Bind-Mount darin
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
(Ersetzen Sie den Standardbenutzernamen für die WSL-Instanz).mkdir var; mount --bind /var var
mkdir dev; mount --bind /dev dev
- Und so weiter für alle anderen erforderlichen Verzeichnisse.
- Achten Sie auf die symbolischen Links zum Stammverzeichnis Ihrer Distribution. Ubuntu würde beispielsweise auch Folgendes erfordern:
ln -s usr/lib lib
ln -s usr/lib32 lib32
- und so weiter ...
mount -t proc none proc
mkdir init
(Der Kunde benötigte initVerzeichnisanstelle des "echten" Root-InitDatei)
Um nun die WSL-Sitzung zu starten, richten Sie eine Verknüpfung für ein wsl -u root -e sh -c "cd /newroot; exec /usr/sbin/chroot /newroot/" su - username
. Ersetzen Sie username
natürlich die Standardeinstellung.
Dadurch wird der Benutzer in ein Chroot-Jail mit nur der von Ihnen ausgewählten Verzeichnisstruktur gestartet, die offensichtlich nicht die init
Datei, sondern init
stattdessen Ihr Verzeichnis enthält.
Antwort2
tl;dr: Die /init
Datei kann nicht gelöscht werden aus einemläuftWSL-Verteilung. Weil das Subsystem diese Datei verwendet und alle Prozesse in dieser laufenden WSL-Verteilung von ihr abgezweigt werden.
Was können wir also tun? Die Datei istgesperrtvom Subsystem während der Ausführung dieser Distribution. Die Problemumgehung besteht darin, zu warten oder die laufende Distribution zu beenden. Verwenden Sie
wsl.exe --terminate Distro
den Befehl, wobeiDistro
der Name der laufenden WSL-Distribution ist, die Sie beenden möchten. Gehen Sie zu dem Ordner, in dem die Distribution installiert ist, und folgen SieDasoderDas. Löschen Sie dieinit
Datei.Oder wenn Sie ein Tarball der gesamten WSL-Distribution erstellen möchten, müssen Sie die laufende Distribution nicht beenden. Erstellen Sie ein Tarball und schließen Sie Init aus:
cd /
tar -cpf backup.tar --exclude=/backup.tar --exclude=/init --xattrs --one-file-system /
Überprüfen Sie alle Befehlszeilenoptionen, bevor Sie diesen Befehl ausführen. Die Dateiberechtigung muss beibehalten werden.
- Woher kommt die Init-Datei? Die Init-Datei wird von Microsoft WSL-Entwicklern erstellt undnicht ähnlichmit systemd, sysVinit oder anderen traditionellen GNU/Linux-Init-Systemen. Die eigentliche Datei ist
System32\lxss\tools\init
. Wenn eine Distribution gestartet wird, kopiert der Linux Subsystem Manager Service (LXSS) diese Datei in den rootfs-Ordner (mitCopyFileW()
Win32-API). FürWSL2 Zuerst\tools
wird der Ordner mit dem 9p-Protokoll gemountet und dann wie oben beschrieben verwendet.