ubuntuusers.de

sudo apt-get install in einem container (systemd-nspawn)?

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

ihkavu

Anmeldungsdatum:
6. März 2010

Beiträge: 172

Hi, ich würde ich gerne sudo apt-get install in einem container von systemd-nspawn ausführen. Dabei bekomme ich aber Fehlermeldungen. z.B. bei apt-get instally lynx

apt-get install lynx
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  lynx-common
The following NEW packages will be installed:
  lynx lynx-common
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 1035 kB of archives.
After this operation, 2761 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Ign:1 http://de.archive.ubuntu.com/ubuntu xenial/universe i386 lynx-common all 2.8.9dev8-4ubuntu1
Err:2 http://de.archive.ubuntu.com/ubuntu xenial/universe amd64 lynx amd64 2.8.9dev8-4ubuntu1
  Temporary failure resolving 'de.archive.ubuntu.com'
Err:1 http://de.archive.ubuntu.com/ubuntu xenial/universe i386 lynx-common all 2.8.9dev8-4ubuntu1
  Temporary failure resolving 'de.archive.ubuntu.com'
E: Failed to fetch http://de.archive.ubuntu.com/ubuntu/pool/universe/l/lynx/lynx-common_2.8.9dev8-4ubuntu1_all.deb  Temporary failure resolving 'de.archive.ubuntu.com'

E: Failed to fetch http://de.archive.ubuntu.com/ubuntu/pool/universe/l/lynx/lynx_2.8.9dev8-4ubuntu1_amd64.deb  Temporary failure resolving 'de.archive.ubuntu.com'

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

oder bei apt-get update

Err:1 http://security.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'security.ubuntu.com'
Err:2 http://de.archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'de.archive.ubuntu.com'
Err:3 http://de.archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'de.archive.ubuntu.com'
Err:4 http://de.archive.ubuntu.com/ubuntu xenial-backports InRelease
  Temporary failure resolving 'de.archive.ubuntu.com'
Reading package lists... Done
W: Failed to fetch http://de.archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'de.archive.ubuntu.com'
W: Failed to fetch http://de.archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'de.archive.ubuntu.com'
W: Failed to fetch http://de.archive.ubuntu.com/ubuntu/dists/xenial-backports/InRelease  Temporary failure resolving 'de.archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'security.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.

Eine Verbindung zum Internet habe ich im Container. ping IP geht, ping hostname (z.b. forum.ubuntuusers.de) jedoch nicht (unknown host).

gestartet habe ich den container mit:

sudo systemd-nspawn --template=/  --directory=/home/uname/container/test /bin/bash

ostcar Team-Icon

Ehemalige
Avatar von ostcar

Anmeldungsdatum:
27. Juli 2006

Beiträge: 2748

Wohnort: Leipzig

Der Grund ist, dass du zwar Internet hast, jedoch keinen DNS-Server.

Am einfachsten ist es, systemd-resolved zu verwenden. Das ist ein Dienst, den du im container mit

systemctl start systemd-resolved
systemctl enable systemd-resolved

starten und aktivieren kannst.

Gegebenenfalls musst du noch einen Symlink von /etc/resolv.conf auf /run/systemd/resolve/resolv.conf anlegen

ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

ihkavu

(Themenstarter)

Anmeldungsdatum:
6. März 2010

Beiträge: 172

Hi, danke für die Antwort. Das es was mit DNS zu tun haben könnte, habe ich mir schon gedacht, ich finde nur nicht heraus, wie man das ändern kann.

wenn ich im container:

systemctl start systemd-resolved

ausführe, bekomme ich einen Fehler:

Failed to connect to bus: No such file or directory

Der Symlink ändert auch nix.(Habe keinen /run/systemd/resolve/ Ordner)

ostcar Team-Icon

Ehemalige
Avatar von ostcar

Anmeldungsdatum:
27. Juli 2006

Beiträge: 2748

Wohnort: Leipzig

systemd-nspwan funktioniert am besten wenn du dbus installierst. Das ist ein System, mit welchem unter anderem systemd im host mit dem Systemd im Container kommuniziert und auch die verschiedenen systemd-Dienste miteinander. Ich verstehe auch nicht, wieso Ubuntu das nicht standardmäßig mit installiert.

Das führt dich natürlich zum Henne - Ei Problem ☺

Die Lösung ist, dass du den Container ohne die -b Option startest. Dann hast du Internet und kannst dbus installieren und danach den Container wieder normal booten.

ihkavu

(Themenstarter)

Anmeldungsdatum:
6. März 2010

Beiträge: 172

hmm komisch, dbus war schon installiert (apt-get install dbus installierte nix mehr).

Ich starte den Container immmer ohne die -b option. Ist nur ein Snapshot vom root Verzeichnis. Und Verbindung zum Internet habe ich darin auch. ping IP geht, nur ping hostname geht nicht.

sudo systemd-nspawn --template=/  --directory=/home/uname/container/test /bin/bash

ostcar Team-Icon

Ehemalige
Avatar von ostcar

Anmeldungsdatum:
27. Juli 2006

Beiträge: 2748

Wohnort: Leipzig

Ok, ich kann das Problem jetzt nachvollziehen.

Wenn du den Container ohne --boot startest, dann wird wirklich nur dein eines Programm gestartet. Insbesondere läuft in der nspawn Umgebung auch kein dbus. Alle systemd Befehle werden daher fehlschlagen. Aus diesem Grund würde ich dir empfehlen immer die --boot Option zu verwenden, oder direkt mit machinectl zu arbeiten, welche systemd-nspawn auch mit der --boot Option aufruft.

Die Erklärung für dein eigentliches Problem ist folgendes. Auf deinem Host ist die Datei /etc/resolv.conf keine echte Datei, sondern ein Symlink.

$ ls -l /etc/resolv.conf 
lrwxrwxrwx 1 root root 35  6. Jul 07:00 /etc/resolv.conf -> /var/run/NetworkManager/resolv.conf

Der Container erhält jedoch seinen eigenen Ordner /run bzw. /var/run. Mit anderen Worten, der Symlink /etc/resolv.conf zeigt ins leere. Wenn du im Container

rm /etc/resolv.conf
echo "nameserver 8.8.8.8">/etc/resolv.conf

ausführst, dann müsstest dein Problem gelöst sein.

Meine Empfehlung wäre jedoch, dass du die --boot Option verwendest und innerhalb vom Container systemd-resolvd startest.

ihkavu

(Themenstarter)

Anmeldungsdatum:
6. März 2010

Beiträge: 172

ahh, es gibt sie also doch. Danke, schonmal ein Schritt weiter. Jedoch darf ich auch nach dem löschen keine neue machen:

ls -l /etc/resolv.conf 
$: lrwxrwxrwx 1 root root 29 Jul  2 23:33 /etc/resolv.conf -> ../run/resolvconf/resolv.conf

$:  sudo rm /etc/resolv.conf 
sudo: unable to resolve host container: Connection refused

$: ls -l /etc/resolv.conf 
ls: cannot access '/etc/resolv.conf': No such file or directory

$: sudo echo "nameserver 8.8.8.8">/etc/resolv.conf
bash: /etc/resolv.conf: Permission denied

$: ls -l /etc/resolv.conf 
ls: cannot access '/etc/resolv.conf': No such file or directory

falls ich "--boot" zum Aufruf hinzufüge kommt wieder eine Fehler

Failed to mount tmpfs at /run/lock: No such file or directory
[!!!!!!] Failed to mount API filesystems, freezing.
Freezing execution.

ostcar Team-Icon

Ehemalige
Avatar von ostcar

Anmeldungsdatum:
27. Juli 2006

Beiträge: 2748

Wohnort: Leipzig

Versuche mal die Datei ohne sudo zu löschen. Innerhalb von dem Container bist du sowieso root. Ich vermute, dass sudo intern auf irgendwelche Dienste zugreifen möchte, die ohne die --boot option nicht laufen.

Wegen deinem Problem mit der --boot Option habe ich keine Idee. Ich selbst habe hier keinen Rechner mit Ubuntu 16.04, weshalb ich es nicht ausprobieren kann.

ihkavu

(Themenstarter)

Anmeldungsdatum:
6. März 2010

Beiträge: 172

Wow, es geht! vielen, vielen, vielen Dank. Gleich zwei Probleme gelöst ☺

Ich hatte noch --user=name mit drin im Aufruf, war also nicht root. Habe es entfernt ... auf einmal kam haufen Textausgaben. Ich hatte (unbeabsichtigt) noch die --boot option mit drin ☺.

Das geht jetzt also auch (inclusive ping hostname)! Bei dem Aufruf komen neben sehr vielen Ausgaben die OK sind auch noch ein paar Fehler:

[FAILED] Failed to start Remount Root and Kernel File Systems.
See 'systemctl status systemd-remount-fs.service' for details.
         Starting Flush Journal to Persistent Storage...
         Starting Load/Save Random Seed...
[FAILED] Failed to start Raise network interfaces.
See 'systemctl status networking.service' for details.
[FAILED] Failed to start Avahi mDNS/DNS-SD Stack.

Dann habe ich nochmal einen anderen Container ohne boot und ohne user probiert und die resolv.conf entfernt und wieder hinzugefügt und ping wikipedia.de ging!! apt-get install ging auch, jedoch ohne Autovervollständigung (mit tab) bei install oder dem package name (nicht weiter schlimm).

Dann wiederum ging bei beiden der Aufruf firefox nicht mehr. Im container ohne boot kam dann:

No protocol specified
Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
Error: cannot open display: :0

Nachdem ich dann container wieder beendet hatte und wieder als user gestartet ging es.

Bei dem mit der boot option ging wiederum das Display nicht mehr:

$: firefox
Error: GDK_BACKEND does not match available displays

**************************

Für die option ohne --boot einmal zusammengefasst, falls jemand anders machen möchte:

sudo systemd-nspawn --template=/ --setenv=DISPLAY=:0 --directory=/pfad/zu/container/container1 /bin/bash

dann in dem container

root@container1:/# rm /etc/resolv.conf 
root@container1:/# echo "nameserver 8.8.8.8">/etc/resolv.conf

dann kann man wieder beenden und mit

sudo systemd-nspawn --template=/ --user=username --setenv=DISPLAY=:0 --directory=/pfad/zu/container/container1 /bin/bash

wieder starten. Danach geht

username@container1:/# firefox
username@container1:/# ping wikipedia
Antworten |