Portál AbcLinuxu, 30. dubna 2025 08:04
V tomto díle unixových (nebo spíše čím dál více linuxových) nástrojů se podíváme na nástroje pro práci s diskovými oddíly.
Nástroje z rodiny fdisk, tedy fdisk, sfdisk nebo cfdisk, slouží k editaci nebo prohlížení diskových oddílů v klasickém DOSovém formátu (MBR/MPT). Ten je tu s námi už cca. od roku 1983 a pro většinu použití šlo doposud o koncept postačující. Můžeme mít celkem až 16 diskových oddílů, i když s určitými komplikacemi při pozdějším přidávání oddílů kvůli volitelnému rozdělení do dvou úrovní na logické oddíly.
fdisk je pravděpodobně první nástroj, který každého napadne (tedy kromě grafických klikátek). První funkcí je vypsat přehled diskových oddílů pomocí argumentu -l:
# fdisk -l /dev/sde Disk /dev/sde: 1000.2 GB, 1000204886016 bytes, 1953525168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk label type: dos Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sde1 * 63 289169 144553+ fd Linux raid autodetect Partition 1 does not start on physical sector boundary. /dev/sde2 289170 1945792799 972751815 fd Linux raid autodetect Partition 2 does not start on physical sector boundary. /dev/sde3 1945792800 1953520064 3863632+ fd Linux raid autodetect
V prvním sloupci je odpovídající název blokového zařízení pro daný oddíl, dále pak vidíme přítomnost bootovacího příznaku, začátek a konec oddílů v počtu bloků od začátku disku, počet bloků a ID systému souborů nastavené v tabulce oddílů.
Zde bych chtěl zdůraznit, že ID je skutečně jen jednobajtová hodnota uložená v tabulce. Nemusí odpovídat skutečnosti a Linux k ní ani nepřihlíží. Jinak to může být na Windows/DOSu. Taktéž příznak označující bootovací oddíl byl důležitý hlavně v dobách DOSu. Velkou výjimkou jsou embedded zařízení, kde firmware hledající zavaděč tyto „speciality“ vyžaduje obvykle také. Speciální kapitolou jsou pak BIOSy, které šťourají, kam nemají (posíláme pozdravy do Intelu).
Další funkcí je vypsání velikosti vybraných oddílů pomocí -s:
# fdisk -s /dev/sde* /dev/sde: 976762584 /dev/sde1: 144553 /dev/sde2: 972751815 /dev/sde3: 3863632
Pro úpravu oddílů spusťte fdisk bez argumentů. Dostanete se tím do jednoduchého příkazového rozhraní, kde můžete přidávat oddíly (n), mazat oddíly (d), změnit ID oddílu (t), vypsat oddíly (p) a zapsat změny na disk (w).
Ne vždy se při zápisu změn na disk podaří v systému načíst nové rozdělení disku (fdisk na to upozorní). To znamená, že bloková zařízení /dev/sdxN nebudou odpovídat nové tabulce oddílů (nebo mohou úplně chybět apod.). Jde o důsledek toho, že s těmito zařízeními zrovna něco pracuje (nějaký proces, připojený systém souborů atp.). Pokud se vám podaří dodatečně najít důvod, proč nešlo novou tabulku načíst a odstranit jej, pak můžete příkazem partprobe /dev/sdx zkusit opětovné načtení ručně.
Hlavním důvodem, proč většina uživatelů „staré dobré“ MBR/MPT opouští, je omezení velikosti spravovaného disku na 2 TB. Pokud se pokusíte na větším disku použít fdisk, dostanete následující varování:
WARNING: The size of this disk is 3.0 TB (3000592982016 bytes). DOS partition table format can not be used on drives for volumes larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID partition table format (GPT).
Na GPT se podíváme za chvilku.
sfdisk je neinteraktivní nástroj pro úpravu tabulek oddílů MPT. Může se hodit při automatizovaném zápisu tabulek oddílů ze skriptů, protože mu například stačí předat budoucí stav v definovaném formátu a on jej zapíše. Tímto použitím se tu ale zabývat nebudeme.
Kromě toho, že sfdisk přijímá argumenty -s a -l podobně jako fdisk, je možné sfdisk použít ke dvěma zajímavým věcem: záloze tabulky oddílů a kopírování tabulky oddílů mezi dvěma disky. Pokud nevíte, proč si tabulku oddílů zálohovat, tak vám ji asi ještě nějaký méně inteligentní rozšířený operační systém z rozmaru nepřepsal.
Zde bych ještě zdůraznil, že chybným odstraněním oddílu nepřicházíte o data v oddílu uložená, ale můžete si tím přivodit nepříjemnosti (ztracené oddíly vám pomůže najít gpart). Běžným postupem pro zvětšení oddílu je proto oddíl odstranit a vytvořit nový, větší se stejným začátkem.
sfdisk -d nám vytvoří výpis tabulky oddílů, který je nejen stále čitelný uživatelům, ale současně jej sfdisk dokáže později znovu načíst. Ukázka:
# sfdisk -d /dev/sde # partition table of /dev/sde unit: sectors /dev/sde1 : start= 63, size= 289107, Id=fd, bootable /dev/sde2 : start= 289170, size=1945503630, Id=fd /dev/sde3 : start=1945792800, size= 7727265, Id=fd /dev/sde4 : start= 0, size= 0, Id= 0
Takto můžeme tabulku oddílů okopírovat z disku sde na disk sdf:
# sfdisk -d /dev/sde | sfdisk /dev/sdf
A zbývá nám cfdisk. Ten umožňuje úpravu tabulky oddílů v textovém uživatelském rozhraní, takže je ze zmiňovaných konzolových nástrojů asi nejvíce „uživatelsky přívětivý“. Pomocí šipek nahoru a dolu volíme oddíly a pomocí šipek doleva a doprava volíme úkony.
Skupina nástrojů „GPT fdisk“ zahrnuje nástroje gdisk, sgdisk a cgdisk. Používají se a vypadají velice podobně jako nástroje (s,c)fdisk, jen s tím rozdílem, že s nimi operujeme s tabulkou typu GPT. Pozor dávejte na to, že GPT zahrnuje fiktivní tabulku MPT, takže fdisk může na první pohled ukazovat něco, co vypadá správně. Při bližším prozkoumání ale rychle zjistíte, že jde o fiktivní data. Ukázka:
# fdisk -l /dev/sdc Disk /dev/sdc: 3000.6 GB, 3000592982016 bytes, 5860533168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk label type: dos Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdc1 1 4294967295 2147483647+ ee GPT Partition 1 does not start on physical sector boundary.
GNU parted poslouží jako dobrá náhrada fdisku i gdisku, protože si hravě poradí s MPT i GPT. Jeho spuštění je prosté:
# parted /dev/sdc GNU Parted 3.1 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: ATA ST3000DM001-9YN1 (scsi) Disk /dev/sdc: 3001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 3001GB 3001GB ext4
Pokud nechceme očima hledat případné mezery, kam by se dalo ještě strčit nějaký oddíl, stačí napsat print free:
(parted) print free Model: ATA ST3000DM001-9YN1 (scsi) Disk /dev/sdc: 3001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 17.4kB 1049kB 1031kB Free Space 1 1049kB 3001GB 3001GB ext4 3001GB 3001GB 466kB Free Space
Pokud na disku ještě žádnou tabulku oddílů nemáme, můžeme příkazem mktable gpt (případně mktable msdos pro MPT) prázdnou vytvořit. Oddíly pak můžeme přidávat následovně:
(parted) mkpart primary 0 1000
Pro změnu velikosti oddílu nemusíme používat příkaz rm, ale můžeme použít také resize. Při používání GPT si můžeme oddíl pojmenovat příkazem name:
(parted) name 1 zeus_3tb (parted) print Model: ATA ST3000DM001-9YN1 (scsi) Disk /dev/sdc: 3001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 3001GB 3001GB ext4 zeus_3tb
Zajímavostí je vestavěná funkce hledání ztracených oddílů. Pokud si nějaký oddíl nechtěně smažete a změny zapíšete, rescue vám při zadání začátku a konce hledání může pomoci. V partedu funguje doplňování tabulátorem a ku pomoci vám je i příkaz help.
Stejně jako u fdisku můžeme použít argument -l pro rychlé vypsání tabulky oddílů. Na rozdíl od fdisku zde ale nepředáváme disk, u kterého chceme tabulku zobrazit – zobrazí se tabulky ze všech blokových zařízení v systému.
findmnt se nám do mixu předchozích nástrojů úplně nehodí, ale i tak podle mě stojí za pozornost, takže jej zmíním. Mezi rozšířené způsoby, jak vypsat přípojné body patří příkaz mount, popřípadě čtení souborů /etc/mtab a /proc/mounts.
Výstup z těchto příkazů/souborů se sice elegantně parsuje ve skriptech, ale něco tam hledat je tak trochu namáhavé. Je tu ale findmnt, který nám dovede práci ušetřit. Pokud jej spustíme bez argumentů, dostaneme přehledný výstup připojených systémů souborů – ve sloupcích a s hierarchií:
# findmnt TARGET SOURCE FSTYPE OPTIONS / /dev/md3 ext4 rw,noatime,errors=remount-ro,data=ordered ├─/proc proc proc rw,nosuid,nodev,noexec,relatime │ ├─/proc/bus/usb usbfs usbfs rw,nosuid,noexec,relatime,devgid=85,devmode=664 │ └─/proc/fs/nfsd nfsd nfsd rw,nosuid,nodev,noexec,relatime ├─/run tmpfs tmpfs rw,nosuid,nodev,relatime,mode=755 ├─/dev udev devtmpfs rw,nosuid,relatime,size=10240k,nr_inodes=2039834,mode=755 │ ├─/dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,mode=620 │ └─/dev/shm shm tmpfs rw,nosuid,nodev,noexec,relatime ├─/sys sysfs sysfs rw,nosuid,nodev,noexec,relatime │ ├─/sys/kernel/debug debugfs debugfs rw,nosuid,nodev,noexec,relatime │ └─/sys/fs/cgroup cgroup_root tmpfs rw,nosuid,nodev,noexec,relatime,size=10240k,mode=755 │ ├─/sys/fs/cgroup/openrc openrc cgroup rw,nosuid,nodev,noexec,relatime,release_agent=/lib64/rc/sh/cgroup-release-agent.sh,name=openrc │ ├─/sys/fs/cgroup/cpuset cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset │ ├─/sys/fs/cgroup/cpu cpu cgroup rw,nosuid,nodev,noexec,relatime,cpu │ ├─/sys/fs/cgroup/cpuacct cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct │ └─/sys/fs/cgroup/freezer freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer ├─/home /dev/md127 ext4 rw,noatime,data=ordered ├─/var/log /dev/md126 ext2 rw,noatime,errors=continue ├─/mnt/zeus_3tb /dev/sdc1 ext4 rw,noatime,data=ordered ├─/diskless/10.10.10.2/usr/portage /dev/md3[/usr/portage] ext4 rw,relatime,errors=remount-ro,data=ordered ├─/var/tmp/portage none tmpfs rw,relatime ├─/tmp none tmpfs rw,relatime ├─/var/lib/nfs/rpc_pipefs rpc_pipefs rpc_pipefs rw,relatime ├─/diskless/eros/usr/portage /dev/md3[/usr/portage] ext4 rw,noatime,errors=remount-ro,data=ordered ├─/diskless/eros/proc none proc rw,relatime └─/diskless/eros/home/shared /dev/md127[/shared] ext4 rw,noatime,data=ordered
Hranaté závorky ve sloupci SOURCE značí použití mount -o bind na podadresář v daném systému souborů. Pokud findmnt předáme adresář jako argument, vypíše nám informace jen o systému souborů v daném umístění:
# findmnt /mnt # findmnt /mnt/zeus_3tb/ TARGET SOURCE FSTYPE OPTIONS /mnt/zeus_3tb /dev/sdc1 ext4 rw,noatime,data=ordered
Pokud právě na daném místě nic připojeného není, pak nevypíše nic. Pomoci si můžeme argumentem -T, který vypíše informace i v případě, že předáváme nějaký podadresář v systému souborů:
# findmnt -T /mnt TARGET SOURCE FSTYPE OPTIONS / /dev/md3 ext4 rw,noatime,errors=remount-ro,data=ordered
Než se zase uchýlíte k používání grepu, tak vězte, že findmnt má i schopnosti filtrování. Takto například omezíme výpis jen na systémy souborů tmpfs:
# findmnt -t tmpfs TARGET SOURCE FSTYPE OPTIONS /run tmpfs tmpfs rw,nosuid,nodev,relatime,mode=755 /dev/shm shm tmpfs rw,nosuid,nodev,noexec,relatime /sys/fs/cgroup cgroup_root tmpfs rw,nosuid,nodev,noexec,relatime,size=10240k,mode=755 /var/tmp/portage none tmpfs rw,relatime /tmp none tmpfs rw,relatime
Jako bonus můžete nechat pomocí argumentu --poll program čekat na změny na nějakém přípojném bodu. Změnami se rozumí připojení, odpojení nebo změna voleb připojení (remount).
blockdev --rereadpt
hdparm -z /dev/<zařízení>
kpartx
, nastaví offsety za vás.
takze asi uz nebude umet vytvaret oddily novych souborovych systemuTak to je jenom o tom hexa kódu…
Taky bylo jen malo co mu stacilo dodat k dokonalosti, napr. menit velikost stavajicich oddiluAno, to mě tam vždycky hrozně štvalo. Řeším to smazáním a vytvořením většího.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.