Απομακρυσμένη κλωνοποίηση δίσκου από ΠΛΗΝΕΤ σε σχολείο

Ξεκίνησε από alkisg, 18 Φεβ 2021, 08:38:47 ΠΜ

« προηγούμενο - επόμενο »

alkisg

Υποθέτουμε ότι έχουμε μια εικονική μηχανή είτε Windows είτε Linux στο ΠΛΗΝΕΤ και θέλουμε να την κλωνοποιήσουμε μέσω Internet σε ένα σχολείο. Πλέον με τις οπτικές/VDSL/ADSL γραμμές αυτό παίρνει από 5 λεπτά μέχρι λίγες ώρες.

Ο καθηγητής του σχολείου:

1) Ξεκινάει τον υπολογιστή που είναι να φορμαριστεί είτε ως LTSP client είτε μέσω live CD.

2) Στη συνέχεια δίνει απομακρυσμένη πρόσβαση στον ΥΠΛΗΝΕΤ είτε μέσω anydesk είτε με εντολές σαν τις παρακάτω:

Κώδικας: Bash
sudo apt update
sudo apt install -y x11vnc
x11vnc -connect srv1-dide.ioa.sch.gr


Ο Υπεύθυνος ΠΛΗΝΕΤ:

1) Προετοιμάζει μια εικονική μηχανή σε μορφή os-flat.vmdk. Δηλαδή τύπος δίσκου vmdk και πάγια εκχώρηση αντί για δυναμική, με το μικρότερο δυνατό μέγεθος, π.χ. 10 GB για Linux ή 20 GB για Windows. Το αρχείο βρίσκεται στο ~/VirtualBox VMs/os/os-flat.vmdk.

2) Κάνει port forward το SSH π.χ. στην θύρα 8023 και το vncviewer στη θύρα 5500.

3) Δέχεται συνδέσεις VNC με `xvnc4viewer -listen`.

3) Ανοίγει τερματικό στον απομακρυσμένο υπολογιστή και εκτελεί περίπου τις παρακάτω εντολές:

Κώδικας: Bash
# Λήψη δικαιωμάτων διαχειριστή
sudo -i
# Προβολή κατατμήσεων
lsblk --fs
# Ας πούμε ότι ο δίσκος-στόχος είναι ο /dev/sda
# Θέλουμε να ΜΗΝ είναι σε χρήση
# Αποπροσάρτηση κατατμήσεων σε χρήση
umount /dev/sda?
# Απενεργοποίηση εικονικής μνήμης
swapoff -a
# Εντολή κλωνοποίησης:
ssh -Cp8023 administrator@srv1-dide.ioa.sch.gr 'dd if="VirtualBox VMs/os/os-flat.vmdk" bs=128k' | dd of=/dev/sda bs=128k status=progress
# Τέλος, κάνουμε resize-to-fill-partitions μέσω gparted
gparted /dev/sda

alkisg

#1
Σημειώσεις:

Παραλλαγή της εντολής για αποφυγή της συμπίεσης (-C) για ταχύτερη κλωνοποίηση εντός LAN, και μάλιστα με χρήση αληθινής κατάτμησης αντί για εικονικό δίσκο. Οι `stty` είναι για να μην εμφανιστεί στην οθόνη το password που δίνουμε στην `sudo -S`:
stty -echo; ssh administrator@server sudo -S dd if=/dev/sda6 bs=128k | sudo dd of=/dev/sda6 bs=128k status=progress; stty echo

Παραλλαγή για κλωνοποίηση partition εικονικής μηχανής:
ssh alkisg@192.168.67.1 dd if=/home/Public/VMs/opensuse-leap/opensuse-leap-flat.vmdk bs=128k skip=8 | dd of=/dev/sda6 bs=128k status=progress

TODO:
Διερεύνηση για χρήση python web server + wget αντί για ssh, ή nbd.

ilias_s

Άλκη πολύ ενδιαφέρουσα και χρήσιμη η κλωνοποίηση δίσκου από απόσταση και μάλιστα με τη χρήση virtual machine. Μας γλιτώνει και από τα πέρα-δώθε σε ορισμένες περιπτώσεις!

Επειδή δεν έχω προσπαθήσει ξανά κάτι τέτοιο να κάνω μία ερώτηση...

Εννοείται ότι ο στόχος είναι να ετοιμάσουμε ένα μικρό εικονικό δίσκο vmdk ώστε να γίνει η μεταφορά-κλωνοποίηση το ταχύτερο δυνατό και μετά μπορούμε να το κάνουμε expand. Σε αυτά τα 10GB τι κατατμήσεις φτιάχνεις;

Εννοώ, αν θες το /home να βρίσκεται σε διαφορετικό partition, το φτιάχνεις αρχικά αντιστοίχως μικρό για να γίνει expand μετά την κλωνοποίηση; Το swap partition γίνεται και αυτό "μικρό" και γίνεται έπειτα expand ή μπορούμε να το δημιουργήσουμε μετά την κλωνοποίηση και να λειτουργήσει κανονικά;

alkisg

Συνήθως κάνω τα εξής:
* Φτιάχνω εικονική μηχανή VirtualBox με 10 GB flat vmdk
* Μπουτάρω με Ubuntu MATE 20.04.1 64 bit για LTSP servers, ή Ubuntu 18.04.5 32bit για παλιούς standalone clients
* Τρέχω gparted και κάνω create MBR partition table, ένα ext4 partition με LABEL=ubuntu και κενό χώρο 64 MB στο τέλος, όπου κάνω ένα swap partition με LABEL=swap.
* Και τότε εγκαθιστώ το Ubuntu λέγοντάς του "κάτι άλλο" και να μπει στο μοναδικό ext4 partition

Μετά την εγκατάσταση πηγαίνω και βάζω το παρακάτω στο /etc/fstab και τρέχω update-grub:

Κώδικας: Bash
# Static file system information. Documentation=man:fstab(5) man:ext4(5)
# <file system>	<mount point>	<type>	<options>	<dump>	<pass>
LABEL=ubuntu	/		ext4	errors=remount-ro  0	1
#LABEL=EFI	/boot/efi	vfat	umask=0077	0	2
#LABEL=home	/home		ext4	defaults	0	2
#LABEL=srv	/srv	ext4	defaults	0	2
LABEL=swap	none		swap	sw		0	0


Με αυτόν τον τρόπο σταματάω μια και καλή να ασχολούμαι με UUID, και μου είναι πολύ εύκολο να πειράξω τα partitions μετά την κλωνοποίηση.

Τώρα για τις ενέργειες μετά την κλωνοποίηση, να πω πρώτα το πιο συνηθισμένο και εύκολο παράδειγμα:
1) Κλωνοποιώ
2) Με το gparted, μετακινώ το swap στο τέλος του δίσκου και το μεγαλώνω από 64MB στα 8200MB
3) Με το gparted, μεγαλώνω το ubuntu partition ώστε να πιάσει όλο το δίσκο
Τα βήματα (2) και (3) γίνονται σε λιγότερο από ένα λεπτό. Ο κλώνος είναι έτοιμος, δεν χρειάζεται τίποτε άλλο.

Να πω κι ένα σούπερ δύσκολο. Έχω source τύπου MBR (BIOS) και target τύπου GPT (UEFI) που έχει ήδη Windows!
1) Με το gparted, κάνω resize ή δημιουργία νέων partitions, ubuntu, swap κλπ
2) Δίνω μια περίεργη εντολή που τον εικονικό δίσκο τον κάνει να φαίνεται σαν συσκευή:

Κώδικας: Bash
sudo losetup -rP /dev/loop8 focal-mate-flat.vmdk
sudo fdisk -l /dev/loop8
Disk /dev/loop8: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3577f856

Device       Boot    Start      End  Sectors Size Id Type
/dev/loop8p1 *        2048 20840447 20838400  10G 83 Linux
/dev/loop8p2      20840448 20971519   131072  64M 82 Linux swap / Solaris


Έτσι βλέπω τα partitions του ως /dev/loop8p1 κλπ, και μπορώ στις εντολές κλωνοποίησης, αντί να κλωνοποιήσω όλον τον δίσκο, να κλωνοποιήσω συγκεκριμένα partitions! Π.χ. βάζω το source /dev/loop8p1 στο target /dev/sda3, αν στο sda1=efi, sda2=windows, και sda3=το νέο ext4 που μόλις έφτιαξα.

3) Αφού τελειώσω με την κλωνοποίηση των partitions, πηγαίνω μέσα από το gparted και τα κάνω "Check partition", ώστε τα source file systems να επεκταθούν στο μέγεθος των target partitions.
4) Αν έχω φτιάξει νέο /home, κάνω sudo mv το υπάρχον /home/* στο νέο partition και αποσχολιάζω την σχετική γραμμή στο /etc/fstab. Κι αυτό παίρνει μόνο λίγα δευτερόλεπτα
5) Αφαιρώ τον grub-pc που είναι για MBR και βάζω τον grub-efi-amd64 (apt install shim-signed) που είναι για UEFI.

Στα TODO είναι να κάνω ένα ωραίο εργαλείο που να τα αυτοματοποιεί όλα αυτά, αλλά ακόμα και με χειρωνακτικές εντολές, και οι πιο δύσκολες περιπτώσεις δεν θέλουν πάνω από 5 λεπτά πληκτρολόγησης...

ilias_s

Άλκη ένα θα πω...

Ο-ΜΟ-ΡΦΑ

(ευχαριστώ για την αναλυτική απάντηση... θα κάνω τη δοκιμή μου και αν χρειαστώ κάτι θα ενοχλήσω!)

alkisg

Το δοκίμασα μέσω VDSL, πήρε 8 λεπτά για κλωνοποίηση VM δίσκου 10 GB, μια χαρά! Θέλω να το δω και με οπτική πώς θα πάει, μάλλον λιγότερο από 5...
Το `ssh -C` κάνει συμπίεση περίπου 3 φορές στα VM, οπότε είναι σαν να τριπλασιάζεται η ταχύτητα της γραμμής.