Ядро Linux не находит initrd правильно

Я думаю, что позади Вашего описания, существует неправильное представление. Незашифрованные данные не хранятся на диске ни в какой точке. Когда Вы пишете в файл в encfs файловой системе, инструкция по записи переходит в encfs процесс; encfs процесс шифрует данные (в памяти) и пишет шифрованный текст в файл. Имена файлов, а также содержание файла, шифруются. Чтение файла подвергается противоположному процессу: encfs читает зашифрованные данные из дискового файла, дешифрует его в памяти и передает простой текст запрашивающему приложению.

Когда Вы работаете encfs команда, это не дешифрует данных. Это только использует пароль, который Вы предоставляете для разблокирования секретного ключа файловой системы. (Это - на самом деле операция дешифрования, криптографически разговор, но другой тип от того, что происходит с данными файла. Я не буду вдаваться в большее количество подробностей здесь.)

1) Encfs точно “не перемещает блоки”; это декодирует блоки, когда это читает их. Encfs является файловой системой, потому что он ведет себя как один: можно хранить файлы на нем, когда это смонтировано.

2) Encfs не является “истинной” файловой системой, потому что он не работает независимо. Encfs только обеспечивает слой шифрования; это использует базовую файловую систему, чтобы на самом деле хранить данные, и метаданные (метаданные являются вспомогательной информацией о файлах, таких как полномочия и время изменения).

3) Виртуальная файловая система является другим способом сказать, что сам encfs не хранит данных, этому нужна базовая файловая система (см. (2) выше) для этого. Зашифрованный означает просто что: encfs хранит данные, что Вы вставляете его в зашифрованном виде, который не может быть дешифрован без ключа. Другая программа могла считать данные, хранившие encfs, если и только если та другая программа имела доступ к ключу (который требует пароля, что ключ защищен с).

4) fusermount наборы команд точка монтирования FUSE. Вы обычно не называли бы его непосредственно, потому что файловая система FUSE реализована процессом непривилегированного режима, который необходимо запустить так или иначе, и тот процесс (например. encfs) будет заботиться об установке точки монтирования. Размонтировать файловую систему FUSE, с другой стороны, является универсальной операцией, можно всегда делать это путем вызова fusermount -u.

9
16.02.2018, 01:33
3 ответа

Ядро говорит Вам, что не знает, какое устройство содержит корневую файловую систему. Ваше монтирование цикла не необходимо. (Размонтируйте его прежде, чем продолжиться).

Попробуйте команду как

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 параметр, также.

8
27.01.2020, 20:06
  • 1
    Как я размонтировал бы файлы? –  Coder404 10.03.2013, 23:20
  • 2
    umount /mnt/rootfs –  t-8ch 10.03.2013, 23:27
  • 3
    Когда я делаю это, я получаю umount:/mnt/rootfs не смонтирован (согласно mtab) –  Coder404 10.03.2013, 23:40
  • 4
    По-видимому, Coder404 не хочет подключать диск к той машине и просто работать init в initrd. Здесь Вы передаете disk.img и как жесткий диск и как a initrd который не имеет смысла. –  Stéphane Chazelas 11.03.2013, 00:53
  • 5
    @StephaneChazelas благодарит о подсказке о -initrd это не должно было быть там. –  t-8ch 11.03.2013, 19:34

То, что происходит, - то, что Вы пытаетесь загрузить 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 в том режиме.

6
27.01.2020, 20:06
  • 1
    3 из показанных выходных шоу, что ядро смонтировало ext2 файловую систему initramdisk. Таким образом, это - вероятно, не недостающий модуль. –  t-8ch 11.03.2013, 19:36
  • 2
    Ах да я пропустил это, спасибо @t-8ch. Я думаю, что знаю то, что идет и обновило мой ответ. кэши –  Stéphane Chazelas 12.03.2013, 00:16

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

0
27.01.2020, 20:06

Теги

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