Zmiana identyfikatora UUID systemu plików EXT4 i kontenera LUKS

Spis treści

Na forum DUG'a po raz kolejny pojawił się post dotyczący unikalnych identyfikatorów, które są nadawane partycjom dysków twardych. Nie wiem jak sprawa ma się w przypadku windowsów ale linux na podstawie tych numerów UUID i (GUID) jest w stanie identyfikować konkretne urządzenia. Czasem się zdarza tak, że dwa dyski czy partycje mają taki sam identyfikator, co prowadzi zwykle do problemów. Kolizja numerów identyfikacyjnych może być wynikiem pozostałości po procesie produkcyjnym ale może także powstać za sprawą klonowania nośnika za pomocą narzędzia dd . Tak czy inaczej, przydałoby się wiedzieć jak ustalić, poprawnie wygenerować czy też zmienić UUID wszędzie tam, gdzie jest on wykorzystywany i o tym będzie ten wpis.

Ustalanie identyfikatora UUID

Identyfikator UUID w linux'ie możemy podejrzeć za pomocą poleceń lsblk czy też blkid . Z reguły nie powinniśmy odnotować dwóch takich samych UUID. W tym przypadku, jedna z partycji została sklonowana przy pomocy dd i umieszczona na dysku USB. Mając podpięte oba dyski w tym samym czasie, lsblk zwraca poniższy wynik:

# lsblk /dev/sda6 /dev/sdb5
NAME     SIZE FSTYPE      TYPE  LABEL MOUNTPOINT  UUID
sda6   141.9G crypto_LUKS part                    f3c10054-0583-4e10-937b-dcdc9a05a25c
└─kabi 141.9G ext4        crypt kabi  /media/Kabi b47e6dcd-924e-40fa-a8b1-7593419f86d7
sdb5   141.9G crypto_LUKS part                    f3c10054-0583-4e10-937b-dcdc9a05a25c
└─sdb5 141.9G ext4        crypt kabi              b47e6dcd-924e-40fa-a8b1-7593419f86d7

Może i system działa prawidłowo ale trzeba się zastanowić co się stanie, gdy uruchomimy system i oba te dyski będą podpięte. Jeśli montujemy zasoby w fazie boot i opieramy się o te identyfikatory, to który z tych powyższych zasobów zostanie wybrany? Ciężko powiedzieć ale wiemy, że taki stan rzeczy nie powinien mieć miejsca i te zdublowane identyfikatory powinniśmy zmienić.

Zmiana UUID systemu plików EXT4

W przypadku systemu plików EXT4, ten widoczny wyżej numerek jest odczytywany bezpośrednio z informacji zawartych w superbloku systemu plików. My również możemy je wydobyć przy pomocy narzędzi tune2fs lub dumpe2fs , przykładowo:

# tune2fs -l /dev/mapper/sdb5 | grep UUID
Filesystem UUID:          b47e6dcd-924e-40fa-a8b1-7593419f86d7

Wiemy zatem, że ta informacja jest przypisana do systemu plików i wędruje wraz z nim. No to teraz nasuwa się pytanie, jak zmienić ten widoczny wyżej ciąg? W przypadku EXT4 identyfikator zmieniamy również przy pomocy tune2fs w poniższy sposób:

# tune2fs -U random /dev/mapper/sdb5

Parametr -U może przyjąć jedną z trzech wartości:

  • clear -- czyści przypisany identyfikator.
  • random -- nadaje losowo wygenerowany identyfikator.
  • time -- nadaje identyfikator, który zostanie wygenerowany w oparciu o czas.

Identyfikator UUID zawsze możemy też podać ręcznie, przykładowo:

# tune2fs -U "b47e6dcd-924e-40fa-a8b1-7593419f86d7" /dev/mapper/sdb5

Trzeba jednak pamiętać, że ten identyfikator nie jest losowym ciągiem HEX. Posiada on swój format zdefiniowany w rfc4122 i nigdy nie należy go dostosowywać ręcznie.

Zmiana UUID kontenera LUKS

Zmiana unikalnego identyfikatora systemu plików to nic trudnego. Problem jednak zaczyna się, gdy w grę wchodzi kontener LUKS, a na nim nie operuje tune2fs . Zatem gdzie jest przechowywany ten identyfikator i jak go zmienić? UUID kontenerów LUKS znajduje się w nagłówku kontenera, czyli w tych pierwszych 2 MiB zaraz na początku partycji. W skrócie jest to sześć bajtów począwszy od pozycji 168. W osobnym wpisie jest nieco więcej informacji na temat tego jak zbudowany jest nagłówek LUKS. Ten UUID możemy naturalnie wydobyć wykorzystując narzędzie cryptsetup :

# cryptsetup luksUUID /dev/sdb5
f3c10054-0583-4e10-937b-dcdc9a05a25c

Również przy pomocy cryptsetup możemy ten identyfikator zmienić. Problem w tym, że nie generuje on losowych numerów i w parametrze --uuid trzeba podać gotowy UUID. Jak wspomniałem wyżej, nie jest to losowy ciąg HEX i musimy go jakoś wygenerować. W debianie, w pakiecie uuid-runtime , mamy narzędzie uuidgen i to nim się posłużymy. By uzyskać nowy UUID, wpisujemy w terminalu to poniższe polecenie:

$ uuidgen --random
90402f62-fbd0-4faf-9297-dd1f2eba7ce3

By zmienić teraz identyfikator kontenera LUKS, wydajemy poniższą komendę:

# cryptsetup --uuid "90402f62-fbd0-4faf-9297-dd1f2eba7ce3" luksUUID /dev/sdb5

Ryzyko utraty danych

Proces zmiany unikalnego identyfikatora UUID pod linux'em nie niesie ze sobą żadnego ryzyka utraty danych. Ważne jest tylko to, by nie dokonywać tego zabiegu przy zamontowanych zasobach. Pamiętajmy też, by po każdej zmianie numerów identyfikacyjnych dostosować odpowiednio pliki /etc/fstab i /etc/crypttab .

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.