Daniel Smoczyk podesłał mi skrypt, którego używa do synchronizacji danych między głównym komputerem stacjonarnym a laptopem, a dokładniej - do tworzenia na przenośnym dysku wiernej kopii swojego głównego systemu.
Jest to zupełnie inne podejście niż to, które sam stosuję (mam niezależnie konfigurowane systemy które często działają równocześnie, a sychronizuję specyficzne dane używając różnych technik) ale wydaje mi się interesujące i warte przedstawienia.
Jak to działa
Siedząc przy głównym komputerze podłączamy dysk zewnętrzny albo pendrive, zatrzymujemy programy intensywnie modyfikujące dane (np. serwer bazy danych) i uruchamiamy poniższy skrypt. Za pierwszym razem będzie to operacja dość powolna, za kolejnymi - stosunkowo szybka.
Efektem jest utworzenie na przenośnym dysku wiernej, bootowalnej kopii głównego systemu. Można go następnie podpiąć do innego komputera (laptopa, komputera w biurze lub u klienta itp) i wybrać uruchamianie go z tego urządzenia. Efektem będzie ten sam system z tymi samymi danymi i tymi samymi aplikacjami.
Synchronizację zwrotną można obsłużyć podobnie ale częściej nie jest
automatyzowana (istotne zmiany obejmują zwykle tylko kod czy dokumenty
które były akurat opracowywane, Daniel posługuje się najczęściej git
pull
by pobrać je z powrotem na główną maszynę po ponownym
podłączeniu do niej pendrive, można je też przenieść dowolną inną metodą).
Skrypt
Skrypt Daniela wygląda następująco (i oczywiście musi być
uruchamiany z konta root
):
#!/bin/sh mount -o dev,rw -t ext4 /dev/sdd1 /mnt/target/ mkdir -p /mnt/target/proc /mnt/target/dev /mnt/target/sys \ /mnt/target/mnt/target /mnt/target/media /mnt/target/tmp \ /mnt/target/cdrom rsync -av --delete --exclude=/home/XYZ/Desktop \ /bin /home /initrd.img /lib /root /sbin /selinux /srv /usr \ /var /vmlinuz /etc /boot /opt \ /mnt/target/ grub-install /dev/sdd --root-directory=/mnt/target --no-floppy tune2fs -U `blkid -o value -s UUID /dev/sda1` /dev/sdd1
Przed użyciem wymaga dopasowania. Trzeba:
- sprawdzić, jako jakie urządzenie pojawia się przenośny dysk (tu
/dev/sdd
, a literka zależy od konfiguracji sprzętowej komputera), - zmienić XYZ na nazwę własnego konta (i w razie potrzeby skorygować lub uzupełnić listę nie kopiowanych katalogów, tu
Desktop
jest pomijany jako po prostu zbyt duży by zmieścić się na pendrive), - zweryfikować listę kopiowanych katalogów (podana wyżej jest odpowiednia dla Debiana).
Skrypt ma też parę ograniczeń, o nich dalej.
Jak to działa
Polecenie mount
montuje zewnętrzny dysk jako /mnt/target
. Flaga
dev
jest niezbędna by grub zaakceptował opcję root-directory
.
Kolejny krok jest istotny tylko przy pierwszym uruchamianiu - zostają
stworzone katalogi proc
, dev
, sys
itd. Ich zawartość nie jest
synchronizowana ale muszą istnieć by system działał poprawnie.
Uzupełniłbym skrypt o
chmod 1777 /mnt/target/tmp
by uniknąć problemów w instalacjach beztmpfs
.
Za podstawowe kopiowanie danych odpowiada dobrze znany program rsync
.
Dzięki wywołaniu grub-install
przenośny dysk staje się bootowalny
(i uruchamia system znajdujący się na tymże urządzeniu).
Polecenie tune2fs
ustawia UUID głównej partycji na urządzeniu
na takie samo, jakie miała partycja źródłowa. Dzięki temu nie trzeba
zmieniać wpisów w /boot/grub/grub.cfg
ani w /etc/fstab
.
Ograniczenia
Skrypt zakłada, że cały źródłowy system znajduje się na pojedynczej
partycji. W innym wypadku mogą być potrzebne korekty pliku
/etc/fstab
na wynikowym urządzeniu (gdzie mamy tylko jedną
partycję). Można też spartycjonować przenośny dysk podobnie do
głównego, zamontować wszystkie te partycje przed kopiowaniem a na
koniec zsynchronizować UUID dla każdej pary partycji.
Zakładamy też, że wszelkie odwołania do partycji (w grub.cfg
i w
fstab
) posługują się UUID (co jest prawdą dla w miarę nowych
Debianów i Ubuntu).
Stosowane na obu komputerach urządzenia (grafika, sieć, dźwięk, ...) nie mogą wymagać specjalnej, ręcznie dopieszczanej konfiguracji (to również nie jest problemem na coraz większej ilości maszyn).
Adres sieciowy powinien być skonfigurowany po DHCP albo przy pomocy ręcznie wybieranej konfiguracji menedżera sieci.
Wreszcie, last but not least, przenośny dysk musi być wystarczająco obszerny by pomieścić kopiowane dane (albo skrypt inteligentnie dopasowany tak, by pomijał rzeczy obszerne a nie niezbędne).