Я думаю, что позади Вашего описания, существует неправильное представление. Незашифрованные данные не хранятся на диске ни в какой точке. Когда Вы пишете в файл в encfs файловой системе, инструкция по записи переходит в encfs
процесс; encfs
процесс шифрует данные (в памяти) и пишет шифрованный текст в файл. Имена файлов, а также содержание файла, шифруются. Чтение файла подвергается противоположному процессу: encfs
читает зашифрованные данные из дискового файла, дешифрует его в памяти и передает простой текст запрашивающему приложению.
Когда Вы работаете encfs
команда, это не дешифрует данных. Это только использует пароль, который Вы предоставляете для разблокирования секретного ключа файловой системы. (Это - на самом деле операция дешифрования, криптографически разговор, но другой тип от того, что происходит с данными файла. Я не буду вдаваться в большее количество подробностей здесь.)
1) Encfs точно “не перемещает блоки”; это декодирует блоки, когда это читает их. Encfs является файловой системой, потому что он ведет себя как один: можно хранить файлы на нем, когда это смонтировано.
2) Encfs не является “истинной” файловой системой, потому что он не работает независимо. Encfs только обеспечивает слой шифрования; это использует базовую файловую систему, чтобы на самом деле хранить данные, и метаданные (метаданные являются вспомогательной информацией о файлах, таких как полномочия и время изменения).
3) Виртуальная файловая система является другим способом сказать, что сам encfs не хранит данных, этому нужна базовая файловая система (см. (2) выше) для этого. Зашифрованный означает просто что: encfs хранит данные, что Вы вставляете его в зашифрованном виде, который не может быть дешифрован без ключа. Другая программа могла считать данные, хранившие encfs, если и только если та другая программа имела доступ к ключу (который требует пароля, что ключ защищен с).
4) fusermount
наборы команд точка монтирования FUSE. Вы обычно не называли бы его непосредственно, потому что файловая система FUSE реализована процессом непривилегированного режима, который необходимо запустить так или иначе, и тот процесс (например. encfs
) будет заботиться об установке точки монтирования. Размонтировать файловую систему FUSE, с другой стороны, является универсальной операцией, можно всегда делать это путем вызова fusermount -u
.
Ядро говорит Вам, что не знает, какое устройство содержит корневую файловую систему. Ваше монтирование цикла не необходимо. (Размонтируйте его прежде, чем продолжиться).
Попробуйте команду как
qemu -kernel bzImage -hda disk.img -append root=/dev/sda
-hda disk.img
параметр говорит qemu моделировать дисковое устройство на основе Вашего disk.img
.
-append root=/dev/sda
переключатель используется qemu для сообщения ядра о, это - корневое устройство. Это сделано путем добавления root=/dev/sda
к командной строке ядра. Можно сравнить это с командной строкой ядра собственного ядра путем выполнения cat /proc/cmdline
(Это безопасно). Необходимо видеть там a root
параметр, также.
То, что происходит, - то, что Вы пытаетесь загрузить Linux "Устаревшим" способом. Это то, где initrd
электронный диск в противоположность сжатому архиву cpio, распакованному ядром в ramfs, и со старым способом переключить в конец устройство.
В том режиме ядро монтирует disk.img как электронный диск как корневая файловая система и затем выполняется /linuxrc
там. Скорее всего, в Вашем случае, нет такого файла. Когда /linuxrc
(который, как предполагается, делает то независимо от того, что необходимо для перевода в рабочее состояние блочного устройства для реальной корневой файловой системы), выходы, затем ядро монтирует реальную корневую файловую систему.
Сообщения выше показывают, что это монтирует диск поршня успешно (1,0: 1 для ram
, так /dev/ram0
) но не реальная корневая файловая система/dev/sda1 (8,1: 8 sd
, 1 a1
). По-видимому, так как Вы не указывали командную строку ядра (-append
), это /dev/sda1
прибывает из CONFIG_CMDLINE, переданного во время компиляции ядра или использование rdev
.
Если Ваш disk.img предназначен для содержания корневой файловой системы, говорят что маленький дистрибутив Linux с /sbin/init
..., затем Вы, вероятно, хотите записать это вместо этого:
kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0`
Затем ядро рассматривало бы диск поршня как реальную корневую файловую систему (хотя Вы могли все еще pivot_root
к другому).
Смочь видеть ядро обменивается сообщениями более легко, я рекомендовал бы использовать последовательный вывод:
kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"
Как альтернатива Вы могли использовать init ramfs вместо init электронного диска:
mkdir -p RAMFS/{bin,dev}
cd RAMFS/bin
cp /bin/busybox .
"$PWD/busybox" --install .
cd ..
cp -a /dev/{null,tty,zero,console} dev
printf '%s\n' "#! /bin/sh" "exec /bin/sh" > init
chmod +x init
find . | cpio -oHnewc | gzip > ../initramfs.gz
cd ..
kvm -kernel kernel.img -initrd initramfs.gz
(если busybox
статически связанная версия), и Вы получите оболочку и другие busybox утилиты в том ядре).
Обратите внимание, что ядро теперь работает /init
в противоположность /linuxrc
или /sbin/init
в том режиме.
CONFIG_BLK_DEV_INITRD=y
Этот параметр конфигурации ядра также обязателен. Он включает поддержку initrd в ядре Linux.
К счастью, Buildroot устанавливает его для нас по умолчанию, когда дается BR2_TARGET_ROOTFS_CPIO=y
.
Затем вы передаете CPIO в QEMU с опцией qemu -initrd
. Моя полная команда QEMU:
./buildroot/output.x86_64~/host/usr/bin/qemu-system-x86_64 -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1 -M pc -append ' nopat nokaslr norandmaps printk.devkmsg=on printk.time=y console=ttyS0' -device edu -device lkmc_pci_min -device virtio-net-pci,netdev=net0 -kernel./buildroot/output.x86_64~/images/bzImage -nographic -initrd './buildroot/output.x86_64~/images/rootfs.cpio'
Вот минималистичный полностью автоматизированный пример Buildroot + QEMU:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b3868a3b009f2ab44fa6d3db3d174930b3cf7b69#initrd
umount /mnt/rootfs
– t-8ch 10.03.2013, 23:27init
вinitrd
. Здесь Вы передаетеdisk.img
и как жесткий диск и как ainitrd
который не имеет смысла. – Stéphane Chazelas 11.03.2013, 00:53-initrd
это не должно было быть там. – t-8ch 11.03.2013, 19:34