WSL & Ubuntu, wie man die Init-Datei verschiebt

WSL & Ubuntu, wie man die Init-Datei verschiebt

Ich habe eine Entwicklungsumgebung auf WSL bereitgestellt und bin so begeistert davon. Mein einziges Problem ist die Existenz einer initDatei im Stammpfad des Systems.

Stammunterverzeichnisse

Für einen meiner Kunden brauche ich ein /initVerzeichnis,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- initDatei 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 usernamenatürlich die Standardeinstellung.

Dadurch wird der Benutzer in ein Chroot-Jail mit nur der von Ihnen ausgewählten Verzeichnisstruktur gestartet, die offensichtlich nicht die initDatei, sondern initstattdessen Ihr Verzeichnis enthält.

Antwort2

tl;dr: Die /initDatei 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 Distroden Befehl, wobei Distroder 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 die initDatei.

  • 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 (mit CopyFileW()Win32-API). FürWSL2 Zuerst \toolswird der Ordner mit dem 9p-Protokoll gemountet und dann wie oben beschrieben verwendet.

verwandte Informationen