QEMU ile Gömülü Linux Sistemlerinin Öykünmesi
1. Giriş
Gömülü yazılım geliştirme, geliştirme kartları, harici modül aygıtları vb. gibi yerleşik donanım aygıtlarına dayanır, ancak hata ayıklama işinin çevre birimleriyle hiçbir ilgisi yoksa, donanım satın almadan QEMU kullanılarak yalnızca çekirdek hata ayıklaması simüle edilebilir.
Linux ve Windows ana bilgisayarları ve öykünülmüş PowerPC, ARM, MIPS ve SPARC hedefleri için kullanılabilir. QEMU, ana bilgisayar ve hedef işlemci arasında minimum bir çeviri katmanı sağlama yaklaşımını benimser. Ana işlemci, öykünücüyü çalıştıran işlemcidir ve öykünmekte olan şey hedef işlemcidir.
Aşağıda, QEMU geliştirme ortamını kurma sürecine ayrıntılı bir giriş yer almaktadır.
2. Çevre
2.1 Kullanılan ortam
*Ubuntu-18.04.1
VEYA:
* Bilgisayar: Windows10
* Sanal Makine:VirtualBox-5.18
* Sanal İşletim Sistemi:Ubuntu-18.04.1
* Simüle edilmiş geliştirme kartı: vexpres
2.2 Ortamı kurarken kullanılan araçlar
* qemu-4.2.0
* linux-4.14.172 (Linux Çekirdeği)
* u-boot-2017.05
* meşgul kutusu-1.31.1
* arm-linux-gnueabi-gcc
İlgili tüm dosyaları /home/joe/qemu içine koyun
3. Çapraz derleme araçlarını kurun
# sudo apt kurulumu gcc-arm-linux-gnueabi
Kurulumun başarılı olup olmadığını kontrol edin
$ arm-linux-gnueabi-gcc -v
Yerleşik incelemeleri kullanma. COLLECT_GCC=arm-linux-gnueabi-gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/7/lto-wrapper Hedef: arm-linux-gnueabi Şunlarla yapılandırılmıştır: ../src/configure -v –with-pkgversion='Ubuntu/Linaro 7.5.0-3ubuntu1~18.04′–with-bugurl=file:///usr İplik modeli: posix gcc sürüm 7.5.0(Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) |
4. Linux çekirdeğini yapılandırın ve derleyin
4.1 Linux Çekirdeğini İndirin
Gerekli çekirdek sürümünü www.kernel.org adresinden indirin.
Burada nispeten en son uzun vadeli desteklenen çekirdek sürümü linux-4.4.157'yi indiriyorum
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.157.tar.xz /qemu dizinine
4.2 Linux çekirdeğinin sıkıştırmasını açın
# tar xvJf linux-4.4.157.tar.xz
4.3 Linux Çekirdeği Derleme
// Çekirdek kaynak dosya dizinini girin
# cd linux-4.4.157
yap CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
yap CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm menuconfig
menuconfig'i çalıştırmak ncurses paketinin eksik olduğunu gösteriyorsa, yüklemek için aşağıdaki komutu çalıştırmanız yeterlidir)
$ sudo apt-get install libncurses5-dev
Menü konfigürasyonuna girin ve aşağıdaki ayarları yapın
Çapraz alet zinciriyle derleme
Başarılı bir derlemeden sonra, dizinin altında bir çekirdek görüntü dosyası oluşturun
arch/arm/boot, zImage ve dtb, rahat kullanım için ayrı bir klasöre kopyalanabilir
5. QEMU Araçlarını Kurun
5.1 QEMU'yu kurun
* wget https://download.qemu.org/qemu-4.2.0.tar.xz
* tar xvJf qemu-4.2.0.tar.xz
* cd qemu-4.2.0
5.2 QEMU'yu yapılandırmadan önce bağımlı paketleri kurun
# uygun kurulum zlib1g-dev
# uygun kurulum libglib2.0-0 libglib2.0-dev
# uygun kurulum libsdl1.2-dev
# uygun kurulum libpixman-1-dev libfdt-dev
Derlemeden sonra dosyaların dağınık olmasını önlemek için, derleme için ara hedef yolu olarak oluşturucu dizini oluşturun.
QEMU'yu yapılandırın, derleyin ve kurun.
5.3 QEMU'yu kol mimarisi altındaki tüm kartları destekleyecek şekilde yapılandırın
# ../configure –target-list=arm-softmmu –audio-drv-list=
Aşağıdaki istem görüntülendiğinde pixman eksikse,
kurmak için sudo apt-get install libpixman-1-dev kullanın.
5.4 QEMU sürümünü görüntüleyin
5.5 QEMU tarafından desteklenen geliştirme kartlarını görüntüleyin
5.6 QEMU'yu Çalıştır
# qemu-sistem-kol -M vexpress-a9 -m 512M -kernel ./zImage -dtb ./vexpress-v2p-ca9.dtb -nographic -append “console=ttyAMA0”
TD:
$pwd
/ev/joe/qemu
# qemu-system-arm -M vexpress-a9 -m 512M -kernel linux-.4.157/arch/arm/boot/zImage -dtb linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9. dtb -nographic - "console=ttyAMA0" ekle
qemu'yu daha iyi test etmek ve başlatmak için start.sh başlangıç komut dosyasını oluşturabilir ve komut dosyasına chmod +x start.sh'yi çalıştırma izni verebilirsiniz.
#! / Bin / bash
qemu-sistem-kolu \
-M vexpress-a9 \
-m 512M \
-kernel /home/joe/jemu/linux-4.4.157/arch/arm/boot/zImage \
-dtb /home/joe/jemu/linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nografik \
- "console=ttyAMA0" ekleyin
6. Bir kök dosya sistemi oluşturun
Basit bir kök dosya sistemi oluşturmak için meşgul kutusunu kullanın.
6.1 Meşgul kutusu aracını indirin
https://busybox.net/downloads/ adresinden meşgul kutusunu indirin
# wget https://busybox.net/downloads/busybox-1.31.1.tar.bz2
# tar xjvf meşgul kutusu-1.31.1.tar.bz2
# cd meşgul kutusu-1.31.1
# defconfig yap
# yap CROSS_COMPILE=arm-linux-gnueabi-
# make install CROSS_COMPILE=arm-linux-gnueabi-
Kurulumun başarılı olduğunu gösteren aşağıdaki bilgiler istenir.
Kurulum tamamlandıktan sonra, oluşturulan hedef dosya varsayılan olarak ./_install dizinine geçer.
6.2 Kök dosya sistemi oluştur
6.2.1 meşgul kutusunu derleyin ve kurun
#mkdir rootfs
# sudo cp -r _install/* rootfs/
6.2.2 Kök dosya sistemine glibc kitaplığı ekleyin, yükleyici ve dinamik kitaplık ekleyin
# sudo cp -r _install/* rootfs/
# sudo cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib/
6.2.3 4 tty terminal aygıtı oluşturun (c, karakter aygıtı anlamına gelir, 4 ana aygıt numarasıdır ve 1~4 ikincil aygıt numaralarıdır)
6.3 SD kart dosya sistemi görüntüsü yap
6.3.1 Boş bir SD kart görüntüsü oluşturun
# dd if=/dev/zero of=rootfs.ext3 bs=1M sayı=32
6.3.2 SD kartı exts dosya sistemi olarak biçimlendirin
# mkfs.ext3 rootfs.ext3
6.3.3 Kök dosyaları SD karta yazın
# sudo mount -t ext3 rootfs.ext3 /mnt -o döngüsü
# sudo cp -rf rootfs/* /mnt/
# sudo umount /mnt
7. Doğrula
7.1 Qemu'yu Başlat
Test etmek için aşağıdaki komutu çalıştırın, derlenmiş çekirdeğin başarıyla çalışıp çalışmadığını kontrol edin
# sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel ~/qemu/zImage –dtb ~/qemu/vexpress-v2p-ca9.dtb -nographic -append “console=ttyAMA0”
Veya Komut Dosyasını kullanarak:
Yukarıdaki testte, çekirdek, kök dosya sisteminden yoksun olduğumuzu öne sürerek panik bildirecektir.
Yukarıdaki sorun, x86 ortamında oluşturulan meşgul kutusu aracından kaynaklanmaktadır.
Meşgul kutusunu kurarken make install kullandık, bu yüzden kullanmalısınız
yap ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install |
Derleme aracı, kol platformu tarafından kullanılan meşgul kutusu aracını oluşturur.
# dosya rootfs/bin/meşgul kutusu
rootfs/bin/busybox: ELF 32-bit LSB yürütülebilir, ARM, EABI5 sürüm 1 (SYSV), dinamik olarak bağlantılı, yorumlayıcı /lib/ld-, GNU/Linux 3.2.0 için, BuildID[sha1]=cbcd33b8d6c946cb19408a5e8e714de554c87f52, strippedcXNUMXfXNUMX,
7.2 Tekrar doğrulayın
Şimdi, Qemu Linux çekirdeğini başlattı ve dosya sistemini başarıyla kurdu ve seri terminal aracılığıyla basit işlevlerle sistemle etkileşime girebilir. Yazdırma işleminde /etc/init.d/rcS dosyasını çalıştıramama sorunu, sadece /etc/init.d/rcS dosyasını eklemeniz yeterlidir. Dosyanın içeriği bir bilgi istemi ifadesi olabilir.
7.3 QEMU'dan Çık
qemu'dan çıkmanın iki yolu
* Başka bir terminal girişinde: tüm qemu-sistem-kolunu öldür
* Qemu girişinde: Ctrl+ A; X
QEMU: Sonlandırılmış
8. Linux çekirdeğini u-boot ile başlatın
Gömülü sistem genellikle şunları içerir: u-boot, kernel, rootfs ve appfs. Aşağıdaki şekilde gösterilen ARM geliştirme panosunda bu parçaların konumsal ilişkisi
Önyükleyici | Önyükleme Parametreleri | çekirdek | Kökler | Uygulamalar |
Rootfs, panoda veya PC'de çalışabilir
8.1 U-önyüklemeyi hazırlayın
8.1.1 u-boot'u indirin
http://ftp.denx.de/pub/u-boot/, kullandığımız: u-boot-2021.01.tar.bz2
# tar -jxvf u-boot-2018.09.tar.bz2
8.1.2 U-önyüklemeyi derleme
# vim Make dosyası
CROSS_COMPILE = arm-linux-gnueabi-
# vim yapılandırma.mk
ARCH = kol
# vexpress_ca9x4_defconfig yap, hata
İhtiyaç: sudo apt install bizon
sudo apt kurulum esnekliği
sonra: # make -j4 hatası
İhtiyaç: dışa aktar CROSS_COMPILE=arm-linux-gnueabi-
ARCH'yi dışa aktar = kol
tekrar: # vexpress_ca9x4_defconfig yap
# make -j4
8.1.3 Test edin, u-boot'u başlatın
$ sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot-2021.01/u-boot –nographic
8.2 Çekirdek yapılandırma derlemesi
Çekirdek görüntüsünü başlatmak için u-boot'u kullanın:
Çekirdeği uImage formatında derlemeniz gerekiyor,
uImage'ın yükleme adresini bellekte belirtmeniz gerekiyor
Çekirdeği derlerken belirtin: LOADADDR=? uResim -j4
# cd /home/joe/qemu/linux-4.4.157
# LOADADDR yap=0x60003000 uImage -j4
U-boot derlemesi tamamlandıktan sonra, tool klasörü altında bir mkimage dosyası oluşturulacaktır, bu dosyayı cross derleyici dizini altındaki bin klasörüne kopyalayın.
$ cd qemu/linux-4.4.157
Hata:
$ sudo apt u-boot araçlarını kurun
uImage'ı edinin
9. QEMU ağ işlevi ayarları
Qemu sanal makinesi u-boot'ta başladığında, uImage'ın belleğe yüklenmesi gerekir ve uImage, TFTP sunucusu aracılığıyla bellekte belirtilen adrese indirilebilir.
9.1 Ana bilgisayar çekirdeğinin tun/tap modülünü destekleyip desteklemediğini kontrol edin
// Köprülü ağın bağlı olduğu iki aracı kurun
# sudo apt install uml-utilities köprü-utils
Tun cihaz dosyası oluştur: /dev/net/tun (genellikle otomatik olarak oluşturulur)
/etc/network/interfaces'i değiştirin (ağı yapılandırın, etkili olması için yeniden başlatın)
# sudo vim /etc/ağ/arayüzler
auto loiface lo inet loopbackauto enp0s3 // sanal ağın adı cardauto br0iface br0 inet dhcpbridge_ports enp0s3 |
9.2 Yeniden Başlatma
# yeniden başlatma
Ardından Qemu'nun ağ ortamını kontrol edin
Sanal ağ bağlantı noktası br0, Qemu sanal makinesi ile Linux ana bilgisayarı arasındaki iletişim için ağ bağlantı noktasıdır.
10. TFTP sunucusunu kurun
Qemu simülasyon geliştirme kartı için uImage'ı başlatırken uImage'ı belleğe indirmek için bir TFTP sunucusu oluşturun
10.1 tftp aracını yükleyin
$ apt-get kurulumu tftp-hpa tftpd-hpa xinetd
10.2 Yapılandırma dosyasını değiştirin ve TFTP sunucu dizinini ayarlayın
# sudo vim /etc/default/tftpd-hpa
...... TFTP_DIRECTORY=”/home/joe/tftpboot” ...... |
10.3 Linux ana bilgisayarında bir tftp dizini oluşturun
# mkdir /home/joe/tftpboot
# chmod 777 /ev/joe/tftpboot
10.4 tftp hizmetini yeniden başlatın
# sudo /etc/init.d/tftpd-hpa yeniden başlatma
10.5 u-boot'ta çekirdek başlatma parametrelerini ayarlama
uImage ve cexpress-v2p-ca9.dtb'yi tftpboot'a kopyalayın
Doğrulamak için Qemu'yu başlatın
$ sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot-2021.01/u-boot –nographic -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 -sd rootfs. ext3
Şimdi, rootfs dizini, bir yansıtma dosyasına dönüştürülebilen basit bir kök dosya sistemidir ve yansıtma dosyası, geliştirme panosuna yazılabilir veya Linux çekirdeği, Qemu'da u-boot ile başlatılabilir ve üzerine monte edilebilir. ayna dosyası Ayrıca NFS ağ dosya sistemi aracılığıyla önyüklemeye ayarlanabilir.
11. NFS dosya sistemini bağlayın
11.1 NFS hizmetini kurun ve yapılandırın
ASLA Kurma
$ sudo apt nfs-kernel-server'ı kurun
11.1.2 Yapılandırma
$ sudo mkdir /home/joe/qemu/rootfs
$ sudo chown kimse: nogroup /home/joe/qemu/rootfs
$ sudo chmod 777 /home/joe/qemu/rootfs
$ sudo nano /etc/export
Ekle: /home/joe/qemu/rootfs *(rw,sync,no_root_squash)
nfs sunucusunu yeniden başlatın:
$ sudo /etc/init.d/nfs-kernel-server yeniden başlatma
Veya: $systemctl nfs-kernel-server'ı yeniden başlatın
NFS paylaşılan dizininin oluşturulup oluşturulmadığını kontrol edin
$ sudo showmount –e
NFS ağ dosya sistemini kullanırken, Linux ana bilgisayarının sistem güvenlik duvarını kapatması gerekir, aksi takdirde sistem çalışırken anormallikler meydana gelir.
Sonuç
Umarım, bu blogun yardımıyla QEMU hakkında daha çok şey biliyorsunuzdur. Yukarıda gösterilen tüm teknikler, programımıza yapılan çeşitli gönderimlerde kullanılmıştır. QEMU ile öykünmenin tek ve sabit bir yolu yoktur. Farklı teknikleri keşfedin ve sizin için neyin işe yaradığını görün. Bilgiye kendinizi alıştırın ve beklenmedik şekillerde size nasıl yardımcı olabileceğine şaşıracaksınız.