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



--
FreeBSD mailing list ([email protected])
http://www.freebsd.cz/listserv/listinfo/users-l

Odpovedet emailem