Problem z przywracaniem z kopii zapasowej tar: dlaczego istnieją / dev / disk / by-id / symlinks i jak mogę ich uniknąć?

0

Staram się stworzyć system tworzenia kopii zapasowych od podstaw, przy użyciu najbardziej podstawowych narzędzi dostępnych w openSUSE 11.3 (w tym przypadku: bash, fdisk, tar i grub legacy)

Oto przepływ pracy dla moich skryptów:

backup.sh:

  1. (Uruchom z systemu zewnętrznego, np. LiveCD)
  2. stwórz skrypt fdisk ($ fscript) z wyjścia fdisk -l [działa]
  3. zamontuj partycje z systemu fstab [działa]
  4. tar najważniejsze rzeczy w pliku.tgz [działa]

restore.sh:

  1. (Uruchom z systemu zewnętrznego, np. LiveCD)
  2. uruchom fdisk $ dest <$ fscript, aby przywrócić partycjonowanie [działa]
  3. sformatuj i zamontuj partycje z systemu fstab [nie działa]
  4. wypakuj z pliku.tgz [działa podczas ręcznego montażu]
  5. przywróć grub [nie działa]

Ostatnio zauważyłem, że openSUSE (choć jestem pewien, że nie ma to nic wspólnego z dystrybucją) ma inne wyjście w / etc / fstab i /boot/grub/menu.lst, a dokładniej nazwa partycji to na przykład „ / dev / disk / by-id / numbers-brandname-morenumbers-part2 ”zamiast„ / dev / sda2 ”- ale w zasadzie jest to proste dowiązanie symboliczne.

Moje pytania na ten temat:

  • jaki jest sens takich dowiązań symbolicznych, zwłaszcza jeśli przywracamy na innym dysku?
  • czy istnieje sposób, aby w czysty sposób zapobiec tworzeniu tych dowiązań symbolicznych i zamiast tego używać wszędzie „prawdziwego” / dev / sdx?
  • jeśli poprzednie nie, czy znasz sposób na zastąpienie tych dowiązań symbolicznych w locie w pliku tekstowym? Próbowałem tego skryptu, ale działa tylko wtedy, gdy plik zaczyna się od opisu dowiązania symbolicznego (przypadek fstab, nie menu.lst):

    ### search and replace /dev/disk/by-id/... to /dev/sdx
    while read oldVolume rest; do # get first element, ignore rest of line
        if [[ "$oldVolume" =~ ^/dev/disk/by-id/.*(-part[0-9]*$)? ]]; then
            newVolume=$(readlink $oldVolume) # replace pointer by pointee, returns "../../sdx"
            echo /dev/${newVolume##*/} $rest >> TMP # format to "/dev/sdx", write line
        else
            echo $oldVolume $rest >> TMP # nothing to do
        fi
    done < $file
    mv -f TMP $file # save changes

Miałem problem ze znalezieniem rozwiązania tego problemu w Google, więc miałem nadzieję, że niektórzy członkowie tutaj mogą mi pomóc.

Dziękuję Ci.

SK.
źródło

Odpowiedzi:

1

Dowiązania symboliczne istnieją, więc możesz odwoływać się do urządzeń pod unikatową nazwą (kombinacja producenta, modelu i numeru seryjnego). Jest to szczególnie przydatne, jeśli dyski zmieniają nazwy urządzeń podczas uruchamiania z zainstalowanym dyskiem flash.

Często używałem tych dowiązań symbolicznych do rozwiązywania problemów z ZFS i dyskami, które przenoszą węzły urządzeń (szczególnie dyski USB).

Korzystanie z dowiązań symbolicznych nie ma znaczenia, w jakiej kolejności dyski są wykrywane lub podłączane.

I tak nie powinieneś tworzyć kopii zapasowych / dev - nie ma w tym nic, co byłoby przydatne do tworzenia kopii zapasowych.

Majenko
źródło
1
Użyj opcji --exclude lub --exclude-from komendy tar, aby wyświetlić listę wykluczeń. LUB użyj opcji -xdev znajdź, aby uniknąć przekroczenia granic systemu plików.
Chris Nava,
Rozumiem, że do tworzenia kopii zapasowych nie jest wymagane / dev, i znam argument --exclude. Moim prawdziwym problemem jest to, że dowiązania symboliczne w fstab i menu.lst nie są użyteczne, gdy przywracam do pustego dysku, ponieważ dowiązania symboliczne w tym momencie nie istnieją (podczas przywracania korzystamy z LiveCD). Więc po prostu czytanie oryginalnego fstab zawiedzie wierzchowce, które próbuję wykonać. Mógłbym zamontować każdą partycję ręcznie, ale chciałbym to zautomatyzować za pomocą / dev / sdx. Ten sam problem dotyczy grub, który zawiera również dowiązania symboliczne by-id.
SK.
Po prostu nie przywracaj pliku tar do istniejącego systemu plików. Wyodrębnij do tymczasowej lokalizacji, a następnie przenieś rzeczy, które chcesz zachować z powrotem do ich właściwej lokalizacji.
Chris Nava