změna velikosti UFS partition

Dan Lukes dan at obluda.cz
Fri Mar 11 21:24:23 CET 2011


On 11.3.2011 20:43, Radek Krejča:
> Virtualizacni nastroje timto umoznuji, aby jejich vnitrni struktura predstavujici disk (v tomto pripade nekolik souboru) se tvarila na venek jako "nejak velka" a pritom byla mensi a v pripade potreby se roztahla na vice.
> Nicmene filesystem daneho hosta uz o tom nema tuseni a virtualizacni software hostovi v podstate podstrkuje falesne informace, kdy mu tvrdi, ze ta diskova jednotka ma kapacitu rekneme 20 GB, ale ona ve skutecnosti ma 5

Obavam se, ze uroven "lhani" je jeste o uroven niz. Dokonce ani 
virtualizacni system nevi (pokud si to specialne nezjisti), ze onen 20GB 
soubor, ktery prave vytvoril, zabira na hostujicim OS jen 5GB.

Zacnu tim, ze vlasttnost "sparse" neni neco, co by se muselo nejak 
specialne nastavovat. Kazdy soubor na filesystemu (pokud dany FS vubec 
principialne tuto feature podporuje) muze obsahovat "diry".

SPARSE soubory funguji takto - soubor ma nejakou deklarovanou velikost. 
To ale neznamena, ze ma pro celou deklarovanou velikost take naalokovane 
datove bloky.

Datove bloky se k souboru alokuji az v okamziku, kdy se do nich skutecne 
zapisuje.

Cist lze i z neexistujicich bloku - pri cteni z takoveho mista souboru, 
ktere nema alokovany datovy blok vrati filesystem "simulovany obsah", 
obvykle same 0x00. Cteni samo nezpusobuje alokaci bloku. Teprve zapis ano.

Typicky zpusob, jak vytvorit soubor, ve kterem se nasledne emuluje 
nejaky hostovany FS je takovy, ze vytvorite soubor, seeknete na 
pozadovany konec (tim "nastavite" delku) a je hotovo. Soubor nema zadny 
naalokovany datovy blok. Pokud se podivate pomoci 'ls', ukaze se vam 
deklarovana velikost souboru - ale pomoci 'df' zjistite, ze na disku 
zadne misto neubylo.

O neco pozdeji ho naformatujete - to znamena, ze na nekolik malo mist 
zapisete formatovaci informace - kopie superbloku, nejake alokacni 
tabulky, no proste to, co fs po disku potrebuje mit. Tim dojde k zapisu 
na nekolik malo mist - a alokaci nekolika malo datovych bloku. 
Deklarovana velikost souboru se nezmeni, 'df' ukaze ubytek trochy mista, 
ale stale o dost mene nez je deklarovana velikost.

Pri zapisu souboru na simulovany disk dochazi k zapisu do ruznych mist 
souboru a tim se teprve skutecne alokuji datove bloky.

Pokud datovy blok neni k dispozici, zapis selze (ENOSPC). Mimochodem - 
programatorskym poucenim z tohoto popisu budiz poznani, za zapis muze an 
nedostatek mista na disku selhat nejen pri "psani na konec", ale 
kdykoliv - pri psani do kterekoliv casti souboru.

Pro zajemce nabizim, nasledujici ukazku:

> df -g / ; ls -la ; dd if=/dev/zero oseek=250G bs=512 count=1 of=sparse.file ; df -g / ; ls -la

> Filesystem   1G-blocks Used Avail Capacity  Mounted on
> /dev/ada0s1a        27   17     7    70%    /

> total 8
> drwxr-xr-x   2 dan  wheel   512 Mar 11 21:08 .
> drwxr-xr-x  28 dan  wheel  5120 Mar 11 21:06 ..

> 1+0 records in
> 1+0 records out
> 512 bytes transferred in 0.000121 secs (4227330 bytes/sec)

> Filesystem   1G-blocks Used Avail Capacity  Mounted on
> /dev/ada0s1a        27   17     7    70%    /

> total 88
> drwxr-xr-x   2 dan  wheel              512 Mar 11 21:09 .
> drwxr-xr-x  28 dan  wheel             5120 Mar 11 21:06 ..

> -rw-r--r--   1 dan  wheel  137438953472512 Mar 11 21:09 sparse.file

Jak je videt, deklarovana velikost vytvoreneho souboru vyznamne 
previsuje celkovou velikost FS na kterem byl vytvoren (o volnem miste 
nemluve) - a volne misto neubylo.

> Dalsi veci je, ze zvetsit teoreticky problem neni (pokud to samozrejme dany filesystem umi), ale zmensit je problem - na urezavane casti mohou byt data a ty je treba nejak osetrit.

To se v praxi (na zivem systemu) vetsinou dela tak, ze se se snazis 
vsechny bloky, ktere jsou kandidaty na budouci "odriznuti" shromazdit do 
jednoho souboru, ktery sisi pro tyto ucely vytvoril. Volne alokujes 
primo, zabrane musis nejprve nekam premistit.

To, samozrejme, musu delat nekdo, kdo strukture FS rozumi a navic musi 
mit k systemu dostatecne vhodny prostup = musi byt schopen "pridat" do 
souboru konkretni blok, ktery oznaci, a musi byt chopen u existujicich 
souboru manipulovat se seznamena alokovanych bloku.

Pote, co mas relokaci dokoncenou muzes FS zmensit a pritom odstranis 
zminky o tom dvem pomocnem souboru.

Prave takovy tool pro FreeBSD neexistuje, a pokud vim, ani FS API 
neobsahuje funkce, ktere by jeho vytvoreni umoznily (to znamena, ze by 
stale mohl byt vytvoren, ale uz by nemohl pracovat na "zivem" FS).

Dan





More information about the Users-l mailing list