LINUX.ORG.RU

Ответ на: комментарий от i-rinat

statfs и (statvfs - только 21 АПИ ) неправильно работает на андроид фонах... Результат работы statfs:

/system, mounted on /dev/block/mmcblk0p25:
        f_type: EXT2
        f_bsize: 4096
        f_blocks: 172213
        f_bfree: 172227
        f_bavail: 172243
        f_files: 172258
        f_ffree: 172274
        f_namelen: 255
/data, mounted on /dev/block/mmcblk0p26:
        f_type: EXT2
        f_bsize: 4096
        f_blocks: 172213
        f_bfree: 172227
        f_bavail: 172243
        f_files: 172258
        f_ffree: 172274
        f_namelen: 255
/cache, mounted on /dev/block/mmcblk0p27:
        f_type: EXT2
        f_bsize: 4096
        f_blocks: 172213
        f_bfree: 172227
        f_bavail: 172243
        f_files: 172258
        f_ffree: 172274
        f_namelen: 255
/system/lib, mounted on /dev/block/mmcblk0p28:
        f_type: EXT2
        f_bsize: 4096
        f_blocks: 172213
        f_bfree: 172227
        f_bavail: 172243
        f_files: 172258
        f_ffree: 172274
        f_namelen: 255
/devlog, mounted on /dev/block/mmcblk0p30:
        f_type: EXT2
        f_bsize: 4096
        f_blocks: 172213
        f_bfree: 172227
        f_bavail: 172243
        f_files: 172258
        f_ffree: 172274
        f_namelen: 255

Результат работы cat /proc/partitions:

cat /proc/partitions
major minor  #blocks  name

 179        0    2277376 mmcblk0
 179        1        500 mmcblk0p1
 179        2         64 mmcblk0p2
 179        3       4500 mmcblk0p3
 179        4          1 mmcblk0p4
 179        5      30000 mmcblk0p5
 179        6      12500 mmcblk0p6
 179        7       2048 mmcblk0p7
 179        8       3072 mmcblk0p8
 179        9       2048 mmcblk0p9
 179       10       1024 mmcblk0p10
 179       11       1024 mmcblk0p11
 179       12       8751 mmcblk0p12
 179       13       3072 mmcblk0p13
 179       14       3072 mmcblk0p14
 179       15       1024 mmcblk0p15
 179       16       8957 mmcblk0p16
 179       17        256 mmcblk0p17
 179       18       1024 mmcblk0p18
 179       19       1024 mmcblk0p19
 179       20       1280 mmcblk0p20
 179       21       8701 mmcblk0p21
 179       22       4096 mmcblk0p22
 179       23        256 mmcblk0p23
 179       24       2047 mmcblk0p24
 179       25     571391 mmcblk0p25
 179       26    1203199 mmcblk0p26
 179       27     148479 mmcblk0p27
 179       28     155648 mmcblk0p28
 179       29       3071 mmcblk0p29
 179       30      21247 mmcblk0p30
 179       31        256 mmcblk0p31
 179       64    7875584 mmcblk1
 179       65    7874560 mmcblk1p1

Возьмем к примеру /dev/block/mmcblk0p25 - правильно будет 571391 * 1024 = 585104384 b = 557.99902 Mb - это полный размер (из информации /proc/partitions)

А теперь возьмем statfs - f_bsize: 4096 * f_blocks: 172213 = 705384448 - это вообще что такое ? Оо

Посоветуйте другой способ, обязательно чтобы без рута ... очень нужно..

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer
struct statvfs {
               unsigned long  f_bsize;    /* размер блока файловой системы */
               unsigned long  f_frsize;   /* размер фрагмента */
               fsblkcnt_t     f_blocks;   /* размер ФС ===> в единицах f_frsize <=== */
Krieger_Od ★★
()
Ответ на: комментарий от FreakMurderer

f_blocks: 172213
f_bfree: 172227

Всего блоков меньше, чем свободных? Покажите, как вы это печатали?

Да и вообще, не смущает, что у вас для всех ФС statfs выдаёт одно и то же?

Sorcerer ★★★★★
()
Последнее исправление: Sorcerer (всего исправлений: 1)
Ответ на: комментарий от FreakMurderer

Во теперь с f_frsize;

/system, mounted on /dev/block/mmcblk0p25:
        f_type: EXT2
        f_bsize: 4096
        f_blocks: 172229
        f_bfree: 172243
        f_bavail: 172259
        f_files: 172274
        f_ffree: 172290
        f_namelen: 255
        f_frsize: 4096
И что делать ?

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Мой косяк по ходу был сначала так писал

printf("\tf_blocks: %ld\n", vfs.f_blocks);
Потом исправил на :
printf("\tf_blocks: %qu\n", vfs.f_blocks);

Сейчас сходится с информацией, выдаваемой по DF. Но теперь снова вопрос: почему в DF размер mmcblk0p25 = 575901696 а /proc/partitions - 585104384 ?

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Я так понимаю, /proc/partitions содержит информацию безотносительно файловой системы, т. е. то что в таблице разделов записано: данные файловой системы располагаются в блоках таких-то.

df же напротив, показывает полный доступный размер для данных в файловой системе, занятое файлами место и свободное место. При этом кроме собственно файлов в ФС есть еще куча метаданных, которые имеют ненулевой размер, отсюда и разница.

Kiborg ★★★
()
Ответ на: комментарий от FreakMurderer

http://linux.die.net/man/5/proc

/proc/partitions
Contains major and minor numbers of each partition as well as number of blocks and partition name

http://linux.die.net/man/1/df

df displays the amount of disk space available on the file system containing each file name argument. If no file name is given, the space available on all currently mounted file systems is shown. Disk space is shown in 1K blocks by default, unless the environment variable POSIXLY_CORRECT is set, in which case 512-byte blocks are used.

Тут надо различать понятия «раздел» и «файловая система на разделе». Вторая может быть меньше (то есть конец файловой системы не обязан совпадать с размером раздела).

Kiborg ★★★
()
Ответ на: комментарий от Kiborg

Ок, спасибо Наверное буду брать полный размер из /proc/partitions , отнимать фри размер из fsstat, чтобы получить использованный правильный размер... Так будет правильно , вообще то ?

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Вообще-то, вроде как, и не правильно. Я думаю, стоит в этом смысле ориентироваться на df. Всё равно это в некотором смысле приблизительные цифры, так что до байта размер рассчитать не выйдет.

Просто если брать размер раздела, а отнимать свободное место на файловой системе, это получается как будто мы из километров вычитаем голубое: непонятно, как потом полученную цифру интерпретировать. Хотя, впрочем, я кажется могу придумать, зачем она может быть нужна. Задачу можешь более явно описать, что потом с этим знанием делать надо?

Kiborg ★★★
()
Ответ на: комментарий от Kiborg

Пишу инфо утилиту для андроида. Дело в том , что мое замечание Програмно узнать свободный размер точки монтирования (комментарий) по подсчетам использованного и свободного места в точности соответствует методике подсчета одной из популярных дисковых инфо утилит, выложенных в андроид маркете ...

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

printf(«\tf_blocks: %qu\n», vfs.f_blocks);

Надежней так:

printf("\tf_blocks: %ju\n", (uintmax_t)vfs.f_blocks);

Sorcerer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.