ls -s использует неправильный размер блока

У каждого файла есть владелец и группа. Если Test1 создает файл, принадлежащий группе 100, Test2 может получить к нему доступ. Таким образом, ни один из вариантов неверен - доступ к файлам зависит от прав доступа к файлам, а не от групп их создателей.

-1
18.03.2018, 16:33
2 ответа

ls -sсообщает член st_blocksструктуры, возвращаемый системными вызовами stat()/lstat(). Это число 512 -байтовых блоков. 512 байт обычно являются минимальной степенью детализации хранилища, поскольку это соответствует ранним секторам диска.

По крайней мере, это то, что делает большинство lsреализаций, включая исходную реализацию Unix, и то, что требует POSIX.

Реализация GNUls(также busybox, которая имитирует ее, обе найдены в Ubuntu ), однако изменена на 1024 -байтовых блока, но возвращается к 512 -байтовым блокам, если$POSIXLY_CORRECT(ранее$POSIX_ME_HARDER)переменная находится в среде (не для busybox ). Я предполагаю, что это делается для того, чтобы сделать его более читаемым для человека, но это означает, что мы теряем точность в файловых системах, которые используют гранулярность хранения 512 -байт, и не помогают с переносимостью.

Из журнала изменений:

Wed Aug 21 13:03:14 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)

  • Version 3.0.

  • du.c, ls.c: Make 1K blocks the default size, and -k a no-op. Down with dumb standards!

В GNUls(not busybox )размер блока также можно указать с помощью опции --block-sizeили переменной окружения $LS_BLOCK_SIZE. Таким образом, вы можете использовать ls --block-size=1 -sили LS_BLOCK_SIZE=1 ls -s, чтобы получить использование диска в байтах. В других реализациях ls, таких как BSD, используется $BLOCKSIZEдля этого¹ (, также распознаваемый GNU, а также $BLOCK_SIZElsкак , показанный @yahol).

В соответствии с POSIX вы можете использовать -kдля получения значения в кибибайтах (, которое, к счастью, в GNU или BSD lsимеет приоритет над $BLOCKSIZEпеременными окружения ).

Переносимо (, если вы хотите принять во внимание busybox ls, где отчет в кибибайтах жестко запрограммирован ),чтобы вернуться кst_blocks(или хотя бы приблизительному ), вам понадобится что-то вроде:

blocks=$(ls -skd -- "$file" | awk '{print $1*2; exit}')

В GNU find, -printf %bсообщает количество блоков по 512 -байтов, а -printf %kблоков по 1024 -байт, и на него не влияет среда. -printfотносится к GNU.

В любом случае, в настоящее время это никак не связано с размером блока файловой системы.


¹ В BSD $BLOCKSIZEокругляется до кратного 512(BLOCKSIZE=1023равноBLOCKSIZE=512)и значения ниже 512 не допускаются

2
28.01.2020, 05:07

Это объясняется в info coreutils Block size(, к которому я пришел из info ls):

.
2.3 Block size

(...)The block size used for display is independent of
any file system block size.(...)

‘DF_BLOCK_SIZE’
     This specifies the default block size for the ‘df’ command.
     Similarly, ‘DU_BLOCK_SIZE’ specifies the default for ‘du’ and
     ‘LS_BLOCK_SIZE’ for ‘ls’.

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

Следующие две envпеременные могут помочь унифицировать выходные данные:

‘BLOCK_SIZE’
     This specifies the default block size for all three commands, if
     the above command-specific environment variables are not set.

‘BLOCKSIZE’
     This specifies the default block size for all values that are
     normally printed as blocks, if neither ‘BLOCK_SIZE’ nor the above
     command-specific environment variables are set.  Unlike the other
     environment variables, ‘BLOCKSIZE’ does not affect values that are
     normally printed as byte counts, e.g., the file sizes contained in
     ‘ls -l’ output.

И это объясняет, почему по умолчанию все это равно 512 блокам:

‘POSIXLY_CORRECT’
     If neither ‘COMMAND_BLOCK_SIZE’, nor ‘BLOCK_SIZE’, nor ‘BLOCKSIZE’
     is set, but this variable is set, the block size defaults to 512.
1
28.01.2020, 05:07

Теги

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