Что возросло со статистикой на Mac OS X / на Darwin? Или файловые системы без имен

В ответ на вопрос я спросил относительно Так, Дайте точку монтирования пути, один респондент предложил использовать stat связать имя устройства с объемом данного пути. Это работает приятно над Linux, но дает сумасшедшие результаты на Mac OS X 10.4. Для моей системы, df и монтируются, дайте:

cas cas$ df
Filesystem              512-blocks     Used     Avail Capacity  Mounted on
/dev/disk0s3              58342896 49924456   7906440    86%    /
devfs                          194      194         0   100%    /dev
fdesc                            2        2         0   100%    /dev
<volfs>                       1024     1024         0   100%    /.vol
automount -nsl [166]             0        0         0   100%    /Network
automount -fstab [170]           0        0         0   100%    /automount/Servers
automount -static [170]          0        0         0   100%    /automount/static
/dev/disk2s1             163577856 23225520 140352336    14%    /Volumes/Snapshot
/dev/disk2s2             409404102  5745938 383187960     1%    /Volumes/Sparse
cas cas$ mount
/dev/disk0s3 on / (local, journaled)
devfs on /dev (local)
fdesc on /dev (union)
<volfs> on /.vol
automount -nsl [166] on /Network (automounted)
automount -fstab [170] on /automount/Servers (automounted)
automount -static [170] on /automount/static (automounted)
/dev/disk2s1 on /Volumes/Snapshot (local, nodev, nosuid, journaled)
/dev/disk2s2 on /Volumes/Sparse (asynchronous, local, nodev, nosuid)

Попытка получить устройства от точек монтирования, хотя:

cas cas$ df | grep -e/ 
            | awk '{print $NF}' 
            |  while read line; do echo $line $(stat -f"%Sdr" $line); done
/ disk0s3r
/dev ???r
/dev ???r
/.vol ???r
/Network ???r
/automount/Servers ???r
/automount/static ???r
/Volumes/Snapshot disk2s1r
/Volumes/Sparse disk2s2r

Здесь, я подаю каждую из точек монтирования, очищенных от df до статистики, производя результаты "%Sdr" строки формата, которая, как предполагается, является именем устройства: статистика Cf. (1) страница справочника:

The special output specifier S may be used to indicate that the
output, if applicable, should be in string format.  May be used
in combination with:
...
             dr      Display actual device name.

Что продолжается? Действительно ли это - ошибка в статистике или некоторый Darwin странность VFS?

Постскриптум На Andrew McGregor, попытайтесь передать "%Sd" статистике для большей странности. Это перечисляет некоторое по-видимому произвольное подмножество файлов от CWD...

3
задан 23.05.2017, 15:41

3 ответа

Во-первых, как формат статистики, "%Sdr" интерпретируется как d полевой селектор, измененный S спецификатор, сопровождаемый литеральным строчным символом R.

Страница справочника, вероятно, была бы более четкой, если бы она сказала "d, r" вместо "доктора" в соответствии с описанием S. d и r оба отдельные полевые селекторы. r выбирает номер устройства из статистики (2) информация (т.е. st_rdev; только полезный при утверждении записей устройства (т.е. записи под/dev)). d выбирает номер устройства устройства, которое содержит установленную запись (т.е. st_dev). Число, которое это печатает, является комбинацией главных и незначительных чисел, показанных ls (главный <<24 | незначительный).

S модификатор, который может быть применен к обоим d, r, и несколько других полевых селекторов. При применении к d или r, это пытается распечатать название устройства вместо его необработанного числа. Некоторые устройства, как устройства виртуальной файловой системы, не имеют имен собственных, таким образом, это печатает ??? вместо этого (могло бы быть более хорошо, если бы это распечатало <major>,<minor> вместо этого). Это не означает, что эти файловые системы не имеют устройств, просто что их устройства не имеют нормальных имен как "disk0s3".

“Странность оболочки” (“по-видимому произвольное подмножество файлов от CWD”) происходит из-за отсутствия заключения в кавычки. Оболочка видит (неупомянутый) "???" закончитесь и разворачивает его как шаблон шарика. Если cwd содержит какие-либо записи точно с тремя байтами (символы, в зависимости от локали?), оболочка заменит теми записями шаблон шарика. Поведение (заключение в кавычки и расширение шарика) варьируется оболочкой и может обычно изменяться различными опциями оболочки.

Можно изменить исходную команду как это для предотвращения globbing и запаздывания "r":

df | grep -e/ | awk '{print $NF}' |  while read line; do echo "$line" "$(stat -f%Sd "$line"); done

Но я, вероятно, записал бы это как это вместо этого:

df | tail +2 | awk '{print $NF}' | xargs stat -f'%N %Sd %d'
  • Обратите внимание, что это перестало работать для любых смонтированных файловых систем, имеют пробелы на их имена точки монтирования. Ни один, которого вывод монтирования или df супер легок с готовностью проанализировать (у обоих есть поля, которые могли бы иметь почти произвольные строки в них).

С тем выводом (имя, номер устройства, имя устройства), можно, возможно, получить лучшее представление о том, что продолжается.

Или, возможно, требуется видеть, главные и незначительные числа, кроме того, чисел неструктурированного устройства (сравните их с тем, что Вы видите в (например). ls -l /dev/disk0s3):

df | tail +2 | awk '{print $NF}' | xargs stat -f'%N %Sd %d' | 
  awk 'BEGIN{f=2^24} {$(NF+1) = int($NF/f) "," ($NF%f) } 1'

Вот маленькая программа C, которая может заменить проблематичное "df | голова | awk" конвейер.

Конечно, такая программа C могла сделать остальных сама работа, но могло бы быть хорошо иметь автономную программу, которая может просто выложить завершенные точки монтирования NUL.

mountz | xargs -0 stat -f'%N %Sd %d' | 
  awk 'BEGIN{f=2^24} {$(NF+1) = int($NF/f) "," ($NF%f) } 1'

Код:

#include <sys/mount.h>
#include <stdio.h>
#include <stdlib.h>

/* usage: mountz | xargs -0 command_for_each_mount_point */

int main(int argc, const char *argv[]) {
    struct statfs *buf;
    int flags = MNT_NOWAIT, num_fs, num_stat, i;
    unsigned bufsz;

    num_fs = getfsstat(NULL, 0, flags);
    if (num_fs < 0) {
        perror("unable to count mounted filesystems: getfsstat");
    exit(1);
    }

    bufsz = sizeof(*buf) * num_fs;
    buf = malloc(bufsz);
    if (!buf) {
        perror("unable to allocate %u statfs structs");
    exit(1);
    }
    fprintf(stderr, "p=%p\n", buf);

    num_stat = getfsstat(buf, bufsz, flags);
    if (num_stat < 0) {
        perror("unable to getfsstat");
    exit(1);
    }
    if (num_stat != num_fs) {
    fprintf(stderr, "Hmm, expected %u, got %d.\n", num_fs, num_stat);
    }

    for (i = 0; i < num_stat; i++) {
    fprintf(stdout, "%s%c", buf[i].f_mntonname, 0);
    }
}
3
ответ дан 08.12.2019, 00:09

Таким образом, виртуальные файловые системы не имеют устройств - я не попробовал его за те файловые системы. Это не проблема для Сети/,/automount/Servers или/automount/static, поскольку они не должны содержать файлы. Но/dev интересен.

1
ответ дан 08.12.2019, 00:09
df | grep -e/ | awk '{print $NF}' |  while read line; do echo $line $(stat -f"%Sd" $line); done
/ disk0s2
/dev XGS bin tmp
/net XGS bin tmp
/home XGS bin tmp

Я сказал бы, Darwin странность VFS.

1
ответ дан 08.12.2019, 00:09

Теги

Похожие вопросы