W poprzedniej części) skonfigurowałem macierz dyskową i pozakładałem na niej partycje. Teraz czas na przenoszenie danych.
Przygotowanie do przenosin danych, montowanie partycji
Zamontowałem przyszły root
jako /newdisk
, następnie pozakładałem w
nim katalogi przeznaczone do montowania wydzielonych partycji. Napisałem też
odpowiednią konfigurację w /etc/fstab
, przez przynajmniej jeden reboot będę
ją chciał zachować. Fragment:
$ mkdir /newdisk
$ mount /dev/md0 /newdisk
$ mkdir /newdisk/home /newdisk/usr /newdisk/var
$ # tu edycja fstab
$ mount -a
fragment /etc/fstab
:
/dev/md0 /newdisk ext3 defaults,errors=remount-ro,noatime 0 2
/dev/mapper/vgmk-vgmkhome /newdisk/home ext3 defaults,errors=remount-ro,noatime 0 3
Uwaga na ostatni numerek, dla dysków montowanych w katalogach na
/newdisk
powinien być większy niż dla samego/newdisk
.noatime
to moja opcja optymalizacyjna, nieistotna dla tego artykułu, kto nie używał, niech nie wpisuje.
Na koniec (nieobowiązkowy Ubuntu-sism) odpaliłem:
/usr/lib/udev/migrate-fstab-to-uuid.sh
Powstały w efekcie fstab
powinien montować poprawnie dyski nawet w
razie zmian kolejności (dla LVM nie jest to istotne, ale
dla spójności...).
Przy okazji: UUID dysku/partycji można sprawdzić robiąc przy pomocy
vol_id
, np.$ vol_id /dev/sda1
Weryfikacja działania
Przed przenoszeniem danych zdecydowałem się poczekać na zakończenie
(trwającej jeszcze) wstępnej synchronizacji. cat /proc/mdstat
wykazał ok 60% zaawansowania i konieczność odczekania pół godziny.
Stworzyłem kilka plików na nowych wolumenach:
$ echo "Test" > /newdisk/test.file
$ echo "Test2" > /newdisk/home/test.file
Zrestartowałem komputer by sprawdzić, czy wszystkie nowe wolumeny zostaną odnalezione i zamontują się poprawnie, zawierając min. testowe pliki. Udało się.
Wstępne przenosiny danych
Czas na wielkie kopiowanie. Przyzwyczaiłem się do rsync
-a, więc
i tu użyłem jego:
$ rsync -avxS / /newdisk
Opcja
-x
oznacza kopiowanie w ramach jednego filesystemu. Mogłem jej użyć, bo stary dysk mam skonfigurowany jako jedną wielką partycję. Alternatywnie musiałbym explicite pominąć nowy dysk i wszystkie pseudofilesystemy (hmm, chyba wygodniej byłoby zostać przy-x
i po prostu kopiować każdą starą partycję z osobna)Opja
-v
powoduje wypisywanie nazw kopiowanych plików. Zwalnia to trochę cały proces, można ją pominąć.
Zaleta rsync
-a to możliwość powtórzenia tej komendy dwukrotnie (albo
i kilkakrotnie), dla skopiowania rzeczy, które pozmieniały się w
trakcie pierwszego kopiowania. W szczególności dopiero ostatnie
kopiowanie musi być zrobione przy zatrzymanych bazach danych i innych
programach piszących po dysku (idealnie - w single-mode).
Do kopiowania wybranych katalogów
rsync
-a używamy podobnie, na przykład:$ rsync -av /boot/ /newdisk/boot $ rsync -av /etc/ /newdisk/etc
Uwaga na końcowe slashe - przy zapisie jak wyżej trzeba je umieścić, gdyby ich zabrakło
rsync
stworzy np./newdisk/boot/boot
.
Powyższe ... trwało. Zająłem się czymś innym, zatrzymując jednak parę nie-niezbędnych programów mażących po dysku (Slony, PostgreSQL).
Przygotowanie do finalnych przenosin danych (fstab, grub)
Przygotowałem, na razie jako /etc/fstab.new
, plik fstab
dostosowany
do nowych dysków. Poprawka polegała na skopiowaniu /etc/fstab
i:
-
zmianie punktu montowania starej głównej partycji z
/
na/olddisk
(przy okazji zrobiłemmkdir /newdisk/olddisk
), także skorygowaniu końcowego numerka (przebieg) z 1 na 2 -
usunięciu
newdisk
z wszystkich wpisów dotyczących montowania nowych partycji (tj./dev/md0
montujemy jako/
,/dev/mapper/vgmk-home
jako/home
itd), przy tym nowemu rootowi poprawiłem numerek na 1
Dzięki Ubuntu-owemu montowaniu po UUID nie musiałem się troszczyć o to, czy stary dysk będzie się po restartach dalej nazywał '/dev/sda1'
Swap na razie zostawiłem po staremu, nie ruszałem też oczywiście proc-a czy cdromu.
Podedytowałem też /boot/grub/menu.lst
tak, by dawało zarówno opcję
startu jak dotychczas (ze starego dysku), jak z nowego. W tym celu
przede wszystkim znalazłem opcję timeout
i podbiłem ją do 60
(by dać sobie czas na spokojny wybór pozycji w czasie startu),
a następnie dodałem wpisy typu:
title Ubuntu 8.04.1, kernel 2.6.24-19-generic (new disk md0)
root (hd1,0)
kernel /boot/vmlinuz-2.6.24-19-generic root=/dev/md0 ro
initrd /boot/initrd.img-2.6.24-19-generic
title Ubuntu 8.04.1, kernel 2.6.24-19-generic (new disk md0/single)
root (hd1,0)
kernel /boot/vmlinuz-2.6.24-19-generic root=/dev/md0 single
initrd /boot/initrd.img-2.6.24-19-generic
title Ubuntu 8.04.1, kernel 2.6.24-19-generic (new disk hdb1)
root (hd1,0)
kernel /boot/vmlinuz-2.6.24-19-generic root=/dev/hdb1 ro
initrd /boot/initrd.img-2.6.24-19-generic
title Ubuntu 8.04.1, kernel 2.6.24-19-generic (new disk hdb1/single)
root (hd1,0)
kernel /boot/vmlinuz-2.6.24-19-generic root=/dev/hdb1 single
initrd /boot/initrd.img-2.6.24-19-generic
Teoretycznie powinno się udać startować z md0
, na wypadek gdyby jednak
macierz nie została na tym etapie startu poprawnie zainicjowana, wymieniłem
jeden z dysków (korzyść z RAID-1, każda ze sparowanych partycji może być widziana
jako normalna partycja).
Powyższe wpisy szukają jądra na jednym z nowych dysków
- decyduje o tym root (hd1,0)
. Wpis ten służy tylko do testów,
gdy będę się szykował do wyjęcia starego dysku, przestawię
to na root (hd0,0)
.
Instalacja Gruba w sektorach rozruchowych obu nowych dysków
Aby BIOS mógł wystartować komputer z nowego dysku, trzeba zainstalować Gruba w jego sektorze rozruchowym. Tu - w sektorach rozruchowych obu nowych dysków (jednego, do normalnego uruchamiania, drugiego, gdyby przejął rolę głównego po awarii pierwszego).
Uruchomiłem:
$ grub --no-floppy
Następnie zacząłem od kontrolnego:
grub> find /boot/grub/stage1
(hd0,0)
(hd1,0)
(hd2,0)
OK, katalog /boot/grub
jest poprawnie skopiowany (są tu kolejno
stary dysk i oba nowe).
Zainstalowałem gruba w bootsektorze pierwszego z nowych dysków:
grub> device (hd0) /dev/sdb
grub> root (hd0,0)
grub> setup (hd0)
i drugiego:
grub> device (hd0) /dev/sdc
grub> root (hd0,0)
grub> setup (hd0)
Krótki komentarz: o tym na którym dysku nastąpi zapis, decydują
deklaracje /dev/sdb
i /dev/sdc
. Gdy Grub będzie już działał,
będzie szukał katalogu /boot
na pierwszej partycji pierwszego
aktywnego dysku (hd0 to pierwszy dysk, 0 to pierwsza partycja)
- gdy dojdę do uruchamiania akurat via ten grub, będzie to
właściwy dysk.
W powyższym posługiwałem się wskazówkami z Gentoo.
Finalne przenosiny danych
Ubiłem większość demonów i programów i powtórzyłem - nic w tym czasie
nie robiąc - to samo polecenie rsync
:
$ rsync -avxS / /newdisk
(idealnie byłoby zrobić to w single mode, nie chciało mi się)
Zastąpiłem fstab
na nowym dysku przez fstab.new:
$ cp /newdisk/etc/fstab.new /newdisk/etc/fstab
Podedytowałem też /newdisk/boot/grub/menu.lst
zmieniając
root (hd1,0)
na root (hd0,0)
, jeśli dojdzie kiedyś do bootowania
via to menu, nowy dysk będzie pierwszym.
Zatrzymałem i wyłączyłem komputer. Eksperymenty z uruchamianiem - jutro.
Brak happy-endu
Niestety okazało się, że po wyciągnięciu starego dysku, mój komputer nie startuje. Nie jest to wina macierzy, jakieś trudności ma BIOS, a być może wręcz płyta główna - wygląda na to, że kupiłem za nowe lub za duże dyski. Skleił się z tym problem port is slow to respond, o którym napiszę osobno.
Machnąłem ręką. Zostawiam stary dysk, bootuję się z niego i na nim
trzymam partycję root
. Z macierzy pomontuję /home
, /usr
, /var
itd. Nieliczne istotne pliki pozostałe na starym dysku (/etc
,
/boot
, /bin
i /sbin
) będę po prostu backupował na macierz.