Как определить, на каком подтоме находится каталог/файл?

Для этого вы можете использовать OpenSSL. Ниже показано с OpenSSL 1.1.1 11 сентября 2018 г. из Ubuntu 18.10.

OpenSSL> help
...
Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        gost              md4               
md5               rmd160            sha1              sha224            
sha256            sha3-224          sha3-256          sha3-384          
sha3-512          sha384            sha512            sha512-224        
sha512-256        shake128          shake256          sm3

Как видите, он поддерживает sha3-{224,256,384,512}.

Для проверки контрольной суммы файла

openssl dgst -sha3-512 /bin/echo
SHA3-512(/bin/echo)= c9a3baaa2aa3d667a4ff475d893b3e84eb588fb46adecd0af5f3cdd735be88c62e179f98dc8275955da4ee5ef1dc7968620686c6f7f63f5b80f10e43bc1f00fc

Вы можете проверить сумму строки с помощью

printf "foobar" | openssl dgst -sha3-512

Вы также можете изменить формат вывода

  • -cРаспечатать дайджест с разделительными двоеточиями
  • -rРаспечатать дайджест в формате coreutils
1
30.01.2021, 11:55
1 ответ

Если вы можете использовать stat(, который не требуется POSIX )и он достаточно богат параметрами, тогда эта команда:

stat --format=%m /mnt/btrfs-subvol/some/dir

покажет вам, что вы хотите. Примечание dirможет быть любым типом файла , не обязательно каталогом.

Примечания:

  • В руководстве сказано, что %mобозначает точку монтирования; это несколько вводит в заблуждение в случае Btrfs. Мои тесты в Kubuntu 18.04.5 LTS показывают, что даже если /mnt/btrfs-subvol/не является явной точкой монтирования (, т.е. mount whatever /mnt/btrfs-subvol/никогда не было ), но это подтом (внутри подтома, явно смонтированного как /или /mnt/), то команда будет рассматривать его как точку монтирования. Кажется, это то, что вы хотите в любом случае.

  • Выводом является путь, действительный в структуре каталогов в ОС, а не в каталоге Btrfs (и подтомах )дерева на устройстве (, если вы не уверены, в чем разница, то прочитайте этот вопрос и мой ответ там ). Опять же кажется, что это поведение, что вы хотите.

  • Команда действительна для файловых систем, отличных от Btrfs (, например. stat --format=%m /dev/nullпечатает /devв моем Kubuntu ). Очевидно, что другие файловые системы вообще не имеют концепции подтомов. Возможно, вам следует сначала проверить, находится ли файл, который вы ищете, в файловой системе Btrfs:

    stat --file-system --format=%T /mnt/btrfs-subvol/some/dir
    

    Если вы видите btrfs, выполните основную команду, чтобы найти подтом. К сожалению, один вызов statне может напечатать обе части информации (, вы можете использовать либо --file-system, либо без ).

  • Приведенный выше вывод означает, что вам нужно запустить statдва раза.Нет никакой гарантии, что они увидят тот же dirпо пути /mnt/btrfs-subvol/some/dir. Что, если между ними произойдёт (и )монтирование? Сравните TOCTOU . В Linux я могу надежно запустить два statв одном файле без TOCTOU, используя дескриптор файла:

    ( stat --dereference --file-system --format=%T /proc/self/fd/3
      stat --dereference --format=%m /proc/self/fd/3 ) 3</mnt/btrfs-subvol/some/dir
    

    Обратите внимание, что если dirсама по себе является символической ссылкой, команды будут следовать за ней.

    Тем не менее, вы, вероятно, захотите узнать подобъем, чтобы потом что-то с ним сделать. Вы все равно получите это как путь. Прежде чем вы его используете, ситуация может измениться, и TOCTOU может ударить вас.

    Если вы уверены, что соответствующие пути не изменят своего значения без вашего согласия, просто работайте с statи их результатами простым способом.

  • В моих тестах stat --file-system …ведет себя как stat --file-system --dereference …. Это означает, что statс и без--file-system(и без явного--dereference)могут привести к противоречивым результатам, если целевой файл является символической ссылкой.

3
18.03.2021, 22:33

Теги

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