Portál AbcLinuxu, 11. května 2025 18:44

Dotaz: Jak zjistit volné místo na disku? (C/C++)

30.1.2010 20:25 kralyk z abclinuxu | skóre: 29 | blog:
Jak zjistit volné místo na disku? (C/C++)
Přečteno: 1041×
Odpovědět | Admin
Ahoj,

potřeboval bych, aby můj program uměl zjistit volný místo na disku. Z dokumentace jsem si vytáhl statfs(2) a následně napsal takovýhle kód:
  struct statfs stats;

  cout << statfs(path.c_str(), &stats) << endl;   /* path = "/" */
  cout << stats.f_bfree << " [" << stats.f_bsize << "]" << endl;
  cout << stats.f_bfree * stats.f_bsize << endl;
Statfs proběhlo v pořádku (vrací nulu), ale výsledný volný místo se dost liší od čísla co ukazuje df, asi vo 1.5 Giga. To se mi vůbec nelíbí. Podezírám stafs(), že mi vrací nějaký bullshity. Zkoušel jsem i statvfs(), ale výsledek byl stejný.
Nahlídl jsem do zdrojáků df, no ale kdo se má v tom jejich #define pekle vyznat. Používaj tam taky statvfs(), ale dělaj okolo toho nějaký úpravy, který se mi nepodařilo dešifrovat...

Pro úplnost ještě přihodim příslišný výpisy z shellu:
root|vojta-dell /tmp #> /cesta/k/programu
0
1542023 [4096]
6316126208
root|vojta-dell /tmp #> df -h
Souborový systém  Velikost Užito Volno Uži% Připojeno do
/dev/sda1              30G   24G  4,4G  85% /
(...)
Díky za každou radu.
SPD vůbec není proruská

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

AraxoN avatar 30.1.2010 20:38 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Odpovědět | | Sbalit | Link | Blokovat | Admin
A nebude to tým, že df ukazuje voľné miesto využiteľné bežným používateľom? (5% veľkosti fs je rezervované pre roota)
30.1.2010 20:47 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Asi ne. Ta hodnota, co ukazuje df jsou asi 3/4 tý, co dostanu ze statfs()...
30.1.2010 20:50 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Abych byl přesný, statfs() ukazuje 6'166'932 volných 1K bloků, zatímco df jen 4'594'128 1K bloků.
Jendа avatar 30.1.2010 20:56 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Takže rozdíl je +/- 1,5 G (jsem líný to přepočítávat přes 1024, ale o tom radši pomlčíme ;-)). A kolik je 5% z 30 G?
30.1.2010 21:00 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Hergot, sem to ale hlupák :-D
na co to svést? Jó, už vím, na notebooku se špatně pracuje s kalulačkou, nemám numpad :-D

Každopádně díky.
30.1.2010 21:42 nikdo
Rozbalit Rozbalit vše kalkulačka? :-D
No nevím 5% z 30 se snad počítá z hlavy ne? 30/20 = 3/2 = 1,5 :D
30.1.2010 22:21 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: kalkulačka? :-D
No já hlavně počítal chvílema špatnej filesystém (co byl na /dev/loop), se mi to celý v mylšenkách pomíchalo, zmatek, chaos,... :-D
30.1.2010 21:10 mich | skóre: 16
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zajimavé. Mě ukazuje f_bavail spravne číslo.:-(
je to teď v módě, na žive o tom furt píšou
Jendа avatar 30.1.2010 21:12 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Nemáš FS bez vyhrazených bloků? (asi všechny kromě ext)
30.1.2010 21:24 mich | skóre: 16
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
ve struct stafts jsou 2 promenne ukazujici volne misto:
long    f_bfree;    /* free blocks in fs */
long    f_bavail;   /* free blocks avail to non-superuser */
neni jejich rozdil je podle me tech 5% o kterych se tu mluvi
je to teď v módě, na žive o tom furt píšou
30.1.2010 21:31 mich | skóre: 16
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Radši to dopíšu aby to bylo jasné - tazatel používá f_bfree, ale má používat f_bavail
je to teď v módě, na žive o tom furt píšou
30.1.2010 22:25 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
A proč? Mně nevadí, jestli se filesystém zabere po vrch. Příslušnej kód stejně nepůjde jinde, než pod právama roota. Šlo mi jen o to, aby to číslo nebyla nějaká úplná hovadina, a to se díky tobě prokázalo, že není...
AraxoN avatar 30.1.2010 23:16 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Vlastný C-éčkový program bežiaci pod právami roota? Podľa mňa zlý nápad. Ak nie si C/C++ guru, tak je veľmi jednoduché spraviť chybu, nedočítať manuál ku funkcii, neošetriť nejaký vstup, či zabudnúť na akúsi zriedkavú okrajovú podmienku.
31.1.2010 00:45 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Je možné nastavit loop device a mountovat ho bez práv roota? Pokud ano, nebyly by práva roota nezbytný...
Jendа avatar 31.1.2010 00:49 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
man sudo

(a jinak pokud se dá do fstabu s parametry loop a user, tak přimountovat půjde bez roota)
31.1.2010 01:01 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Ále sudo znám, co já potřebuju je nastavovat loop a mountovat přímo z programu - voláním API. Mountuje se voláním mount() a loop se nasstavuje před ioctl(). Tam mi je sudo nahouby.
Leda bych volal externí nástroje mount a losetup, ale to mi nepřijde jako právě čistý řešení, radši bych se tomu vyhnul...
31.1.2010 13:32 vencas | skóre: 32
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
To se řeší tak, že velmi krátký hlavní program (který např. provede mount) se pustí rootem, ale sám pak pustí jiný proces s omezeným uživatelem. Např. zde.
31.1.2010 13:34 vencas | skóre: 32
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
(což funguje jen s mountem hned na začátku, jinak ne -- pardon)
31.1.2010 14:57 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Ok, díky, mrknu na to.

V zásadě by mi mohlo stačit, když na začátku zrušim veškerý capabilities a pak ve chvíli, kdy potřebuju mount() nebo ioctl() na chvíli příslušnou capabilitie(s) povolim, ne?
31.1.2010 15:05 benn | skóre: 18
Rozbalit Rozbalit vše Re: Jak zjistit volné místo na disku? (C/C++)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Kdysi jsem taky potřeboval, zjišťovat využité místo a vyšel jsem z df od BusyBoxu. Kde počítají:

Využité místo v procentech:
blocks_used = s.f_blocks - s.f_bfree;
blocks_percent_used = 0;
if (blocks_used + s.f_bavail) {
       blocks_percent_used = (blocks_used * 100ULL + (blocks_used + s.f_bavail)/2) / (blocks_used + s.f_bavail);
}

A zbytek informaci:
static unsigned long kscale(unsigned long b, unsigned long bs)
{
       return (b * (unsigned long long) bs + 1024/2) / 1024;
}

printf(" %9lu %9lu %9lu %3u%% %s\n",
	kscale(s.f_blocks, s.f_bsize),    Celkova kapacita (kB)
	kscale(s.f_blocks - s.f_bfree, s.f_bsize),   Vyuzito (kB)
	kscale(s.f_bavail, s.f_bsize),     Dostupne misto (kB)
	blocks_percent_used, mount_point); Procent zaplneni a pripojny bod

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.