Wie verwende / teste ich pivot_root?

9

Ich möchte den pivot_rootBefehl testen, der das Root-Dateisystem des aktuellen Prozesses in das Verzeichnis verschiebt put_oldund new_rootdas neue Root-Dateisystem erstellt.

Aber ich bekomme immer folgenden Fehler:

pivot_root: failed to change root from .' toold-root/': Invalid argument

Ich benutze Fedora als Basis-Root, ich habe einen Archlinux in meinem Home-Ordner

[root@localhost arch-root]# ls
bin boot dev etc home lib lib64 mnt old-root 
opt proc root run sbin srv sys tmp usr var
[root@localhost arch-root]# pivot_root . old-root/
pivot_root: failed to change root from .' toold-root/': Invalid argument

Ich versuche auch, die Linux-Funktion aufzurufen pivot_root("/chroot_test", "/chroot_test/old-root"). Habe den gleichen Fehler.

Irgendwelche Ideen dazu?

Update Nr. 1

Ich versuche auch pivot_rootin Docker zu testen . Ich mounte diesen Arch-Root in den Docker-Container. Aber erhalte den folgenden Fehler:Operation not permitted

root@00d871ce892b:/# cd test_root/
root@00d871ce892b:/test_root# ls
bin  boot  dev  etc  home  lib  lib64  mnt  old-root  opt  proc  root  run  sbin  srv     sys  test_pivot_root  test_pivot_root.c   tmp  usr  var
root@00d871ce892b:/test_root# pivot_root . tmp/
pivot_root: Operation not permitted

Lösung

Ich habe die Lösung gefunden:

Laufen Sie dockermit--privileged=true

So können wir pivot_root im Docker-Container testen.

vvilp
quelle
Nach dem Sound dieses Beitrags klingt es für mich wie ein Fehler: github.com/lxc/lxc/issues/61 . Auch dieser Thread klingt verwandt: lists.linuxcontainers.org/pipermail/lxc-users/2014-January/…
slm
Ja, ich versuche die Funktion von Docker und lxc zu testen, die pivot_root
vvilp verwenden.

Antworten:

5

Sind Sie wirklich sicher, dass arch-rootsich das auf einem separaten Dateisystem befindet, das gemountet und gemountet werden kann?

pivot_rootswitch_rootNeben dem aktuelleren funktioniert das Jonglieren von Informationen über gemountete Dateisysteme im Kernel.

Das neue Root-Dateisystem muss "das Root" eines Dateisystems sein, das Sie nicht übergeben können. " als neue Wurzel, es sei denn "." ist das Stammverzeichnis eines bereitgestellten Dateisystems.

Ich glaube, der einfachste Weg, wenn Sie es pivot_rootvon Ihrem aktuellen Setup aus versuchen möchten (vorausgesetzt, Arch-Root ist ein Unterverzeichnis und kein Root-Verzeichnis), besteht darin, ein tmpfsDateisystem zu erstellen, zu dem Sie wechseln können, und das erforderliche Material dort zu kopieren.

Etwas in diese Richtung könnte Ihnen den Einstieg erleichtern: (Passen Sie 500M an die Passform an du -sh arch-root)

mkdir / ramroot
mount -n -t tmpfs -o size = 500M keine / ramroot
cd arch-root # (enthält den Inhalt des Root-Dateisystems)
finden . -depth -xdev -print | cpio -pd --quiet / ramroot
CD / Ramroot
mkdir oldroot
pivot_root. Oldroot
exec chroot. bin / sh
MattBianco
quelle
Vielen Dank. Im Moment teste ich es in einem Docker-Container. Es klappt. Ich werde Ihre Methode später versuchen
vvilp
Ich denke, es gibt einen viel minimaleren Weg, um diese Anforderung zu erfüllen mount --bind /chroot-test /chroot-test && cd /chroot-test. (Der zweite Teil stellt sicher, dass .sich dies auf den neuen / chroot-Test bezieht, nicht auf den alten / chroot-Test). Dies ist laut man7.org/linux/man-pages/man8/switch_root.8.html#NOTES
sourcejedi
Möglicherweise müssen Sie unshare -mvor dem pivot_root eine ausführen. bugzilla.redhat.com/show_bug.cgi?id=1361043
koalo
2

Auf der Manpage glaube ich, dass dies Ihr Problem ist:

The following restrictions apply to new_root and put_old:

- They must be directories.

- new_root and put_old must not be on the same file system as the current
root.

- put_old must be underneath new_root, that is, adding a nonzero number of
/.. to the string pointed to by put_old must yield the same directory as
new_root.

- No other file system may be mounted on put_old.

Demnach sollten sich weder Dateisysteme put_oldnoch new_rootDateisysteme auf demselben Dateisystem wie befinden current_root.

Verweise

slm
quelle
Danke für Ihre Antwort. Ich aktualisiere die Frage. Ich versuche auch in Docker zu testen. Aber Operation nicht erlaubt
vvilp
1
Ihre Zusammenfassung ist falsch. new_rootund put_old kann auf demselben FS sein, es ist nur so, dass sich keiner auf demselben FS wie der aktuelle Root befinden sollte .
iBug
@ iBug - ty behoben.
slm