LINUX.ORG.RU

Как перенести линукс из embedded девайса в qemu ?

 , , , ,


1

2

Железка грузится с Usb флешки обычной, там разделы fat и ext3. На fat обнаружены: u-boot.bin, zImage, file.dtb, на ext3 файловая система линукс. Правильно ли я понимаю, что для запуска в qemu, мне нужны 3 те файла из fat ? И что u-boot.bin это и есть сжатая линукс система, которая в ext3 обнаружена ?

создай пустой образ, смонтируй его через


qemu-nbd --connect=/dev/nbd0 /PATH_TO_IMAGE/disk-1.qcow2

смонтируй его как диск через mount


mount /dev/nbd0p1 /mnt/somepoint/

и через dd скопируй флешку целиком как /dev/sdX без указания партиций.

А потом этот диск запускай в qemu

как то так.

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

Мне достаточно только файловую систему, эмуляция железа не требуется. Мне нужно программу собранную под арм на qt отладить в qemu. Я могу с флешки взять бинарник проги и либы к ней, но как мне тогда правильно собрать ось, чтобы там совпали системные либы libc.so.6 с теми, что на флешке вместе с прогой. Или можно как-то указать проге, брать libc.so.6 из моей папки, а не системной ?

На флешке в папке lib лежат такие либы: ld-2.21.so, ld-linux-armhf.so.3, libc.so.6, libc-2.21.so. Вот как собрать ось с этими версиями.

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

Можешь работающее с qemu ядро собрать, и подсунуть его. u-boot это загрузчик, он тебе тут не понадобится, так как qemu ядро можно подсунуть прямо так. Ну в общем попробуй сделать копию всей флешки в файл через dd, затем используй qemu-system-arm

Linux/Multiboot boot specific:
-kernel bzImage use 'bzImage' as kernel image
-append cmdline use 'cmdline' as kernel command line
-initrd file    use 'file' as initial ram disk
-dtb    file    use 'file' as device tree image

Вот такие опции для указания ядра, можно подсунуть device tree, но оно скорее всего тебе не поможет.

Так что тебе нужно будет своё ядро указать, которое точно в qemu работает, указать правильную версию архитектуры arm (с поддержкой нужных софту фич), а так же образ флешки в качестве «диска». По идее должно работать, по крайней мере, в консоли. Ещё не забудь указать -serial stdio например чтобы логи загрузки видеть. В -append указать параметры root=/dev/sda2 или где там корневая файловая система и console=ttyS0,115200,8n1 или как-то так чтобы логи загрузки видеть.

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

То есть сначала делаю так: qemu-img create -f qcow2 disk-1.qcow2 1G А как потом через dd туда копировать все подскажи.

вот на примере(только что проверил на флешке 4Г):


qemu-img create -f qcow2 disk-1.qcow2 4G

modprobe nbd max_part=8

qemu-nbd -c /dev/nbd0 disk-1.qcow2

dd if=/dev/sde of=/dev/nbd0 bs=4M status=progress # sde флешка

fdisk -l /dev/nbd0
Диск /dev/nbd0: 4 GiB, 4294967296 байт, 8388608 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x1ed972e8

Устр-во     Загрузочный начало   Конец Секторы Размер Идентификатор Тип
/dev/nbd0p1               2048 7983103 7981056   3,8G             7 HPFS/NTFS/exFAT

mount /dev/nbd0p1 /mnt

В /mnt получишь обычный вид того что там в первой партиции(если их несколько то монтируй ту которая нужна), читай, копируй, удаляй. Но сам образ можно подсунуть qemu как есть, если виртуальная машина правильно настроена, она должна его подхватить как будь-то это флешка.

Но собственно в qemu можно и напрямую флешку подсунуть, через виртманагер делается в пару кликов, а там уже ковыряй её до посинения...

http://mx54.ru/qemu-img-manipulyacii-s-obrazami-diskov-virtualnyx-mashin-sozd... как да что, хороший мануал(малость староват, но актуален ещё)

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

Чет не особо понял предлагаете не в qemu, а в целевой машине это ? Но на флешке арм. Примонтировать я могу ext3 типа так:

mount /dev/myFLASH_ext3 /root/FS_ext3

А дальше как делать ? Типа: chroot /root/FS_ext3

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

А дальше как делать ?

по канону, тебе нужно все виртуальные устройства примонтировать /dev /sys /proc /run , чтобы сам чрут работал, но если целевая машина x86_64 а ты монтируешь arm то будет ли это работать??? хотя пусть поправят.

Мне нужно программу собранную под арм на qt отладить в qemu

ну так и будь последователен! Попробуй в qemu, а там по результату уже и думай.

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

Посмотрел про qemu-user, но я так понимаю это способ только чтобы запустить бинарник динамический с набором либ. Если этот бинарник хочет читать файлы в оси, то этот вариант не катит вроде ?

user2132 ()

Чрут для малины на арме делаю так (обрати внимание, qemu нужен user-static):

# Chroot
#---

# install dependecies

apt-get install qemu qemu-user-static binfmt-support

# download raspbian image
wget https://downloads.raspberrypi.org/raspbian_latest

# extract raspbian image
unzip raspbian_latest

# extend raspbian image by 1gb
dd if=/dev/zero bs=1M count=1024 >> 2016-05-27-raspbian-jessie.img

# set up image as loop device
losetup /dev/loop0 2016-05-27-raspbian-jessie.img

# check file system
e2fsck -f /dev/loop0p2

#expand partition
resize2fs /dev/loop0p2

# mount partition
mount -o rw /dev/loop0p2  /mnt
mount -o rw /dev/loop0p1 /mnt/boot

# mount binds
sudo mount --bind /dev /mnt/dev/
sudo mount --bind /sys /mnt/sys/
sudo mount --bind /proc /mnt/proc/
sudo mount --bind /dev/pts /mnt/dev/pts

# ld.so.preload fix
sed -i 's/^/#/g' /mnt/etc/ld.so.preload

# copy qemu binary
cp /usr/bin/qemu-arm-static /mnt/usr/bin/

# chroot to raspbian
chroot --userspec root /mnt /bin/sh

#export $PATH:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/bin:/usr/bin:/usr/sbin:/sbin

# do stuff...

exit

# revert ld.so.preload fix
sed -i 's/^#//g' /mnt/etc/ld.so.preload

# unmount everything
umount /mnt/{dev/pts,dev,sys,proc,boot,}

# unmount loop device
losetup -d /dev/loop0
sudo mount /dev/sdd2 /mnt 
sudo mount /dev/sdd1 /mnt/boot
fehhner ★★★★★ ()
Ответ на: комментарий от fehhner

Шаги начиная с «download raspbian image» до «extend raspbian image by 1gb», можешь выкинуть и какие-то далее лишние. Можешь попробовать ему сразу скопированный образ флешки от твоей железки и сделать всё по аналогии, но не факт, что оно заработает сразу. Но мб и заведётся.

fehhner ★★★★★ ()
Последнее исправление: fehhner (всего исправлений: 1)