LINUX.ORG.RU

Можно ли работать с блочным устройством как с файлом? Или как отказаться от ФС.

 , , ,


0

1

Итак, хочу отказаться от файловой системы, для работы, сферической в вакууме, с одним файлом, допустим, даже фиксированной длинны.
Вообще иначе всё тривиально, накатай фс, да монтируй, это понятно, не хочу так.
Тем не менее. Теория.

cryptsetup при детачед хэдере и при --align-payload=0 даёт возможность иметь контейнер произвольной длинны, хоть 100кб, что удобно для теста.

cd /tmp
stat -c %s text
772416
dd if=/dev/zero of=/tmp/ctext bs=1 count=772416
 скопировано 772416 байт (772 kB), 7,10004 c, 109 kB/c

dd if=/dev/zero of=/tmp/head bs=1M count=2 && sync
dd if=/dev/zero of=/tmp/key bs=1M count=2 && sync
mknod -m0660 /dev/loop101 b 7 101
losetup /dev/loop101 /tmp/ctext

cryptsetup --verbose --cipher aes-cbc-essiv:sha256 --key-size=256 --hash=sha256 --iter-time=1000 --verify-passphrase luksFormat /dev/loop101 --header /tmp/head --align-payload=0
cryptsetup luksAddKey /tmp/head /tmp/key
cryptsetup luksOpen /dev/loop101 --header /tmp/head --key-file /tmp/key ct
При записи файла выходит ошибка
dd if=/tmp/text of=/dev/mapper/ct
dd: запись «/dev/mapper/ct»: На устройстве кончилось место
1508+1 записей считано
1508+0 записей написано
 скопировано 772096 байт (772 kB), 0,0478374 c, 16,1 MB/c
Конец контейнера:
0x000bc7c0: bf 56 41 7b 7b 84 a3 cd c3 9d 7e a5 51 63 0c 59 26 6e 15 47 30 51 e8 30 6a e5 1e e0 ea 8d 48 4e  .VA{{.....~.Qc.Y&n.G0Q.0j.....HN
0x000bc7e0: 5a 4b e1 ea 18 89 57 4f d9 99 2e a4 b6 cf a3 ce f6 cf 73 1a 19 17 30 d6 7b 1a 9b fc e8 1b 9e b1  ZK....WO..........s...0.{.......
0x000bc800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................
0x000bc820: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................
0x000bc840: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................
0x000bc860: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................
0x000bc880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................
0x000bc8a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................
0x000bc8c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................
0x000bc8e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................
0x000bc900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................................
забавно, есть какой-то механизм, запрещающий запись до конца, при том там нет никакой метадаты.

Тем не менее

cat /dev/mapper/ct > /tmp/check
Дифф показал, что не записались ~10 строк с конца текстового файла, не поместились. Играя размером исходного файла удается его читать/изменять/записывать даже через leafpad, но от рута.
ln -sf /dev/mapper/ct /tmp/mapper
leafpad /tmp/mapper
cat /dev/mapper/ct > /tmp/check_2
Естественно в конце файла присутствуют несколько «оборванных символов». Попытки дать не-руту возможность записи не проконали
chown user /dev/mapper/ct
chown user /dev/dm-6
ln -sf /dev/dm-6 /tmp/dm-6
Дальше особо не копал.

Вопрос, есть ли средства для обеспечения прозрачного шифрования одного файла, но без использования ФС? Теоретически же ничего сложного, крути симметричный алгоритм на лету и всё, но как-то оно под это не заточенно.

cast Gotf

// upd, допёр чего скопировано 772096 байт из 772416.

772096/256=3016 блоков по 256байт ключа, остальное не влезло.

★☆

Последнее исправление: Umberto (всего исправлений: 2)

Ответ на: комментарий от anonymous

Потому что и cryptsetup и loop это буферизованные блочные устройства.

Umberto ★☆
() автор топика

забавно, есть какой-то механизм, запрещающий запись до конца, при том там нет никакой метадаты

Забавно будет, когда тебе отключат свет.

darkenshvein ★★★★★
()

dd if=/dev/zero of=/tmp/ctext bs=1 count=772416

Ну ты просто убийца дисков

772096/256=3016 блоков по 256байт ключа

Ничего подобного, 256 еще раз может поместиться.
772416-772416%512=772096

прозрачного шифрования одного файла, но без использования ФС

файл без ФС это уже не файл :)

dd if=/dev/zero of=ctext bs=204800 count=1
dd if=/dev/urandom of=text bs=204800 count=1
losetup -e aes /dev/loop0 ctext
dd if=text of=/dev/loop0
dd if=/dev/loop0 of=utext 
cmp utext text

Помоему у тебя одна проблема, ты не выровнял размер файла (кратно 512).

arson ★★★★★
()

Вопрос, есть ли средства для обеспечения прозрачного шифрования одного файла, но без использования ФС?

dm-crypt-у пофиг на наличие фс. шифруются блоки. cryptsetup создает luks контейнер, т.е метадата присутствует. дергай ioctl к dm-crypt вручную (как например сделано в android, см vold, cryptfs.c), метадаты не будет.

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

Я тут порыл, видимо надо собрать util-linux поновей и пропатчить loop-AES.

Помоему у тебя одна проблема, ты не выровнял размер файла (кратно 512).

Нет же, я не допёр можно ли и как правильно работать с блочным у-вом. Но понимаю, что видимо, никак.

Umberto ★☆
() автор топика
Ответ на: комментарий от vvviperrr

cryptsetup создает luks контейнер, т.е метадата присутствует. дергай ioctl к dm-crypt вручную (как например сделано в android, см vold, cryptfs.c), метадаты не будет.

У меня с метадатой и хедерами вообще проблемы нет.

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

А у криптодевайсов задача одна - блоки из заданного массива де/шифровать.

Вобщем тег забыл добавить [хочется странного], чтоб file.enc без его полной дешифровки и сохранения на диск, просто открыть/смонтировать/слинковать и прозрачно работать с file.

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

чтоб file.enc без его полной дешифровки и сохранения на диск, просто открыть/смонтировать/слинковать и прозрачно работать с file

ну dm-crypt это и делает. расшифровка происходит по мере необходимости

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

ну dm-crypt это и делает. расшифровка происходит по мере необходимости

Я как бы в курсе, но это не «файл в ФС», а блочное устройство, на котором надо разворачивать ФС.

loop-aes deprecated. use dm-crypt

Да заприметил в нём одну фишку, хочу поглядеть.

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

на котором надо разворачивать ФС.

тебя кто-то заставляет это делать? не нужна фс - не накатывай.

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