Βασικά χαρακτηριστικά των συστημάτων κοντέινερ LXD - Linux
Lxd είναι ο διαχειριστής κοντέινερ συστήματος επόμενης γενιάς, έτσι λέει πηγή. Προσφέρει μια διεπαφή χρήστη παρόμοια με τις εικονικές μηχανές, αλλά χρησιμοποιεί κοντέινερ Linux.
Πυρήνας LXD είναι ένας προνομιακός δαίμονας (υπηρεσία που εκτελείται με δικαιώματα root) που παρέχει ένα REST API μέσω τοπικής υποδοχής unix, καθώς και μέσω του δικτύου εάν έχει εγκατασταθεί η κατάλληλη διαμόρφωση. Οι πελάτες, όπως το εργαλείο γραμμής εντολών που παρέχεται με το LXD, υποβάλλουν αιτήματα μέσω αυτού του REST API. Αυτό σημαίνει ότι είτε έχετε πρόσβαση σε έναν τοπικό υπολογιστή είτε σε έναν απομακρυσμένο κεντρικό υπολογιστή, όλα λειτουργούν το ίδιο.
Σε αυτό το άρθρο δεν θα σταθούμε λεπτομερώς στις έννοιες του LXD, δεν θα εξετάσουμε όλες τις διαθέσιμες δυνατότητες που περιγράφονται στην τεκμηρίωση, συμπεριλαμβανομένης της πρόσφατης υλοποίησης στις πιο πρόσφατες εκδόσεις του LXD υποστήριξης για εικονικές μηχανές QEMU παράλληλα με κοντέινερ. Αντίθετα, θα μάθουμε μόνο τα βασικά της διαχείρισης κοντέινερ - ρύθμιση δεξαμενών αποθήκευσης, δικτύωση, λειτουργία κοντέινερ, εφαρμογή ορίων πόρων και πώς να χρησιμοποιείτε στιγμιότυπα, ώστε να μπορείτε να κατανοήσετε βασικά το LXD και να χρησιμοποιήσετε κοντέινερ στο Linux.
Για πλήρεις πληροφορίες, ανατρέξτε στην επίσημη πηγή:
Αυτό σημαίνει ότι δύο πακέτα θα εγκατασταθούν ταυτόχρονα, το ένα ως πακέτο συστήματος και το άλλο ως πακέτο snap. Η εγκατάσταση δύο πακέτων σε ένα σύστημα μπορεί να δημιουργήσει κάποιο πρόβλημα όπου το πακέτο συστήματος μπορεί να μείνει ορφανό εάν το πακέτο snap αφαιρεθεί από τον διαχειριστή πακέτων snap.
Βρείτε πακέτο lxd στο αποθετήριο snap μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:
snap find lxd
Name Version Summary
lxd 3.21 System container manager and API
lxd-demo-server 0+git.6d54658 Online software demo sessions using LXD
nova ocata OpenStack Compute Service (nova)
nova-hypervisor ocata OpenStack Compute Service - KVM Hypervisor (nova)
distrobuilder 1.0 Image builder for LXC and LXD
fabrica 0.1 Build snaps by simply pointing a web form to...
satellite 0.1.2 Advanced scalable Open source intelligence platform
Εκτελώντας την εντολή list μπορείτε να βεβαιωθείτε ότι το πακέτο lxd δεν έχει εγκατασταθεί ακόμα:
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ core
Παρά το γεγονός ότι το LXD είναι ένα snap πακέτο, πρέπει να εγκατασταθεί μέσω του πακέτου συστήματος lxd, το οποίο θα δημιουργήσει την αντίστοιχη ομάδα στο σύστημα, τα απαραίτητα βοηθητικά προγράμματα στο /usr/bin κλπ.
sudo apt update
sudo apt install lxd
Ας βεβαιωθούμε ότι το πακέτο έχει εγκατασταθεί ως snap πακέτο:
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ core
lxd 3.21 13474 stable/… canonical✓ -
Για να εγκαταστήσετε το πακέτο LXD στο σύστημα, πρέπει να εκτελέσετε τις ακόλουθες εντολές, η πρώτη θα ενημερώσει τη λίστα των πακέτων στο σύστημα που είναι διαθέσιμη στο αποθετήριο, η δεύτερη θα εγκαταστήσει απευθείας το πακέτο:
sudo pacman -Syyu && sudo pacman -S lxd
Μετά την εγκατάσταση του πακέτου, για τη διαχείριση του LXD από έναν κανονικό χρήστη, πρέπει να προστεθεί στην ομάδα συστήματος lxd:
sudo usermod -a -G lxd user1
Ας βεβαιωθούμε ότι ο χρήστης user1 προστέθηκε στην ομάδα lxd:
id -Gn user1
user1 adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd
Αν η ομάδα lxd δεν είναι ορατή στη λίστα, τότε πρέπει να ενεργοποιήσετε ξανά την περίοδο λειτουργίας χρήστη. Για να το κάνετε αυτό, πρέπει να αποσυνδεθείτε και να συνδεθείτε στον ίδιο χρήστη.
Ενεργοποίηση σε systemd φόρτωση της υπηρεσίας LXD κατά την εκκίνηση του συστήματος:
Πριν ξεκινήσει η προετοιμασία, πρέπει να κατανοήσουμε πώς είναι λογικά διατεταγμένη η αποθήκευση στο LXD.
Αποθήκευση (Αποθηκευτικός χώρος) состоит από ένα ή περισσότερα πισίνα αποθήκευσης που χρησιμοποιεί ένα από τα υποστηριζόμενα συστήματα αρχείων όπως ZFS, BTRFS, LVM ή κανονικούς καταλόγους. Κάθε πισίνα αποθήκευσης χωρίζεται σε τόμους (Όγκος αποθήκευσης) που περιέχουν εικόνες, κοντέινερ ή δεδομένα για άλλους σκοπούς.
Εικόνες - αυτές είναι ειδικά συναρμολογημένες διανομές χωρίς τον πυρήνα Linux και διατίθενται από εξωτερικές πηγές
εμπορευματοκιβώτια - πρόκειται για αναπτυγμένες διανομές από εικόνες, έτοιμες για χρήση
Στιγμιότυπα - αυτά είναι στιγμιότυπα της κατάστασης των κοντέινερ στα οποία μπορείτε να επιστρέψετε
Για να διαχειριστείτε τον χώρο αποθήκευσης στο LXD, χρησιμοποιήστε την εντολή lxc storage ένα πιστοποιητικό για το οποίο μπορείτε να αποκτήσετε καθορίζοντας το κλειδί - lxc storage --help
Η ακόλουθη εντολή εμφανίζει μια λίστα με όλα πισίνα αποθήκευσης σε αποθήκευση LXD:
lxc storage list
+---------+-------------+--------+--------------------------------+---------+
| NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool | | btrfs | /dev/loop1 | 2 |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool | | btrfs | /var/lib/lxd/disks/ssdpool.img | 4 |
+---------+-------------+--------+--------------------------------+---------+
Για να δείτε μια λίστα με όλα Όγκος αποθήκευσης στο επιλεγμένο πισίνα αποθήκευσης εξυπηρετεί την ομάδα lxc storage volume list:
lxc storage volume list hddpool
+-------+----------------------------------+-------------+---------+
| TYPE | NAME | DESCRIPTION | USED BY |
+-------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... | | 1 |
+-------+----------------------------------+-------------+---------+
lxc storage volume list ssdpool
+-----------+----------------------------------+-------------+---------+
| TYPE | NAME | DESCRIPTION | USED BY |
+-----------+----------------------------------+-------------+---------+
| container | alp3 | | 1 |
+-----------+----------------------------------+-------------+---------+
| container | jupyter | | 1 |
+-----------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... | | 1 |
+-----------+----------------------------------+-------------+---------+
Επίσης, εάν για πισίνα αποθήκευσης Κατά τη δημιουργία, επιλέχθηκε το σύστημα αρχείων BTRFS και, στη συνέχεια, λάβετε μια λίστα Όγκος αποθήκευσης ή υποτομείς στην ερμηνεία BTRFS, μπορείτε να χρησιμοποιήσετε την εργαλειοθήκη αυτού του συστήματος αρχείων:
sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/hddpool
ID 257 gen 818 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/ssdpool
ID 257 gen 1820 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
ID 260 gen 1819 parent 5 top level 5 path containers/jupyter
ID 263 gen 1820 parent 5 top level 5 path containers/alp3
Πριν δημιουργήσετε και χρησιμοποιήσετε κοντέινερ, πρέπει να εκτελέσετε μια γενική προετοιμασία LXD που δημιουργεί και διαμορφώνει το δίκτυο και την αποθήκευση. Αυτό μπορεί να γίνει χειροκίνητα χρησιμοποιώντας τυπικές εντολές πελάτη που είναι διαθέσιμες στη λίστα καλώντας την εντολή lxc --help ή χρησιμοποιώντας τον οδηγό προετοιμασίας lxd init απαντώντας σε μερικές ερωτήσεις.
Κατά την αρχικοποίηση, το LXD θέτει πολλές ερωτήσεις, συμπεριλαμβανομένου του προσδιορισμού του τύπου συστήματος αρχείων για την προεπιλογή πισίνα αποθήκευσης. Από προεπιλογή, το σύστημα αρχείων BTRFS είναι επιλεγμένο για αυτό. Θα είναι αδύνατη η αλλαγή σε άλλο FS μετά τη δημιουργία. Για να επιλέξετε ένα FS προτείνεται πίνακας σύγκρισης χαρακτηριστικών:
Πρόγραμμα οδήγησης αποθήκευσης που μπορεί να χρησιμοποιηθεί μέσα σε ένα δοχείο
Ναί
Ναί
Όχι.
Όχι.
Όχι.
Επαναφορά από παλαιότερα στιγμιότυπα (όχι πιο πρόσφατα)
Ναί
Ναί
Ναί
Όχι.
Ναί
Ποσοστώσεις αποθήκευσης
Ναί(*)
Ναί
Ναί
Ναί
Όχι.
Εκκίνηση του δικτύου και του Storage Pool χρησιμοποιώντας τον οδηγό ^
Η επόμενη εντολή που θα εξετάσουμε προτείνει τη ρύθμιση των κύριων στοιχείων του LXD απαντώντας σε απλές ερωτήσεις χρησιμοποιώντας τον οδηγό προετοιμασίας.
Εκτέλεση εντολής lxc init και εισαγάγετε τις απαντήσεις στις ερωτήσεις μετά την άνω και κάτω τελεία, όπως φαίνεται στο παρακάτω παράδειγμα ή αλλάξτε τις σύμφωνα με τις συνθήκες σας:
lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]: ssdpool
Name of the storage backend to use (lvm, btrfs, dir) [default=btrfs]:
Create a new BTRFS pool? (yes/no) [default=yes]:
Would you like to use an existing block device? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=15GB]: 10GB
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 10.0.5.1/24
Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] no
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
Στο προηγούμενο βήμα δημιουργήσαμε πισίνα αποθήκευσης στο οποίο δόθηκε το όνομα ssdpool και το αρχείο του οποίου βρίσκεται στο σύστημά μου στο /var/lib/lxd/disks/ssdpool.img. Αυτή η διεύθυνση συστήματος αρχείων αντιστοιχεί στη φυσική μονάδα SSD στον υπολογιστή μου.
Οι ακόλουθες ενέργειες, για να διευρύνει την κατανόηση του ρόλου που διαδραματίζει πισίνα αποθήκευσης στο αποθετήριο, θα δημιουργήσουμε ένα δεύτερο πισίνα αποθήκευσης που θα βρίσκεται φυσικά σε διαφορετικό τύπο δίσκου, HDD. Το πρόβλημα είναι ότι το LXD δεν σας επιτρέπει να δημιουργήσετε πισίνα αποθήκευσης εκτός διεύθυνσης /var/lib/lxd/disks/ και ακόμη και οι συμβολικοί σύνδεσμοι δεν θα λειτουργήσουν, δείτε την απάντηση του προγραμματιστή. Μπορούμε να παρακάμψουμε αυτόν τον περιορισμό κατά την προετοιμασία/μορφοποίηση πισίνα αποθήκευσης καθορίζοντας την τιμή ως συσκευή μπλοκ αντί για τη διαδρομή προς το αρχείο loopback, προσδιορίζοντας αυτό στο κλειδί source.
Έτσι, πριν δημιουργήσετε πισίνα αποθήκευσης πρέπει να ορίσετε ένα αρχείο loopback ή ένα υπάρχον διαμέρισμα στο σύστημα αρχείων σας που θα χρησιμοποιεί. Για να γίνει αυτό, θα δημιουργήσουμε και θα χρησιμοποιήσουμε ένα αρχείο που θα περιορίσουμε σε μέγεθος στα 10 GB:
dd if=/dev/zero of=/mnt/work/lxd/hddpool.img bs=1MB count=10000
10000+0 records in
10000+0 records out
10000000000 bytes (10 GB, 9,3 GiB) copied, 38,4414 s, 260 MB/s
Ας συνδέσουμε το αρχείο loopback σε μια δωρεάν συσκευή loopback:
Χάρη στο κλειδί --show εκτελώντας την εντολή επιστρέφει στην οθόνη το όνομα της συσκευής στην οποία είναι συνδεδεμένο το αρχείο μας loopback. Εάν είναι απαραίτητο, μπορούμε να εμφανίσουμε μια λίστα με όλες τις απασχολημένες συσκευές αυτού του τύπου για να βεβαιωθούμε ότι οι ενέργειές μας είναι σωστές:
Από τη λίστα μπορείτε να βρείτε ότι διαθέτει η συσκευή /dev/loop1 Περιλαμβάνεται αρχείο loopback /mnt/work/lxd/hddpool.imgκαι στη συσκευή /dev/loop0 Περιλαμβάνεται αρχείο loopback /var/lib/lxd/disks/ssdpool.img που αντιστοιχεί στην προεπιλογή πισίνα αποθήκευσης.
Η ακόλουθη εντολή δημιουργεί μια νέα πισίνα αποθήκευσης σε LXD με βάση το αρχείο loopback που μόλις ετοιμάσαμε. Το LXD θα μορφοποιήσει το αρχείο loopback /mnt/work/lxd/hddpool.img στη συσκευή /dev/loop1 για το σύστημα αρχείων BTRFS:
Μετά τη δημιουργία πισίνα αποθήκευσης, εάν είναι απαραίτητο, μπορεί να επεκταθεί. Για πισίνα αποθήκευσης με βάση το σύστημα αρχείων BTRFS, εκτελέστε τις ακόλουθες εντολές:
Αυτόματη εισαγωγή ενός αρχείου loopback σε μια υποδοχή συσκευής loopback ^
Έχουμε ένα μικρό πρόβλημα, κατά την επανεκκίνηση του συστήματος κεντρικού υπολογιστή, το αρχείο /mnt/work/lxd/hddpool.img θα «πετάξει» έξω από τη συσκευή /dev/loop1 και η υπηρεσία LXD θα διακοπεί κατά τη φόρτωση επειδή δεν θα τη δει σε αυτήν τη συσκευή. Για να λύσετε αυτό το πρόβλημα, πρέπει να δημιουργήσετε μια υπηρεσία συστήματος που θα εισάγει αυτό το αρχείο στη συσκευή /dev/loop1 κατά την εκκίνηση του συστήματος κεντρικού υπολογιστή.
Ας δημιουργήσουμε μονάδα Τύπος αρχείου υπηρεσία в /etc/systemd/system/ για το σύστημα αρχικοποίησης SystemD:
cat << EOF | sudo tee -a /etc/systemd/system/lxd-hddpool.service
[Unit]
Description=Losetup LXD Storage Pool (hddpool)
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img
RemainAfterExit=true
[Install]
WantedBy=local-fs.target
EOF
Ενεργοποιήστε την υπηρεσία:
sudo systemctl enable lxd-hddpool
Created symlink /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.
Μετά την επανεκκίνηση του συστήματος κεντρικού υπολογιστή, ελέγχουμε την κατάσταση της υπηρεσίας:
systemctl status lxd-hddpool.service
● lxd-hddpool.service - Losetup LXD Storage Pool (hddpool)
Loaded: loaded (/etc/systemd/system/lxd-hddpool.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2020-04-08 03:43:53 MSK; 1min 37s ago
Process: 711 ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img (code=exited, status=0/SUCCESS)
Main PID: 711 (code=exited, status=0/SUCCESS)
апр 08 03:43:52 manjaro systemd[1]: Starting Losetup LXD Storage Pool (hddpool)...
апр 08 03:43:53 manjaro systemd[1]: Finished Losetup LXD Storage Pool (hddpool).
Από την έξοδο μπορούμε να επαληθεύσουμε ότι η κατάσταση υπηρεσίας είναι ενεργός, παρά το γεγονός ότι ολοκληρώθηκε η εκτέλεση του σεναρίου μας από μία εντολή, η επιλογή μας επέτρεψε να το κάνουμε αυτό RemainAfterExit=true.
Δεδομένου ότι όλες οι διεργασίες κοντέινερ εκτελούνται πραγματικά μεμονωμένα στο κεντρικό σύστημα χρησιμοποιώντας τον πυρήνα του, για την περαιτέρω προστασία της πρόσβασης των διεργασιών κοντέινερ στο κεντρικό σύστημα, η LXD προσφέρει προνόμια διεργασίας, όπου:
Προνομιακά Εμπορευματοκιβώτια - πρόκειται για κοντέινερ στα οποία οι διεργασίες με UID και GID αντιστοιχούν στον ίδιο κάτοχο με το κεντρικό σύστημα. Για παράδειγμα, μια διεργασία που εκτελείται σε ένα κοντέινερ με UID 0 έχει όλα τα ίδια δικαιώματα πρόσβασης με μια διεργασία στο κεντρικό σύστημα με UID 0. Με άλλα λόγια, ο χρήστης root στο κοντέινερ έχει όλα τα δικαιώματα όχι μόνο στο το κοντέινερ, αλλά και στο κεντρικό σύστημα, εάν μπορεί να βγει έξω από τον απομονωμένο χώρο ονομάτων του κοντέινερ.
Μη προνομιούχα κοντέινερ - πρόκειται για κοντέινερ στα οποία οι διεργασίες ανήκουν στον κάτοχο του UID και του GID με αριθμό από 0 έως 65535, αλλά για το κεντρικό σύστημα ο κάτοχος καλύπτεται χρησιμοποιώντας τα προστιθέμενα bit SubUID και SubGID, αντίστοιχα. Για παράδειγμα, ένας χρήστης με UID=0 σε ένα κοντέινερ θα εμφανίζεται στο κεντρικό σύστημα ως SubUID + UID. Αυτό προστατεύει το κεντρικό σύστημα επειδή εάν οποιαδήποτε διεργασία στο κοντέινερ μπορεί να διαφύγει από τον απομονωμένο χώρο ονομάτων της, μπορεί να επικοινωνήσει μόνο με το κεντρικό σύστημα ως διεργασία με ένα άγνωστο, πολύ υψηλό UID/GID.
Από προεπιλογή, τα κοντέινερ που δημιουργήθηκαν πρόσφατα έχουν μη προνομιακή κατάσταση και επομένως πρέπει να ορίσουμε ένα SubUID και SubGID.
Ας δημιουργήσουμε δύο αρχεία διαμόρφωσης στα οποία θα ορίσουμε τη μάσκα για SubUID και SubGID, αντίστοιχα:
Εφόσον αρχικοποιήσαμε προηγουμένως το δίκτυο χρησιμοποιώντας τον οδηγό προετοιμασίας lxd init και δημιούργησε μια συσκευή δικτύου lxdbr0, τότε σε αυτή την ενότητα απλά θα εξοικειωθούμε με τη δικτύωση στο LXD και πώς να δημιουργήσουμε έναν εικονικό διακόπτη (γέφυρα) χρησιμοποιώντας την εντολή πελάτη.
Το παρακάτω διάγραμμα δείχνει πώς ένας διακόπτης (γέφυρα) συνδέει τον κεντρικό υπολογιστή και τα κοντέινερ σε ένα δίκτυο:
Τα κοντέινερ μπορούν να επικοινωνούν μέσω δικτύου με άλλα κοντέινερ ή με τον κεντρικό υπολογιστή στον οποίο εξυπηρετούνται αυτά τα κοντέινερ. Για να γίνει αυτό, πρέπει να συνδέσετε τις εικονικές κάρτες δικτύου των κοντέινερ με έναν εικονικό διακόπτη. Θα δημιουργήσουμε πρώτα έναν διακόπτη και οι διεπαφές δικτύου του κοντέινερ θα συνδεθούν σε επόμενα κεφάλαια, αφού δημιουργηθεί το ίδιο το κοντέινερ.
Η ακόλουθη εντολή δημιουργεί έναν διακόπτη με ένα υποδίκτυο 10.0.5.0/24 και διεύθυνση IPv4 10.0.5.1/24, και περιλαμβάνει επίσης ipv4.nat ώστε τα κοντέινερ να έχουν πρόσβαση στο Διαδίκτυο μέσω του κεντρικού υπολογιστή χρησιμοποιώντας την υπηρεσία NAT:
Κάθε κοντέινερ στο LXD έχει τη δική του διαμόρφωση και μπορεί να την επεκτείνει με καθολικά δηλωμένες διαμορφώσεις που ονομάζονται προφίλ διαμόρφωσης. Η εφαρμογή προφίλ διαμόρφωσης σε ένα κοντέινερ έχει ένα μοντέλο καταρράκτη, το παρακάτω παράδειγμα δείχνει αυτό:
Σε αυτό το παράδειγμα, τρία προφίλ έχουν δημιουργηθεί στο σύστημα LXD: default, hddpool и hostfs. Και τα τρία προφίλ εφαρμόζονται σε ένα κοντέινερ που έχει τοπική διαμόρφωση (γκρι περιοχή). Προφίλ default έχει συσκευή root που έχει μια παράμετρο pool ισούται με ssdpool, αλλά χάρη στο μοντέλο εφαρμογής διαμόρφωσης καταρράκτη, μπορούμε να εφαρμόσουμε ένα προφίλ στο κοντέινερ hddpool που έχει μια παράμετρο pool θα αντικαταστήσει την ίδια παράμετρο από το προφίλ default και το κοντέινερ θα λάβει τη διαμόρφωση της συσκευής root με παράμετρο pool ίσος hddpoolκαι το προφίλ hostfs απλά προσθέτει μια νέα συσκευή στο κοντέινερ.
Για να δείτε τη λίστα με τα διαθέσιμα προφίλ διαμόρφωσης, χρησιμοποιήστε την ακόλουθη εντολή:
lxc profile list
+---------+---------+
| NAME | USED BY |
+---------+---------+
| default | 1 |
+---------+---------+
| hddroot | 0 |
+---------+---------+
| ssdroot | 1 |
+---------+---------+
Μπορείτε να λάβετε μια πλήρη λίστα με τις διαθέσιμες εντολές για εργασία με ένα προφίλ προσθέτοντας το κλειδί --help:
lxc profile --help
Description:
Manage profiles
Usage:
lxc profile [command]
Available Commands:
add Add profiles to instances
assign Assign sets of profiles to instances
copy Copy profiles
create Create profiles
delete Delete profiles
device Manage instance devices
edit Edit profile configurations as YAML
get Get values for profile configuration keys
list List profiles
remove Remove profiles from instances
rename Rename profiles
set Set profile configuration keys
show Show profile configurations
unset Unset profile configuration keys
Προεπιλεγμένο προφίλ διαμόρφωσης default δεν έχει διαμόρφωση κάρτας δικτύου για το κοντέινερ και όλα τα κοντέινερ που δημιουργήθηκαν πρόσφατα δεν έχουν δίκτυο, για αυτούς είναι απαραίτητο να δημιουργήσουμε τοπικές (αποκλειστικές) συσκευές δικτύου με ξεχωριστή εντολή, αλλά μπορούμε να δημιουργήσουμε μια καθολική συσκευή δικτύου στη διαμόρφωση προφίλ που θα είναι κοινόχρηστο μεταξύ όλων των κοντέινερ που χρησιμοποιούν αυτό το προφίλ. Με αυτόν τον τρόπο, αμέσως μετά την εντολή δημιουργίας νέου κοντέινερ, θα έχουν δίκτυο με πρόσβαση δικτύου. Ταυτόχρονα, δεν υπάρχουν περιορισμοί· μπορούμε πάντα να δημιουργήσουμε μια συσκευή τοπικού δικτύου αργότερα, εάν χρειαστεί.
Η ακόλουθη εντολή θα προσθέσει τη συσκευή στο προφίλ διαμόρφωσης eth0 Τύπος nic συνδεδεμένο στο δίκτυο lxdbr0:
lxc profile device add default eth0 nic network=lxdbr0 name=eth0
Είναι σημαντικό να σημειωθεί ότι εφόσον στην πραγματικότητα προσθέσαμε τη συσκευή στο προφίλ διαμόρφωσης, εάν καθορίσαμε μια στατική διεύθυνση IP στη συσκευή, τότε όλα τα κοντέινερ που θα χρησιμοποιούν αυτό το προφίλ θα μοιράζονται την ίδια διεύθυνση IP. Εάν υπάρχει ανάγκη να δημιουργήσετε ένα κοντέινερ με μια στατική διεύθυνση IP που έχει εκχωρηθεί για το κοντέινερ, τότε θα πρέπει να δημιουργήσετε μια διαμόρφωση συσκευής δικτύου σε επίπεδο κοντέινερ (τοπική διαμόρφωση) με την παράμετρο διεύθυνσης IP και όχι σε επίπεδο προφίλ.
Ας ελέγξουμε το προφίλ:
lxc profile show default
config: {}
description: Default LXD profile
devices:
eth0:
name: eth0
network: lxdbr0
type: nic
root:
path: /
pool: ssdpool
type: disk
name: default
used_by: []
Σε αυτό το προφίλ μπορούμε να δούμε ότι για όλα τα κοντέινερ που δημιουργήθηκαν πρόσφατα θα δημιουργηθούν δύο συσκευές:
eth0 - Τύπος συσκευής nic συνδεδεμένο σε διακόπτη (γέφυρα δικτύου) lxdbr0
root - Τύπος συσκευής disk που χρησιμοποιεί μια πισίνα αποθήκευσης ssdpool
Για χρήση που δημιουργήθηκε προηγουμένως πισίνα αποθήκευσης κοντέινερ, δημιουργήστε ένα προφίλ διαμόρφωσης ssdroot στο οποίο θα προσθέσουμε μια συσκευή όπως disk με σημείο τοποθέτησης / (root) χρησιμοποιώντας το προηγουμένως δημιουργημένο πισίνα αποθήκευσης - ssdpool:
Τα κοντέινερ δημιουργούνται από εικόνες που είναι ειδικά συναρμολογημένες διανομές που δεν έχουν πυρήνα Linux. Επομένως, πριν από την εκτέλεση του κοντέινερ, πρέπει να αναπτυχθεί από αυτήν την εικόνα. Η πηγή των εικόνων είναι ένα τοπικό αποθετήριο στο οποίο γίνεται λήψη εικόνων από εξωτερικά αποθετήρια.
Για να εμφανίσουμε έναν περιορισμένο αριθμό στηλών χρησιμοποιήσαμε την επιλογή -c με παραμέτρους dasut, και περιόρισε επίσης το μήκος της λίστας με την εντολή head.
Το φιλτράρισμα είναι διαθέσιμο για την εμφάνιση μιας λίστας εικόνων. Η ακόλουθη εντολή θα εμφανίσει όλες τις διαθέσιμες αρχιτεκτονικές διανομής AlpineLinux:
Για να ξεκινήσετε να χρησιμοποιείτε το κοντέινερ, πρέπει να προσθέσετε μια εικόνα από το καθολικό αποθετήριο στο τοπικό local:. Τώρα το τοπικό αποθετήριο είναι άδειο, η εντολή θα βεβαιωθεί για αυτό lxc image list. Εάν η μέθοδος list μην καθορίσετε αποθετήριο, τότε το τοπικό αποθετήριο θα χρησιμοποιηθεί από προεπιλογή - local:
lxc image list local:
+-------+-------------+--------+-------------+--------------+------+------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE |
+-------+-------------+--------+-------------+--------------+------+------+
Η διαχείριση των εικόνων στο αποθετήριο γίνεται με τις ακόλουθες μεθόδους:
Εκτός από τη διαδραστική λειτουργία, το LXD υποστηρίζει επίσης μια μη διαδραστική λειτουργία εγκατάστασης διαμόρφωσης, αυτή είναι όταν η διαμόρφωση καθορίζεται με τη μορφή αρχείου YAML, μια ειδική μορφή που σας επιτρέπει να εγκαταστήσετε ολόκληρη τη διαμόρφωση ταυτόχρονα, παρακάμπτοντας την εκτέλεση από πολλές διαδραστικές εντολές που συζητήθηκαν παραπάνω σε αυτό το άρθρο, συμπεριλαμβανομένης της διαμόρφωσης δικτύου, της δημιουργίας προφίλ διαμόρφωσης κ.λπ. Δεν θα καλύψουμε αυτήν την περιοχή εδώ, μπορείτε να την ελέγξετε μόνοι σας. στην τεκμηρίωση.
Επόμενη διαδραστική εντολή lxc config που θα δούμε σας επιτρέπει να ορίσετε τη διαμόρφωση. Για παράδειγμα, για να διασφαλίσουμε ότι οι ληφθείσες εικόνες στο τοπικό αποθετήριο δεν ενημερώνονται αυτόματα από τα καθολικά αποθετήρια, μπορούμε να ενεργοποιήσουμε αυτήν τη συμπεριφορά με την ακόλουθη εντολή:
Για να δημιουργήσετε ένα κοντέινερ χρησιμοποιήστε την εντολή lxc init στις οποίες μεταβιβάζονται οι τιμές репозиторий:образ και μετά το επιθυμητό αναγνωριστικό για το κοντέινερ. Το αποθετήριο μπορεί να οριστεί ως τοπικό local: το ίδιο και κάθε παγκόσμιο. Εάν το αποθετήριο δεν έχει καθοριστεί, τότε από προεπιλογή το τοπικό αποθετήριο χρησιμοποιείται για την αναζήτηση της εικόνας. Εάν η εικόνα έχει καθοριστεί από το καθολικό αποθετήριο, τότε η εικόνα θα μεταφορτωθεί πρώτα στο τοπικό αποθετήριο και στη συνέχεια θα χρησιμοποιηθεί για τη δημιουργία του κοντέινερ.
Ας εκτελέσουμε την ακόλουθη εντολή για να δημιουργήσουμε το πρώτο μας κοντέινερ:
lxc init alpine3 alp --storage=hddpool --profile=default --profile=hddroot
Ας δούμε τα πλήκτρα εντολών που χρησιμοποιούμε εδώ με τη σειρά:
alpine3 — Καθορίζεται ένα ψευδώνυμο (ψευδώνυμο) για την εικόνα που είχε προηγουμένως μεταφορτωθεί στο τοπικό αποθετήριο. Εάν το ψευδώνυμο δεν δημιουργήθηκε για αυτήν την εικόνα, τότε μπορείτε πάντα να ανατρέχετε στην εικόνα από αυτήν Δακτυλικό αποτύπωμα που εμφανίζεται στον πίνακα.
alp — Ορίζει το αναγνωριστικό για το κοντέινερ
--storage — Αυτό το πλήκτρο υποδεικνύει σε ποια πισίνα αποθήκευσης θα δημιουργηθεί ένα δοχείο
--profile — Αυτά τα πλήκτρα διαδοχικά εφαρμόζουν διαμόρφωση από προφίλ διαμόρφωσης που δημιουργήθηκαν προηγουμένως στο κοντέινερ
Εκκινούμε το κοντέινερ, το οποίο ξεκινά να εκκινεί το αρχικό σύστημα της διανομής:
lxc start alp
Μπορείτε επίσης να χρησιμοποιήσετε την εντολή lxc launch που σας επιτρέπει να συνδυάζετε ομάδες lxc init и lxc start σε μια επέμβαση.
Έλεγχος της κατάστασης του δοχείου:
lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| NAME | STATE | IPV4 | IPV6 | TYPE | STORAGE POOL |
+------+---------+------------------+------+-----------+--------------+
| alp | RUNNING | 10.0.5.46 (eth0) | | CONTAINER | hddpool |
+------+---------+------------------+------+-----------+--------------+
Στην ενότητα profiles μπορούμε να βεβαιωθούμε ότι αυτό το κοντέινερ χρησιμοποιεί δύο προφίλ διαμόρφωσης − default и hddroot. Στο τμήμα devices μπορούμε να εντοπίσουμε μόνο μία συσκευή επειδή η συσκευή δικτύου δημιουργήθηκε σε επίπεδο προφίλ default. Για να δείτε όλες τις συσκευές που χρησιμοποιούνται από το κοντέινερ, πρέπει να προσθέσετε ένα κλειδί --expanded:
Εάν προσπαθήσουμε να ορίσουμε μια διεύθυνση IP για μια συσκευή δικτύου eth0 ομάδα lxc config device set alp που προορίζεται για τη διαμόρφωση του κοντέινερ, τότε θα λάβουμε ένα σφάλμα που θα αναφέρει ότι η συσκευή δεν υπάρχει επειδή η συσκευή eth0 που χρησιμοποιείται από το δοχείο ανήκει στο προφίλ default:
lxc config device set alp eth0 ipv4.address 10.0.5.5
Error: The device doesn't exist
Μπορούμε φυσικά να ορίσουμε μια στατική διεύθυνση IP για eth0 συσκευές στο προφίλ, αλλά θα είναι το ίδιο για όλα τα κοντέινερ που θα χρησιμοποιούν αυτό το προφίλ. Επομένως, ας προσθέσουμε μια συσκευή αφιερωμένη στο κοντέινερ:
lxc config device add alp eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5
Στη συνέχεια, πρέπει να επανεκκινήσετε το κοντέινερ:
lxc restart alp
Αν κοιτάξουμε τώρα τη διαμόρφωση του κοντέινερ, δεν χρειάζεται να χρησιμοποιήσουμε την επιλογή --expanded για να δείτε τη συσκευή δικτύου eth0, αφού το δημιουργήσαμε σε επίπεδο κοντέινερ και πέρασε σε καταρράκτη στην ίδια συσκευή από το προφίλ default:
Για να αφαιρέσετε ένα κοντέινερ, χρησιμοποιήστε την εντολή lxc delete, αλλά πριν αφαιρέσετε το κοντέινερ, πρέπει να σταματήσει χρησιμοποιώντας την εντολή lxc stop:
lxc stop alp
lxc list
+------+---------+-------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+-------------------+------+-----------+-----------+
| alp | STOPPED | 10.0.5.10 (eth0) | | CONTAINER | 0 |
+------+---------+-------------------+------+-----------+-----------+
Αφού επαληθεύσουμε ότι η κατάσταση του κοντέινερ έχει γίνει ΣΤΑΜΑΤΗΣΕ, μπορεί να αφαιρεθεί από πισίνα αποθήκευσης:
Για να εκτελέσετε απευθείας εντολές σε ένα κοντέινερ, παρακάμπτοντας τις συνδέσεις δικτύου, χρησιμοποιήστε την εντολή lxc exec που εκτελεί εντολές στο κοντέινερ χωρίς να εκκινήσει το κέλυφος του συστήματος. Εάν χρειάζεται να εκτελέσετε μια εντολή σε ένα φλοιό χρησιμοποιώντας μοτίβα φλοιού όπως μεταβλητές, ανακατευθύνσεις αρχείων (σωλήνας) κ.λπ., τότε πρέπει να εκκινήσετε ρητά το φλοιό και να περάσετε την εντολή ως κλειδί, για παράδειγμα:
lxc exec alp -- /bin/sh -c "echo $HOME"
Η εντολή χρησιμοποιούσε έναν ειδικό χαρακτήρα διαφυγής για ιδιαίτερο χαρακτήρα $ ώστε η μεταβλητή $HOME δεν ερμηνεύτηκε στον κεντρικό υπολογιστή, αλλά ερμηνεύτηκε μόνο μέσα στο δοχείο.
Είναι επίσης δυνατό να ξεκινήσετε τη διαδραστική λειτουργία κελύφους και στη συνέχεια να τερματίσετε τη συνεδρία εκτελώντας το πλήκτρο πρόσβασης CTRL+D:
Στο LXD, μπορείτε να διαχειριστείτε πόρους κοντέινερ χρησιμοποιώντας ένα ειδικό σύνολο ρυθμίσεων. Μπορείτε να βρείτε μια πλήρη λίστα παραμέτρων διαμόρφωσης κοντέινερ στην τεκμηρίωση.
Παράμετρος limits.memory περιορίζει την ποσότητα μνήμης RAM που είναι διαθέσιμη στο κοντέινερ. Η τιμή είναι ένας αριθμός και ένα από διαθέσιμα επιθήματα.
Ας ορίσουμε το όριο RAM του κοντέινερ στα 256 MB:
lxc config set alp limits.memory 256MB
Επίσης, υπάρχουν και άλλες παράμετροι για τον περιορισμό της μνήμης:
limits.memory.enforce
limits.memory.hugepages
limits.memory.swap
limits.memory.swap.priority
Ομάδα lxc config show σας επιτρέπει να εμφανίσετε ολόκληρη τη διαμόρφωση του κοντέινερ, συμπεριλαμβανομένου του εφαρμοζόμενου ορίου πόρων που ορίστηκε:
Υπάρχουν διάφοροι τρόποι περιορισμού των πόρων της CPU. τύπους περιορισμών:
limit.cpu - συνδέει ένα δοχείο σε έναν ή περισσότερους πυρήνες CPU
limits.cpu.allowance - διαχειρίζεται είτε τα ποσοστά προγραμματιστή CFS όταν έχει παρέλθει το χρονικό όριο είτε τον καθολικό μηχανισμό κοινής χρήσης πόρων της CPU όταν έχει παρέλθει το ποσοστό
limits.cpu.priority - Προτεραιότητα προγραμματιστή όταν σε πολλαπλές παρουσίες που μοιράζονται ένα σύνολο επεξεργαστών εκχωρείται το ίδιο ποσοστό επεξεργαστών
Εκτός από περιορισμούς όπως limits.read, limits.write μπορούμε επίσης να περιορίσουμε την ποσότητα του χώρου στο δίσκο που καταναλώνεται από το κοντέινερ (λειτουργεί μόνο με ZFS ή BTRFS):
lxc config device set alp root size=2GB
Μετά την εγκατάσταση, στην παράμετρο devices.root.size Μπορούμε να επαληθεύσουμε το καθορισμένο όριο:
lxc config show alp
...
devices:
root:
path: /
pool: hddpool
size: 2GB
type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""
Για να προβάλουμε τα χρησιμοποιημένα όρια δίσκου μπορούμε να πάρουμε από την εντολή lxc info:
lxc info alp
...
Resources:
Processes: 5
Disk usage:
root: 1.05GB
CPU usage:
CPU usage (in seconds): 1
Memory usage:
Memory (current): 5.46MB
Network usage:
eth0:
Bytes received: 802B
Bytes sent: 1.59kB
Packets received: 4
Packets sent: 14
lo:
Bytes received: 0B
Bytes sent: 0B
Packets received: 0
Packets sent: 0
Παρά το γεγονός ότι έχουμε θέσει ένα όριο για τη συσκευή root του κοντέινερ στα 2 GB, βοηθητικά προγράμματα συστήματος όπως π.χ. df δεν θα δει αυτόν τον περιορισμό. Για να γίνει αυτό, θα πραγματοποιήσουμε μια μικρή δοκιμή και θα μάθουμε πώς λειτουργεί.
Ας δημιουργήσουμε 2 νέα ίδια δοχεία στο ίδιο πισίνα αποθήκευσης (hddpool):
lxc exec alp1 -- ls -lh
total 1000M
-rw-r--r-- 1 root root 1000.0M Mar 27 10:16 file.img
Αν κοιτάξουμε στο δεύτερο κοντέινερ, ελέγξουμε την ύπαρξη αρχείου στην ίδια θέση, τότε αυτό το αρχείο δεν θα είναι εκεί, κάτι που είναι αναμενόμενο, αφού τα κοντέινερ δημιουργούνται από μόνα τους Όγκος αποθήκευσης στο ίδιο πισίνα αποθήκευσης:
lxc exec alp2 -- ls -lh
total 0
Ας συγκρίνουμε όμως τις αξίες που παράγει df στο ένα και στο άλλο δοχείο:
lxc exec alp1 -- df -hT
Filesystem Type Size Used Available Use% Mounted on
/dev/loop1 btrfs 9.3G 1016.4M 7.8G 11% /
...
lxc exec alp2 -- df -hT
Filesystem Type Size Used Available Use% Mounted on
/dev/loop1 btrfs 9.3G 1016.4M 7.8G 11% /
...
Συσκευή /dev/loop1 τοποθετείται όπως είναι το ριζικό διαμέρισμα πισίνα αποθήκευσης που χρησιμοποιούν αυτά τα δοχεία, έτσι μοιράζονται τον όγκο του μεταξύ δύο.
Το LXD έχει τη δυνατότητα να δημιουργεί στιγμιότυπα και να επαναφέρει την κατάσταση του κοντέινερ από αυτά.
Για να δημιουργήσετε ένα στιγμιότυπο, εκτελέστε την ακόλουθη εντολή:
lxc snapshot alp snapshot1
Η ομάδα lxc snapshot δεν υπάρχει διαθέσιμο κλειδί list, επομένως, για να δείτε τη λίστα των στιγμιότυπων, πρέπει να χρησιμοποιήσετε την εντολή που εμφανίζει γενικές πληροφορίες για το κοντέινερ:
lxc info alp
...
...
Snapshots:
snapshot1 (taken at 2020/04/08 18:18 UTC) (stateless)
Μπορείτε να επαναφέρετε ένα κοντέινερ από ένα στιγμιότυπο χρησιμοποιώντας την εντολή lxc restore προσδιορίζοντας το κοντέινερ για το οποίο θα γίνει η αποκατάσταση και το ψευδώνυμο στιγμιότυπο:
lxc restore alp snapshot1
Η ακόλουθη εντολή χρησιμοποιείται για τη διαγραφή ενός στιγμιότυπου. Λάβετε υπόψη ότι η σύνταξη της εντολής δεν είναι παρόμοια με όλες τις άλλες· εδώ πρέπει να καθορίσετε μια κάθετο προς τα εμπρός μετά το όνομα του κοντέινερ. Εάν παραληφθεί η κάθετο, τότε η εντολή διαγραφής στιγμιότυπου ερμηνεύεται ως εντολή διαγραφής κοντέινερ!
lxc delete alp/snapshot1
Στο παραπάνω παράδειγμα, εξετάσαμε τα λεγόμενα στιγμιότυπα χωρίς ιθαγένεια. Το LXD έχει έναν άλλο τύπο στιγμιότυπων - stateful, που αποθηκεύει την τρέχουσα κατάσταση όλων των διεργασιών στο κοντέινερ. Υπάρχει μια σειρά από ενδιαφέρουσες και χρήσιμες λειτουργίες που σχετίζονται με στιγμιότυπα με κατάσταση κατάστασης.