Używanie polecenia `mkfs` w Linux: Kompletny przewodnik po formatowaniu dysków i partycji
Polecenie `mkfs` (make filesystem) jest podstawowym narzędziem Linux służącym do zapisywania struktury systemu plików na urządzeniu blokowym — niezależnie od tego, czy jest to surowy dysk, partycja czy wolumin logiczny. Inicjalizuje ono superblok, tablice i-węzłów, grupy bloków oraz struktury dziennika wymagane przed zapisaniem jakichkolwiek danych na urządzeniu.
Przed dotknięciem jakiegokolwiek dysku należy zrozumieć jedno: `mkfs` jest operacją destrukcyjną i nieodwracalną. Nie usuwa jedynie wpisu tablicy partycji — nadpisuje krytyczne metadane na dysku. Uruchomienie go na niewłaściwym urządzeniu, nawet na chwilę, sprawia, że istniejące dane stają się nieodzyskiwalne bez narzędzi forensycznych. Przed każdym wywołaniem zweryfikuj docelowe urządzenie za pomocą `lsblk` lub `blkid`.
Co `mkfs` faktycznie robi pod spodem
Gdy wykonujesz `mkfs -t ext4 /dev/sdb1`, jądro nie „formatuje” partycji w sensie Windows. Polecenie wywołuje odpowiedni plik binarny specyficzny dla systemu plików (w tym przypadku `mkfs.ext4`, który jest w rzeczywistości `mke2fs` z domyślnymi ustawieniami ext4) i wykonuje następujące czynności:
- Zapisuje superblok i kopie zapasowe superbloku przy stałych przesunięciach grup bloków
- Przydziela i inicjalizuje tablicę i-węzłów we wszystkich grupach bloków
- Tworzy tablicę deskryptorów grup bloków
- Inicjalizuje dziennik (dla systemów plików z dziennikowaniem, takich jak ext4 i XFS)
- Zapisuje i-węzeł katalogu głównego (i-węzeł 2 dla ext4)
- Nadaje systemowi plików UUID do trwałej identyfikacji
To rozróżnienie ma znaczenie na dużych dyskach. Formatowanie partycji ext4 o pojemności 4 TB z pełną inicjalizacją tablicy i-węzłów może zająć kilka minut. XFS natomiast odkłada większość tej pracy do czasu wykonania, dzięki czemu jego `mkfs.xfs` jest niemal natychmiastowe niezależnie od rozmiaru woluminu.
Identyfikacja właściwego urządzenia przed formatowaniem
Nigdy nie zgaduj nazwy urządzenia. Użyj poniższych narzędzi, aby zmapować fizyczny sprzęt na węzły urządzeń jądra.
Używanie `lsblk`
“`bash
lsblk -o NAME,SIZE,FSTYPE,LABEL,UUID,MOUNTPOINT
“`
Przykładowe wyjście:
“`
NAME SIZE FSTYPE LABEL UUID MOUNTPOINT
sda 100G
├─sda1 20G ext4 a1b2c3d4-… /
└─sda2 80G ext4 e5f6a7b8-… /home
sdb 500G
└─sdb1 500G
“`
Puste pole `FSTYPE` potwierdza, że `/dev/sdb1` nie ma istniejącego systemu plików — można je bezpiecznie sformatować.
Używanie `blkid`
“`bash
sudo blkid /dev/sdb1
“`
Jeśli polecenie nie zwraca żadnych danych wyjściowych, partycja nie zawiera rozpoznanego podpisu systemu plików. Jeśli zwraca typ, zamierzasz nadpisać istniejące dane.
Używanie `fdisk -l`
“`bash
sudo fdisk -l /dev/sdb
“`
Ujawnia to granice partycji, typy partycji oraz to, czy dysk używa MBR czy GPT. Jeśli `/dev/sdb` nie pokazuje żadnej tablicy partycji, może być konieczne najpierw podzielenie dysku na partycje za pomocą `fdisk`, `gdisk` lub `parted` przed uruchomieniem `mkfs`.
Podstawowa składnia `mkfs` i wzorce wywołań
Kanoniczna składnia to:
“`bash
mkfs -t <filesystem_type> [options] <device>
“`
Jednak `mkfs` sam w sobie jest cienką warstwą opakowującą. Każdy typ systemu plików dostarcza własny dedykowany plik binarny:
| Alias `mkfs` | Podstawowy plik binarny | System plików |
|---|
| — | — | — |
|---|
| `mkfs.ext4` | `mke2fs` | Fourth Extended Filesystem |
|---|
| `mkfs.xfs` | `mkfs.xfs` | XFS |
|---|
| `mkfs.btrfs` | `mkfs.btrfs` | B-Tree Filesystem |
|---|
| `mkfs.vfat` | `mkdosfs` | FAT16/FAT32 |
|---|
| `mkfs.exfat` | `mkfs.exfat` | exFAT |
|---|
| `mkfs.ntfs` | `mkntfs` | NTFS |
|---|
| `mkfs.f2fs` | `mkfs.f2fs` | Flash-Friendly Filesystem |
|---|
Wywołanie `mkfs -t ext4` i bezpośrednie wywołanie `mkfs.ext4` są funkcjonalnie identyczne — pierwsze po prostu rozwiązuje się do drugiego. W skryptach produkcyjnych preferuj jawny alias (`mkfs.ext4`), aby intencja była jednoznaczna.
Wybór typu systemu plików: porównanie techniczne
Wybór niewłaściwego systemu plików dla danego obciążenia to częsty i kosztowny błąd. Poniższa tabela mapuje charakterystyki systemów plików na rzeczywiste przypadki użycia.
| System plików | Maks. rozmiar woluminu | Maks. rozmiar pliku | Dziennikowanie | Najlepszy przypadek użycia | Obsługa między systemami operacyjnymi |
|---|
| — | — | — | — | — | — |
|---|
| **ext4** | 1 EiB | 16 TiB | Tak (ordered/writeback) | Ogólne woluminy główne i danych Linux | Natywny Linux; tylko do odczytu na macOS/Windows ze sterownikami |
|---|
| **XFS** | 8 EiB | 8 EiB | Tak (domyślnie tylko metadane) | Duże pliki, bazy danych, pamięć masowa o wysokiej przepustowości, eksporty NFS | Natywny Linux |
|---|
| **Btrfs** | 16 EiB | 16 EiB | CoW (brak tradycyjnego dziennika) | Migawki, RAID, podwoluminy, obciążenia NAS | Natywny Linux |
|---|
| **vFAT/FAT32** | 2 TiB | 4 GiB | Nie | Dyski USB, partycja systemowa EFI (ESP), wymienne nośniki między systemami operacyjnymi | Uniwersalny |
|---|
| **exFAT** | 128 PiB | 16 EiB | Nie | Duże wymienne nośniki, gdzie limit rozmiaru pliku FAT32 stanowi ograniczenie | Uniwersalny (nowoczesne systemy operacyjne) |
|---|
| **NTFS** | 256 TiB | 256 TiB | Tak | Partycje danych Windows przy podwójnym rozruchu | Natywny Windows; pełna obsługa na Linux przez `ntfs-3g` |
|---|
| **F2FS** | 16 TiB | 3.94 TiB | Log-structured | SSD, eMMC, karty SD, wewnętrzna pamięć Android | Natywny Linux |
|---|
Krytyczny przypadek brzegowy — partycja systemowa EFI: ESP musi być sformatowana jako `vfat` (konkretnie FAT32). Użycie jakiegokolwiek innego systemu plików uniemożliwi oprogramowaniu układowemu UEFI zlokalizowanie programu ładującego. Zawsze formatuj ESP za pomocą:
“`bash
sudo mkfs.vfat -F 32 /dev/sda1
“`
Flaga `-F 32` jawnie wymusza FAT32 zamiast FAT16, co ma znaczenie dla partycji ESP większych niż 32 MiB.
Praktyczne przykłady `mkfs` z opcjami klasy produkcyjnej
Przykład 1: Tworzenie systemu plików ext4 z dostrojonymi parametrami
“`bash
sudo mkfs.ext4 -L "data_vol" -m 1 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdb1
“`
Co robi każda flaga:
- `-L "data_vol"` — przypisuje trwałą etykietę, umożliwiając wpisom `/etc/fstab` używanie `LABEL=data_vol` zamiast surowej ścieżki urządzenia (bezpieczniejsze w systemach, gdzie kolejność wyliczania urządzeń może się zmieniać)
- `-m 1` — zmniejsza procent zarezerwowanych bloków z domyślnych 5% do 1%; na woluminie danych o pojemności 2 TB wartość domyślna marnuje ~100 GB, z których może korzystać tylko root
- `-E lazy_itable_init=0,lazy_journal_init=0` — wymusza pełną inicjalizację tablicy i-węzłów w czasie formatowania zamiast odkładania jej do operacji I/O w tle; krytyczne dla serwerów produkcyjnych, gdzie inicjalizacja w tle może powodować nieoczekiwane skoki I/O godziny po wdrożeniu
Przykład 2: Tworzenie systemu plików XFS dla serwera bazy danych
“`bash
sudo mkfs.xfs -L "pg_data" -f /dev/sdb1
“`
- `-f` — wymusza tworzenie nawet jeśli wykryto istniejący podpis systemu plików; używaj tylko wtedy, gdy potwierdziłeś, że urządzenie można poświęcić
- XFS nie obsługuje zmniejszania; starannie zaplanuj rozmiar woluminu przed formatowaniem
W przypadku obciążeń PostgreSQL lub MySQL na XFS ustaw również opcję montowania `noatime` w `/etc/fstab`, aby wyeliminować narzut zapisu czasu dostępu do i-węzłów przy każdej operacji odczytu.
Przykład 3: Tworzenie systemu plików Btrfs z RAID-1 na dwóch urządzeniach
“`bash
sudo mkfs.btrfs -L "btrfs_mirror" -d raid1 -m raid1 /dev/sdb /dev/sdc
“`
Btrfs może natywnie obejmować wiele urządzeń blokowych. `-d raid1` tworzy lustro danych; `-m raid1` tworzy lustro metadanych. Jest to uzasadniona alternatywa dla programowego RAID mdadm w środowiskach, gdzie potrzebna jest również funkcjonalność migawek i podwoluminów.
Przykład 4: Tworzenie systemu plików vFAT dla dysku USB
“`bash
sudo mkfs.vfat -F 32 -n "BACKUP_USB" /dev/sdc1
“`
- `-n "BACKUP_USB"` — ustawia etykietę woluminu (etykiety FAT32 są ograniczone do 11 znaków, wielkie litery)
- `-F 32` — jawnie wybiera FAT32 zamiast FAT16
Przykład 5: Tworzenie systemu plików F2FS na SSD
“`bash
sudo mkfs.f2fs -l "ssd_cache" /dev/sdb1
“`
F2FS jest specjalnie zaprojektowany dla pamięci flash NAND. Zmniejsza wzmocnienie zapisu i zarządza wyrównywaniem zużycia na poziomie systemu plików. Na instancjach VPS Hosting opartych na pamięci masowej NVMe, F2FS może przewyższać ext4 w przypadku woluminów pamięci podręcznej o dużej rotacji zapisu.
Formatowanie całego dysku bez tablicy partycji
W określonych scenariuszach — woluminy fizyczne LVM, Ceph OSD lub urządzenia pamięci masowej do jednego celu — możesz zapisać system plików bezpośrednio na całym dysku zamiast na partycji:
“`bash
sudo mkfs.ext4 /dev/sdb
“`
Kiedy jest to właściwe:
- Dysk jest dedykowany do jednego celu i elastyczność partycjonowania nie jest potrzebna
- Przygotowujesz dysk dla LVM (`pvcreate` obsługuje to inaczej, ale koncepcja jest podobna)
- Tworzysz obraz systemu plików na urządzeniu pętlowym
Kiedy jest to niewłaściwe:
- Każdy dysk, który musi się uruchamiać (wymaga tablicy partycji z flagą rozruchu)
- Każdy dysk współdzielony między wieloma systemami plików lub systemami operacyjnymi
- Dyski w systemach, gdzie reguły udev lub narzędzia infrastruktury chmurowej oczekują tablicy partycji
Montowanie sformatowanej partycji i utrwalanie konfiguracji
Formatowanie tworzy system plików; montowanie sprawia, że jest on dostępny. Zawsze używaj odwołań opartych na UUID w `/etc/fstab` zamiast nazw urządzeń, ponieważ nazwy urządzeń (`/dev/sdb1`) nie są gwarantowane jako stabilne między restartami w systemach z wieloma dyskami lub pamięcią masową podłączaną na gorąco.
“`bash
Create the mount point
sudo mkdir -p /mnt/data_vol
Mount temporarily to verify
sudo mount /dev/sdb1 /mnt/data_vol
Retrieve the UUID
sudo blkid /dev/sdb1
Output: /dev/sdb1: LABEL="data_vol" UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"
Add a persistent, UUID-based fstab entry
echo 'UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/data_vol ext4 defaults,noatime 0 2' | sudo tee -a /etc/fstab
Validate the fstab entry without rebooting
sudo mount -a
“`
`0 2` na końcu wpisu fstab kontroluje `dump` (narzędzie kopii zapasowej, ustaw na 0 aby wyłączyć) i kolejność przejścia `fsck` (2 oznacza sprawdzanie po głównym systemie plików; root powinien mieć 1).
Weryfikacja integralności systemu plików po formatowaniu
Nie zakładaj, że formatowanie zakończyło się sukcesem bez weryfikacji.
“`bash
Check filesystem type, label, and UUID
lsblk -f /dev/sdb1
For ext4: run e2fsck in read-only check mode
sudo e2fsck -n /dev/sdb1
For XFS: verify the filesystem structure
sudo xfs_repair -n /dev/sdb1
Check available space after mounting
df -hT /mnt/data_vol
“`
Flaga `-n` zarówno dla `e2fsck` jak i `xfs_repair` wykonuje sprawdzenie na sucho bez modyfikowania systemu plików. Można to bezpiecznie uruchomić na zamontowanym systemie plików w celach diagnostycznych, choć pełna naprawa wymaga najpierw odmontowania.
Dokumentacja zaawansowanych opcji
| Opcja | Dotyczy | Efekt |
|---|
| — | — | — |
|---|
| `-L <label>` | Wszystkie | Przypisuje czytelną dla człowieka etykietę systemu plików |
|---|
| `-b <block_size>` | ext4, XFS | Ustawia rozmiar bloku (512, 1024, 2048, 4096 bajtów); większe bloki poprawiają przepustowość dla dużych plików, marnują miejsce dla małych plików |
|---|
| `-m <percent>` | ext4 | Procent zarezerwowanych bloków dla roota (domyślnie 5%); zmniejsz do 1% na dużych woluminach danych |
|---|
| `-i <bytes-per-inode>` | ext4 | Kontroluje gęstość i-węzłów; zmniejsz dla systemów plików przechowujących miliony małych plików |
|---|
| `-N <inode-count>` | ext4 | Ustawia jawną liczbę i-węzłów; przydatne gdy znasz oczekiwaną liczbę plików |
|---|
| `-E lazy_itable_init=0` | ext4 | Wyłącza leniwą inicjalizację i-węzłów; wolniejsze formatowanie, eliminuje operacje I/O w tle po wdrożeniu |
|---|
| `-f` | XFS | Wymusza formatowanie nawet jeśli istnieje podpis systemu plików |
|---|
| `-d su=,sw=` | XFS | Konfiguruje jednostkę paska i szerokość dla I/O wyrównanego do RAID |
|---|
| `-F 32` | vFAT | Wymusza FAT32 (zamiast FAT16) |
|---|
| `-q` | ext4 | Tryb cichy; pomija dane wyjściowe postępu (przydatne w skryptach) |
|---|
Typowe pułapki i jak ich unikać
Formatowanie zamontowanego systemu plików: Linux nie zawsze temu zapobiega. Uruchomienie `mkfs` na zamontowanej partycji natychmiast uszkadza system plików i może powodować paniki jądra. Zawsze weryfikuj status montowania za pomocą `mount | grep /dev/sdb1` przed kontynuowaniem.
Wyczerpanie i-węzłów na ext4: Jeśli ustawisz duży rozmiar bloku (np. 4096 bajtów) na woluminie, który będzie przechowywał miliony małych plików (kolejki poczty, pamięci podręczne sesji), wyczerpiesz i-węzły na długo przed wyczerpaniem miejsca na dysku. Użyj `-i 4096` lub `-i 2048`, aby zwiększyć gęstość i-węzłów. Jest to szczególnie powszechny problem na serwerach Email Hosting i serwerach WWW o dużym ruchu przechowujących pliki dla każdej sesji.
XFS i zmniejszanie: Woluminów XFS nie można zmniejszyć po utworzeniu. Jeśli sformatujesz wolumin XFS o pojemności 2 TB i później będziesz potrzebować odzyskać miejsce, jedyną opcją jest kopia zapasowa, ponowne formatowanie i przywrócenie. Planuj rozmiary woluminów XFS zachowawczo lub używaj pod spodem cienkiego provisioningu LVM.
Wyrównanie pasków dla RAID i SSD: Formatowanie bez określenia wyrównania pasków na macierzy RAID lub SSD powoduje niewyrównane I/O, znacznie obniżając wydajność. Dla macierzy RAID-5 z paskiem 512 KB i 4 dyskami:
“`bash
sudo mkfs.ext4 -E stride=128,stripe-width=384 /dev/md0
“`
Gdzie `stride = stripe_size / block_size` i `stripe-width = stride * (data_disks)`.
Kolizje UUID po klonowaniu dysku: Klonowanie dysku za pomocą `dd` duplikuje UUID systemu plików. Dwa urządzenia z identycznymi UUID powodują błędy montowania i uszkodzenie danych. Po klonowaniu wygeneruj ponownie UUID:
“`bash
sudo tune2fs -U random /dev/sdb1 # ext4
sudo xfs_admin -U generate /dev/sdb1 # XFS
“`
Jest to krytyczna kwestia przy wdrażaniu Serwerów Dedykowanych z obrazów dysków lub provisioningu wielu węzłów z jednego szablonu.
Kwestie dotyczące systemu plików w środowiskach VPS i chmurowych
Na maszynach wirtualnych i instancjach chmurowych bazowa pamięć masowa jest często wirtualnym dyskiem z cienkim provisioningiem opartym na rozproszonym systemie pamięci masowej. Kilka decyzji `mkfs` staje się bardziej znaczących w tym kontekście:
- Obsługa Discard/TRIM: Formatuj ext4 z `-E discard` lub dodaj opcję montowania `discard`, aby włączyć online TRIM, który zwraca zwolnione bloki do bazowej puli pamięci masowej i utrzymuje wydajność w czasie na instancjach VPS z cPanel opartych na SSD.
- Tryb dziennika: W przypadku aplikacji wrażliwych na opóźnienia rozważ tryb dziennika `data=writeback` w `/etc/fstab` dla ext4. Wymienia to ścisłe porządkowanie danych na niższe opóźnienie zapisu, akceptowalne dla baz danych zarządzających własnymi dziennikami zapisu z wyprzedzeniem.
- Unikaj formatowania swap jako systemu plików: Partycje swap używają `mkswap`, nie `mkfs`. Uruchomienie `mkfs` na partycji swap niszczy podpis swap bez tworzenia użytecznego systemu plików.
Podczas zarządzania pamięcią masową na Panelach Sterowania VPS, dodatkowe woluminy dysków zazwyczaj pojawiają się jako niesformatowane urządzenia blokowe. Przepływ pracy jest zawsze następujący: identyfikacja za pomocą `lsblk`, partycjonowanie jeśli potrzebne za pomocą `fdisk`/`gdisk`, formatowanie za pomocą `mkfs`, montowanie i utrwalanie w `/etc/fstab`.
Macierz decyzyjna: wybór właściwego systemu plików
Użyj tej macierzy, aby wybrać system plików na podstawie głównego ograniczenia:
| Główne wymaganie | Zalecany system plików | Unikaj |
|---|
| — | — | — |
|---|
| Ogólny serwer Linux | ext4 | Btrfs (narzut złożoności) |
|---|
| Duże pliki, bazy danych, NFS | XFS | FAT32 (brak uprawnień) |
|---|
| Migawki, podwoluminy, NAS | Btrfs | ext4 (brak natywnych migawek) |
|---|
| Wymienne nośniki USB między systemami operacyjnymi | exFAT lub FAT32 | ext4 (słaba obsługa Windows) |
|---|
| Partycja systemowa EFI | FAT32 (`mkfs.vfat -F 32`) | Jakikolwiek inny niż FAT |
|---|
| NVMe SSD, duża rotacja zapisu | F2FS lub XFS | FAT32 |
|---|
| Wolumin danych przy podwójnym rozruchu Windows | NTFS | ext4 |
|---|
| Miliony małych plików | ext4 z `-i 2048` | XFS (stała liczba i-węzłów) |
|---|
Techniczna lista kontrolna kluczowych wniosków
Przed uruchomieniem `mkfs` w dowolnym środowisku, przejdź przez tę listę kontrolną:
- Potwierdź docelowe urządzenie za pomocą `lsblk -f` i `blkid` — nigdy nie polegaj na pamięci ani założeniach
- Odmontuj cel za pomocą `umount /dev/sdXN` i zweryfikuj za pomocą `mount | grep sdX`
- Wykonaj kopię zapasową danych na urządzeniu; `mkfs` jest nieodwracalne
- Wybierz typ systemu plików na podstawie obciążenia (patrz macierz decyzyjna powyżej), a nie przyzwyczajenia
- Ustaw etykietę systemu plików za pomocą `-L` dla czytelnej identyfikacji w dziennikach i `fstab`
- Zmniejsz zarezerwowane bloki na dużych woluminach danych (`-m 1` dla ext4), aby odzyskać użyteczne miejsce
- Wyłącz leniwą inicjalizację (`-E lazy_itable_init=0`) na serwerach produkcyjnych, aby zapobiec skokom I/O po wdrożeniu
- Używaj UUID w `/etc/fstab`, a nie nazw urządzeń, dla trwałości montowania
- Sprawdź poprawność za pomocą `mount -a` po edycji `/etc/fstab`, aby wykryć błędy przed restartem
- Uruchom `e2fsck -n` lub `xfs_repair -n` po formatowaniu, aby potwierdzić integralność systemu plików
- Wygeneruj ponownie UUID na każdym dysku sklonowanym z obrazu szablonu
FAQ
P: Czy mogę uruchomić `mkfs` na partycji, która jest aktualnie zamontowana?
O: Technicznie jądro może na to pozwolić, ale zrobienie tego natychmiast uszkadza system plików i może wywołać paniki jądra lub utratę danych. Zawsze najpierw odmontuj partycję i potwierdź za pomocą `mount | grep <device>` przed uruchomieniem `mkfs`.
P: Jaka jest różnica między `mkfs.ext4` a `mke2fs`?
O: `mkfs.ext4` jest dowiązaniem symbolicznym lub wrapperem, który wywołuje `mke2fs` z domyślnymi ustawieniami `-t ext4`. Są one funkcjonalnie identyczne. `mke2fs` jest kanonicznym narzędziem i akceptuje pełen zakres opcji tworzenia ext2/ext3/ext4.
P: Dlaczego formatowanie dużej partycji ext4 trwa tak długo w porównaniu z XFS?
O: ext4 inicjalizuje tablicę i-węzłów dla każdej grupy bloków w czasie formatowania (chyba że ustawiono `lazy_itable_init=1`). Na woluminie 4 TB wiąże się to z zapisem gigabajtów wyzerowanych danych tablicy i-węzłów. XFS odkłada inicjalizację struktury do czasu wykonania, dzięki czemu `mkfs.xfs` kończy się w sekundach niezależnie od rozmiaru woluminu.
P: Jak zmienić etykietę systemu plików po formatowaniu bez ponownego formatowania?
O: Dla ext4 użyj `sudo tune2fs -L "NewLabel" /dev/sdb1`. Dla XFS użyj `sudo xfs_admin -L "NewLabel" /dev/sdb1`. Dla FAT32 użyj `sudo fatlabel /dev/sdb1 NEWLABEL`. Zmiana etykiety nie wpływa na dane.
P: Czy bezpiecznie jest używać `mkfs` na woluminie logicznym LVM?
O: Tak. Woluminy logiczne LVM pojawiają się jako urządzenia blokowe (np. `/dev/mapper/vg0-lv_data` lub `/dev/vg0/lv_data`) i są traktowane identycznie jak fizyczne partycje przez `mkfs`. Jest to standardowy przepływ pracy dla produkcyjnej pamięci masowej Linux: utwórz LV za pomocą `lvcreate`, sformatuj za pomocą `mkfs`, zamontuj i utrwal w `/etc/fstab`.
