Obsługa pamięci przenośnych USB (pendrive/dyski)
W dzisiejszym wpisie opowiem jak wygląda obsługa pamięci przenośnych w systemie Linux, ale także chciałbym omówić sposoby naprawiania dysków, które są nieprawidłowo sformatowane lub niewłaściwie podzielone na partycje. Dla systemów Windows i macOS możemy w internecie znaleźć wiele programów firm trzecich, które służą do „naprawiania” pamięci przenośnych, bo narzędzia wbudowane w te systemy często nie dają rady nawet z najprostszymi zadaniami. Mi zamiast tego typu programów z pomocą zawsze przychodzi Linux, którym przy użyciu podstawowych narzędzi można przebudować nośniki danych każdego rodzaju.
Najpierw demonstracyjnie uszkodzimy nasz obiekt ćwiczeń

Urządzeniem, na którym wykonam demonstrację będzie pendrive Sandisk Ultra Fit o pojemności 16GB. Jest to nośnik, którego używam od dość dawna i pomimo stosunkowo małej pojemności, jak na dzisiejsze czasy, cały czas jest on mi bardzo przydatny głównie ze względu na swoje niewiarygodnie niewielkie rozmiary. Zostanie on przeze mnie „uszkodzony” poprzez zrobienie z niego dysku rozruchowego z systemem Ubuntu Mate. Zrobię to dokładnie tak samo jak opisałem to we wpisie o instalacji Ubuntu Mate na ODROIDzie, z tą różnicą, że system wgram na pendrive, a nie na kartę SD.
Słowo uszkodzony napisałem w cudzysłowiu, bo oczywiście o żadnym fizycznym uszkodzeniu mówić tutaj nie możemy. Jednak flashowanie systemu na pamięć przenośną przy pomocy programu balenaEther powoduje jego partycjonowanie i formatowanie, które sprawiają, że po pierwsze zmienia (zmniejsza) się dostępna pojemność urządzenia, a po drugie jest ono nieobsługiwane przez niektóre systemy operacyjne ze względu na niekompatybilny system plików. Zobaczcie sami – tak macOS widzi nasz pendrive przed i po flashowaniu:


Załóżmy, że wykorzystaliśmy już ten pendrive do instalacji systemu, więc chcielibyśmy go przywrócić do normalnego stanu. Jak widać macOS wykrywa go jako nośnik o pojemności 134.2 MB (wcześniej było to dokładnie 15.38 GB!) z czego dostępne mamy 96.8 MB. Dobra w takim razie może go sformatujmy. W macOS ta funkcja nazywa się „Wymaż”. Nadajemy mu nową nazwę „Sandisk16” i ustawiamy system plików na exFAT, czyli totalnie uniwersalny.


Formatowanie zakończone i niestety efekt mizerny. Mamy co prawda teraz 133 MB dostępnej pojemność, czyli ciutkę więcej, lecz maksymalna pojemność to dalej 134.2 MB zamiast prawie 16 GB… Dobra, przecież macOS ma jeszcze drugie narzędzie o nazwie „Pierwsza pomoc”, po którego aktywacji otrzymujemy komunikat:Pierwsza pomoc sprawdzi, czy wolumin zawiera błędy,
a następnie, jeśli będzie to konieczne, naprawi ten wolumin.
No trzeba przyznać, że brzmi jak plan! Wygląda na to, że dokładnie tego szukaliśmy!



Otóż niestety nic z tego… Proces rzekomo zakończony pomyślnie, ale stan dysku jaki był, taki jest.
Mam nadzieję, że udało mi się potwierdzić moje słowa ze wstępu. Na Windowsie wygląda to mniej więcej podobnie, choć narzędzie dyskowe jest nieco bardziej zaawansowane, bo pokazuje przynajmniej te niewidzialne (nieaktywne) partycje i teoretycznie jest większa szansa na ogarnięcie tego na Windowsie niż na macOS. Dajmy sobie spokój, lepiej wziąć ten pendrive, podłączyć go do naszego serwera i naprawić go kilkoma prostymi linijkami kodu.
Naprawiamy nośnik przy użyciu Linuxa
Ten rozdział nie dotyczy tylko ODROIDa, te same działania będzie można wykonać na każdym innym urządzeniu z Linuxem. Jest to swego rodzaju wiedza uniwersalna.
Podłączamy „uszkodzony” pendrive do naszego serwera. Przy nowych płytkach uważajcie przy podłączaniu czegokolwiek, bo standardowo pierwsze kilka podłączeń idzie ciężko, do czasu aż porty się wyrobią. Trzeba użyć umiarkowanej siły, aby nie uszkodzić połączenia gniazda z płytką. Pendrive wpięty, przechodzimy do terminala i sprawdzamy listę dysków:fdisk -l
Powinniśmy widzieć dwa urządzenia. Pierwsze to karta microSD, na której stoi nasz system operacyjny:Disk /dev/mmcblk1: 59.7 GiB, 64088965120 bytes, 125173760 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: 0x03823826
Device Boot Start End Sectors Size Id Type
/dev/mmcblk1p1 2048 264191 262144 128M c W95 FAT32 (LBA)
/dev/mmcblk1p2 264192 125171712 124907521 59.6G 83 Linux
I drugie, którym jest właśnie nasz obiekt ćwiczeń:Disk /dev/sda: 14.33 GiB, 15376000000 bytes, 30031250 sectors
Disk model: Ultra Fit
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: 0x03823826
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 264191 262144 128M 7 HPFS/NTFS/exFAT
/dev/sda2 264192 11864063 11599872 5.5G 83 Linux
Wartość pola „Disk model” nie daje nam wątpliwości, że jest to właśnie nasz Sandisk Ultra Fit. Widzimy, że oznaczenie naszego urządzenia to „/dev/sda”, będzie to nam później potrzebne. Do tego widzimy, że urządzenie jest podzielone na dwie partycje „/dev/sda1” (o rozmiarze 128 MB) i „/dev/sda2” (o rozmiarze 5.5 GB), co o dziwo nie daje w sumie nominalnego 14.33 GB, to oznacza, że pendrive jest tak naprawdę podzielony na 3 lub więcej części, z czego część z nich jest w ogóle nieaktywnych.
Usuńmy zatem te partycje i wyczyśćmy wszelkie formatowanie dla tego urządzenia:wipefs -af /dev/sda
Tutaj uwaga, żeby za każdym razem dwa razy sprawdzić czy podaliśmy prawidłowe oznaczenie urządzenia, które chcemy zmodyfikować, gdyż możemy w przypadku pomyłki bardzo prosto stracić dane z innego urządzenia. Sprawdźmy jaki wynik spowodowało powyższe polecenie:$ fdisk -l
[...]
Disk /dev/sda: 14.33 GiB, 15376000000 bytes, 30031250 sectors
Disk model: Ultra Fit
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Faktycznie partycje zniknęły, co oznacza, że mamy czyste płótno do obróbki. Tworzymy zatem nową partycję, która tym razem będzie wielkości maksymalnej pojemności tego pendrive:cfdisk /dev/sda
Po wywołaniu polecenia zostanie otwarty kreator, który za rączkę przeprowadzi nas przez cały proces. Najpierw zostaniemy zapytanie o wybranie „Label type”, więc wybierzmy „dos”. Następnie powinniśmy zobaczyć następujące okno:

Na górze widzimy, że rozmiar naszej dostępnej pojemności (Free space – Size) wynosi 14.3 GB. Na dole wybieramy opcję „[New]”, dostajemy pytanie jak dużą partycję chcemy utworzyć, podajemy 14.3G, wybieramy typ partycji „primary”, następnie „[Write]”, kontrolne pytanie czy jesteśmy pewni, więc „yes” i gotowe. Na górze zamiast „Free space” powinna się pojawić partycja „/dev/sda1”. Wychodzimy przyciskiem „[Quit]”.
Teraz dobrze by było go jeszcze przeformatować do systemu plików exFAT, który jak już wspominałem jest uniwersalny, tj. obsługiwany przez praktycznie wszystkie popularne systemy. Potrzebujemy do tego narzędzia:sudo apt install exfat-utils
A formatowanie do exFAT przeprowadza się przy użyciu polecenia:mkfs.exfat /dev/sda1
Sprawdźmy rezultat:$ fdisk -l
Disk /dev/sda: 14.33 GiB, 15376000000 bytes, 30031250 sectors
Disk model: Ultra Fit
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: 0x55b4273d
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 30031249 30029202 14.3G 83 Linux
Pendrive jak nowy, gotowy do dalszego użytku!
Montowanie pamięci przenośnej
W systemach Windows i macOS wystarczy jedynie podłączyć do komputera urządzenie przenośne, system sam je wykryje i udostępni użytkownikowi. W Linuxie jest nieco inaczej, bo samo fizyczne wpięcie nośnika do komputera nie umożliwia od razu korzystania z niego. Konieczne jest tak zwane zamontowanie pamięci przenośnej. Jednak w pierwszej kolejności musimy utworzyć miejsce, do którego nasz pendrive ma zostać zamontowany. W praktyce jest to folder, w którym po zamontowaniu znajdą się pliki przechowywane na urządzeniu przenośnym. Umownie przyjmuje się, że takie miejsce tworzy się w folderze „/media”:sudo mkdir /media/usb-ultrafit16
Ja zawsze staram się rozpoczynać nazwę tego folderu od „usb-” i kończyć podając pojemność danego urządzenia w GB. W ten sposób później jest mi łatwiej się połapać w sytuacji. Montowanie realizuje się poleceniem:sudo mount /dev/sda1 /media/usb-ultrafit16/
Poprawność montowania możemy sprawdzić poleceniem:mount | grep sda1
Po prawidłowym zamontowaniu nośnika możemy przejrzeć jego zawartość:cd /media/usb-ultrafit16/
Jeżeli chcielibyśmy odpiąć pendrive od serwera to dobrze jest najpierw go odmontować (jest to odpowiednik funkcji „wysuń” z Windows czy macOS):sudo umount /dev/sda1
Jeżeli tego nie zrobimy i odłączymy fizycznie pendrive to przy odrobinie nieszczęścia możemy doprowadzić do uszkodzenia danych magazynowanych na urządzeniu, a tego raczej byśmy nie chcieli.
Montowanie nie jest rozwiązaniem permanentnym, tj. wszystkie urządzenia zewnętrzne odmontują nam się np. w przypadku restartu. Jeżeli dane urządzenie ma być na stałe podłączone do naszego serwera to dobrze jest ustawić dla niego automatyczne montowanie w przypadku restartu. W tym celu potrzebujemy najpierw ustalić UUID naszego dysku przenośnego:ls -l /dev/disk/by-uuid/*
W rezultacie powinniśmy otrzymać następujące dane:lrwxrwxrwx 1 root root 10 Jun 11 16:41 /dev/disk/by-uuid/91E8-9D05 -> ../../sda1
lrwxrwxrwx 1 root root 15 Apr 21 14:54 /dev/disk/by-uuid/F702-39CB -> ../../mmcblk1p1
lrwxrwxrwx 1 root root 15 Apr 21 14:54 /dev/disk/by-uuid/e139ce78-9841-40fe-8823-96a304a09859 -> ../../mmcblk1p2
UUID, które nas interesuje, zaznaczyłem powyżej. Dlaczego nie używamy oznaczenia „/dev/sda1”? Ta wartość jest dynamiczna i może ulec zmianie w przypadku podłączenia innych urządzeń i restartu. Chodzi o to, że po restarcie serwera pod sda1 może być podpisane całkowicie inne urządzenie, natomiast UUID definiuje nam bezdyskusyjnie, o które urządzenie chodzi. Teraz musimy zedytować plik:sudo nano /etc/fstab
Musimy na jego końcu dodać:/dev/disk/by-uuid/91E8-9D05 /media/usb-ultrafit16/ exfat defaults 0 0
Oczywiście musicie tutaj podać odpowiedni dla swojego urządzenia UUID i ścieżkę, w której ma zostać zamontowany. Plik „fstab” zapisujemy i wychodzimy z niego. Dzięki tej modyfikacji nośnik powinien być automatycznie montowany przy każdym starcie systemu. Aby to sprawdzić proponuję go odmontować i zrestartować serwer:sudo umount /dev/sda1
sudo reboot
Po ponownym uruchomieniu systemu i logowaniu nasz nośnik powinien być automatycznie zamontowany.
Jeżeli materiał zawarty w tym wpisie jest dla Ciebie wartościowy i masz ochotę wesprzeć moją pracę to zapraszam na mój profil na >Patronite<. Zachęcam także do odwiedzenia mojej strony >tomaszdunia.pl<. Możesz także zagadać do mnie na Twitterze >@theto3k<.
Poprzedni wpis:
Własny ekran powitalny – neofetch
Następny wpis:
Kopia zapasowa całego serwera
Kategorie: Dla początkujących,Poradniki - @ 2022-06-11 18:00
Tagi: cfdisk, dysk, exfat, fdisk, fstab, Linux, macOS, mount, ntfs, ODROID, pendrive, RaspberryPi, reboot, SSH, ubuntu, umount, usb, uuid, Windows, wipefs