пятница, 16 января 2009 г.

Создание arm-окружения в Debian GNU/Linux "lenny" с помощью qemu

Моя статья является переработанным материалом, который можно найти здесь:
http://www.opennet.ru/base/sys/linux_arm_qemu.txt.html
Спасибо автору и переводчику!

Устанавливаем необходимые пакеты:
host# aptitude install qemu debootstrap nfs-kernel-server

debootstrap -- позволяет создать базовую систему Debian, а также является простым способом создания chroot и виртуальных машин.
qemu -- эмулятор компьютера, позволяет эмулировать следующие архитектуры:
- PC (x86 or x86_64 processor)
- ISA PC (old style PC without PCI bus)
- PREP (PowerPC processor)
- G3 BW PowerMac (PowerPC processor)
- Mac99 PowerMac (PowerPC processor, in progress)
- Sun4m/Sun4c/Sun4d (32-bit Sparc processor)
- Sun4u (64-bit Sparc processor, in progress)
- Malta board (32-bit and 64-bit MIPS processors)
- ARM Integrator/CP (ARM)
- ARM Versatile baseboard (ARM)
- ARM RealView Emulation baseboard (ARM)
- Spitz, Akita, Borzoi and Terrier PDAs (PXA270 processor)
- Luminary Micro LM3S811EVB (ARM Cortex-M3)
- Luminary Micro LM3S6965EVB (ARM Cortex-M3)
- Freescale MCF5208EVB (ColdFire V2)
- Arnewsh MCF5206 evaluation board (ColdFire V2)
- Palm Tungsten|E PDA (OMAP310 processor)

nfs-kernel-server -- поддержка для сервера NFS на уровне ядра.

Создаем директорию где будет лежать наша система.
host# mkdir /home/user/arm-sys

Запускаем debootstrap, c ключом --foreign выполняется только первая часть установки.
host# debootstrap --foreign --arch arm lenny /home/user/arm-sys
host# cd /home/user/arm-sys
host# cp /etc/passwd etc/passwd
host# cp /etc/shadow etc/shadow
host# cp /etc/group etc/group
host# echo "proc /proc proc defaults 0 0" > etc/fstab
host# echo "192.168.10.1:/home/user/arm-sys / nfs defaults 0 1" >> etc/fstab

Расшариваем папку через NFS и добавляем соответствующую запись /etc/exports:
/home/user/arm-sys 192.168.10.5(rw,no_root_squash,no_subtree_check,sync)

Экспортируем файловую систему:
host# exportfs -a

Скачиваем http://bellard.org/qemu/arm-test-0.2.tar.gz, в архиве находится ядро и образ initrd рабочей arm-системы.

Распаковываем в /home/user/arm-test.

Создаём сценарий такого вида:

#!/bin/sh

console="ttyAMA0" # serial console
nfsserver="192.168.10.1" # address of NFS server
nfsdir="/home/user/arm-sys" # exported share where debian/arm is installed
address="192.168.10.5" # address for guest server
gateway="192.168.10.1" # default gateway
netmask="255.255.255.0" # subnet mask
hostname="arm.home" # hostname for guest server
device="eth0" # interface that guest server will use
mem=256 # memory for guest server in Mb
ipinternet="192.168.1.64" #Адрес интерфейса, через который доступен интернет на машине-хосте

kernel="/home/user/arm-test/zImage.integrator" # arm kernel
initrd="/home/user/arm-test/arm_root.img" # arm initrd
nfsopts="rsize=1024,wsize=1024,hard,intr,tcp,nolock" # nfs options
consoleopt="console=$console"
nfsrootopt="nfsroot=$nfsserver:$nfsdir,$nfsopts"
ipopt="ip=$address::$gateway:$netmask:$hostname:$device"

echo 1 > /proc/sys/net/ipv4/ip_forward & #Включение перенаправления пакетов
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o $device -j SNAT --to-source 192.168.1.64 & #Включение NAT и будет интернет

qemu-system-arm -net nic -net tap,ifname=tap0 -m $mem \
-kernel $kernel -initrd $initrd \
-append "$consoleopt root=/dev/nfs $nfsrootopt $ipopt $initsin"

Необходимо поправить в файле /etc/qemu-ifup - ip адрес хоста.
sudo -p "Password for $0:" /sbin/ifconfig $1 172.20.0.1

на
sudo -p "Password for $0:" /sbin/ifconfig $1 192.168.10.1

Теперь запускаем систему arm:

host# ./start-qemu-arm

Гостевая машина загрузится и запустит оболочку bash.
Уже в виртуальной машине делаешь следущее:

Логинишься под root'ом без пароля.

Перенастраиваешь сетевой интерфейс, монтируешь корень будущей системы, делаешь её корневой для текущей системы, монтируешь /proc.
guest# ifconfig eth0 192.168.10.5
guest# mkdir /mnt
guest# mount -t nfs -o rsize=1024,wsize=1024,nolock 192.168.10.1:/home/user/arm-sys /mnt
guest# cd /mnt
guest# chroot .
guest# mount /proc

Теперь запускаем второй этап debootstrap и завершаем установку:

guest# cd /
guest# ./debootstrap/debootstrap --second-stage

Этот процесс потребует времени, так как эмулятор не особенно быстр. После завершения установки отредактируйте такие файлы, как
/etc/hostname и /etc/resolv.conf.

В сценарии, который был сделан ранее, замени строку:
-kernel $kernel -initrd=$initrd \
на
-kernel $kernel \

Делаем образцово-показательный запуск гостевой машины:

host# ./start-qemu-arm

Сделано не очень красиво, но работать должно. Потом переработаю получше.

Комментариев нет:

Отправить комментарий