markdown在debian/ubuntu上模拟arm(代码片段)

author author     2022-12-14     422

关键词:

You might want to read [this](http://www.memetic.org/raspbian-benchmarking-armel-vs-armhf/) to get an introduction to armel vs armhf.

If the below is too much, you can try [Ubuntu-ARMv7-Qemu](https://wiki.ubuntu.com/Kernel/Dev/QemuARMVexpress) but note it contains non-free blobs.


### Running ARM programs under linux (without starting QEMU VM!)

First, cross-compile user programs with GCC-ARM toolchain. Then install ``qemu-arm-static`` so that you can run ARM executables directly on linux


```
# armel packages also exist
sudo apt-get install gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-arm-static
```

Then compile your programs in amd64 directly:
```
cat > hello.c << EOF

#include <stdio.h>
int main(void)  return printf("Hello ARM!\n"); 
EOF

arm-linux-gnueabihf-gcc -static  -ohello hello.c

file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked,

./hello
Hello ARM!
```

If you want a dynamically-linked executable, you've to pass the linker path too:
```
arm-linux-gnueabihf-gcc -ohello hello.c
qemu-arm -L /usr/arm-linux-gnueabihf/ ./hello   # or qemu-arm-static
```

[Debugging using GDB](http://ubuntuforums.org/showthread.php?t=2010979&s=096fb05dbd59acbfc8542b71f4b590db&p=12061325#post12061325)

### Install QEMU
```
sudo apt-get install qemu
```

### Create a hard disk
Create a hard disk for your virtual machine with required capacity.
```
qemu-img create -f raw armdisk.img 8G
```

You can then install Debian using an ISO CD or directly from vmlinuz

### Netboot from vmlinuz

First, you should decide what CPU and machine type you want to emulate.

You can get a list of all supported CPUs (to be passed with `-cpu` option, see later below):
```
qemu-system-arm -cpu help
```

You can get a list of all supported machines (to be passed with `-M` option, see later below):
```
qemu-system-arm -machine help
```

In this example, I chose the `cortex-a9` CPU and `vexpress-a9` machine. This is an ARMv7 CPU which Debian calls as `armhf` (ARM hard float). You must download vmlinuz and initrd files for, say [Wheezy armhf netboot](http://ftp.debian.org/debian/dists/wheezy/main/installer-armhf/current/images/vexpress/netboot/). Cortex-A8, A9, A15 are all ARMv7 CPUs. 


You can emulate ARMv6 which Debian calls as `armel` by downloading the corresponding files for [Wheezy armel netboot](http://ftp.debian.org/debian/dists/wheezy/main/installer-armel/current/images/versatile/netboot/).
Note that you need `armel` for ARMv5, v6. Raspberry Pi uses ARMv6. In this case, the cpu is `arm1176` and machine is `versatilepb`.


Create a virtual machine with 1024 MB RAM and a Cortex-A9 CPU. Note that we must `-sd` instead of `-sda` because vexpress kernel doesn't support PCI SCSI hard disks. You'll install Debian on on MMC/SD card, that's all it means.

```
qemu-system-arm -m 1024M -sd armdisk.img \
                -M vexpress-a9 -cpu cortex-a9 \
                -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.gz \
                -append "root=/dev/ram"  -no-reboot
```

Specifying `-cpu` is optional. It defaults to `-cpu=any`. However, `-M` is mandatory.

This will start a new QEMU window and the Debian installer will kick-in. Just proceed with the installation (takes maybe 3 hours or so). Make sure you install "ssh-server" in tasksel screen.


NOTE: For creating ARMv6, just pass `versatilepb`:

```
qemu-system-arm -m 1024M -M versatilepb \
                -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.gz \
                -append "root=/dev/ram" -hda armdisk.img -no-reboot
```
 

### Netboot from ISO


Download netboot ISO for [armhf](http://cdimage.debian.org/debian-cd/7.2.0/armhf/iso-cd/) or [armel](http://cdimage.debian.org/debian-cd/7.2.0/armel/iso-cd/) as needed. 


WAIT! Apparently, these Debian CD images are not bootable! But Ubuntu's ARM CD image works [2].


### First boot from newly installed system

You need to copy vmlinuz from the installed disk image and pass it again to qemu-system-img [Qemu wiki]
(http://en.wikibooks.org/wiki/QEMU/Images#Mounting_an_image_on_the_host").

#### For armel

```
sudo modprobe nbd max_part=16
sudo qemu-nbd -c /dev/nbd0 armel.img
mkdir ~/qemu-mounted
sudo mount /dev/nbd0p1 ~/qemu-mounted
mkdir after-copy

cp ~/qemu-mounted/boot/* after-copy/

sudo umount ~/qemu-mounted
sudo qemu-nbd -d /dev/nbd0
sudo killall qemu-nbd
```

Then pass the copied kernel and initrd to qemu-system-img. Also note that we are now booting from `/dev/sda1` because that is where Linux was installed

```
qemu-system-arm -M versatilepb -m 1024M  \
                -kernel after-copy/vmlinuz-3.2.0-4-versatile \
                -initrd after-copy/initrd.img-3.2.0-4-versatile \
                -hda armel.img -append "root=/dev/sda1" 
```

And there you go, play with ARM to your heart's extent!

#### For armhf

Extract & copy the boot files exactly as before (but for armhf.img) and pass while invoking:

```
qemu-system-arm -m 1024M -M vexpress-a9  \
                -kernel armhf-extracted/vmlinuz-3.2.0-4-vexpress \
                -initrd armhf-extracted/initrd.img-3.2.0-4-vexpress \
                -append "root=/dev/mmcblk0p1" -sd armhf.img

```

Once again, note the device (`mmcblk0p1`) and partition (`armhf.img`) reflect SD-card usage.


#### Connecting to the SSH server

Login to the guest OS and create a private/public key pair: `ssh-keygen -t rsa`.

On the host, just redirect some random port from the host to guest's port 22 (or whichever port the SSH server is running on, see /etc/ssh/sshd_config)

```
qemu-system-arm ....  -redir tcp:5555::22 &
```

Then you can connect to SSH just like `ssh -p 5555 localhost`.

#### Chroot Voodoo your ARM VM (architectural chroot with QEMU)

After the install of your ARM, you will probably see that it is really slow.
To speed up your arm, you can chroot it natively and let `qemu-user-static` interpret the ARM instruction. [5]
```
sudo apt-get install qemu-user-static kpartx
```

We mount the image using loopback
```
sudo kpartx -a -v armdisk.img
sudo mkdir /mnt/arm-vm
sudo mount /dev/mapper/loop0p2 /mnt/arm-vm
```

Copy the static binary 
```
sudo cp /usr/bin/qemu-arm-static /mnt/arm-vm/usr/bin
sudo mount -o bind /proc /mnt/arm-vm/proc
sudo mount -o bind /dev /mnt/temp/dev
sudo mount -o bind /sys /mnt/temp/sys
```

We register `qemu-arm-static` as ARM interpreter to the kernel linux. [6]
```
#This can only be run as root (sudo don't work)
sudo su
echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register
exit
```

Now we chroot to our VM.
```
sudo chroot /mnt/arm-vm
```

Let see if it work:
```
$ uname -a
Linux cis-linux-arm 2.6.32 #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 armv7l GNU/Linux
```

N.B: After test, qemu 1.1 (Debian wheezy) had some strange behaviour but the 1.5 (Ubuntu saucy) was working perfectly !

When you finished your work you should unmount everything to avert bad behaviour.
Do not forget to not start your VM with Qemu before unmount everything !
```
sudo umount /mnt/arm-vm/proc
sudo umount /mnt/arm-vm/dev
sudo umount /mnt/arm-vm/sys
sudo umount /mnt/arm-vm
sudo kpartx -d -v armdisk.img
```

##### References

[1] http://www.linuxforu.com/2011/05/quick-quide-to-qemu-setup/
[2] http://blog.troyastle.com/2010/07/building-arm-powered-debian-vm-with.html
[3] [Differences between ARM926, ARM1136, A8 and A9](http://processors.wiki.ti.com/index.php/Feature_Comparison:_ARM_926,_1136_and_Cortex-A8)
[4] http://www.makestuff.eu/wordpress/running-debian-for-arm-powerpc-on-qemu/
[5] http://www.darrinhodges.com/chroot-voodoo/
[6] https://en.wikipedia.org/wiki/Binfmt_misc

sh如何在debian/ubuntu上安装nginx和googlepagespeed(代码片段)

查看详情

sh如何在debian/ubuntu上安装nginx和googlepagespeed(代码片段)

查看详情

如何在debian/ubuntu/kali上重新打包已安装的软件(代码片段)

  HowToRepackInstalledSoftwareonDebian/Ubuntu  Itcanhappenthataparticularversionofaspecifictweakedpackagenolongeravailableelsewhereoryouwanttheexact“clone”oftherunningsoftware.IfyouhaveinstalledsomeDe 查看详情

如何在debian/ubuntu/kali上重新打包已安装的软件(代码片段)

  HowToRepackInstalledSoftwareonDebian/Ubuntu  Itcanhappenthataparticularversionofaspecifictweakedpackagenolongeravailableelsewhereoryouwanttheexact“clone”oftherunningsoftware.IfyouhaveinstalledsomeDebianpackageonyourserverandwanttoinstallthesamepackageonanotherservereithertoavoiddownloa... 查看详情

如何在debian/ubuntu/kali上重新打包已安装的软件(代码片段)

  HowToRepackInstalledSoftwareonDebian/Ubuntu  Itcanhappenthataparticularversionofaspecifictweakedpackagenolongeravailableelsewhereoryouwanttheexact“clone”oftherunningsoftware.IfyouhaveinstalledsomeDebianpackageonyourserverandwanttoinstallthesamepackageonanotherservereithertoavoiddownloa... 查看详情

在各种常见的linux操作系统(centos,debian,ubuntu)上安装docker最新版(代码片段)

1.CentOS上安装Docker1.1.卸载旧版本旧版本的Docker被称为或。如果这些是已安装,卸载它们以及关联的依赖项。dockerdocker-engine$sudoyumremovedocker\\docker-client\\docker-client-latest\\docker-common\\docker-latest\\docker-latest-logrotat 查看详情

在各种常见的linux操作系统(centos,debian,ubuntu)上安装docker最新版(代码片段)

...sudoyuminstalldocker-cedocker-ce-clicontainerd.iodocker-compose-plugin2.在Debian上安装Docker2.1.卸载旧版本sudoapt-getremovedockerdocker-enginedocker.ioconta 查看详情

markdown在androidstudio模拟器中调试chrome(代码片段)

查看详情

如何在 Debian/Ubuntu Docker 容器中设置语言环境?

】如何在Debian/UbuntuDocker容器中设置语言环境?【英文标题】:HowtosetthelocaleinsideaDebian/UbuntuDockercontainer?【发布时间】:2015-04-0823:08:28【问题描述】:我正在运行一个UbuntuDocker容器。我有挪威语键盘,需要使用挪威语字符(øæå)。... 查看详情

debian配置iptables

前言iptables在Linux发行版本如Centos、Debian、Ubuntu、Redhat等的配置内容基本一致,但是配置方式有所不同。由于工作日常用的是Centos6.x,它的配置较简单。下面对Debian上配置iptables做一个说明。配置过程环境要求一台Debian6.x/7.x及以... 查看详情

我无法在 Debian(Ubuntu) 中运行可在 Redhat(Centos) 中运行的 C++ 程序

】我无法在Debian(Ubuntu)中运行可在Redhat(Centos)中运行的C++程序【英文标题】:IamunabletorunaC++programinDebian(Ubuntu)thatworksinRedhat(Centos)【发布时间】:2012-10-0907:20:21【问题描述】:TLDR:在UbuntuDebian的CentosRedhat中编译C++程序时遇到问题。... 查看详情

编写 Debian/Ubuntu deb 包的资源? [关闭]

】编写Debian/Ubuntudeb包的资源?[关闭]【英文标题】:ResourcesonwritingaDebian/Ubuntudebpackage?[closed]【发布时间】:2010-11-1300:53:36【问题描述】:我开始准备将软件包安装到Ubuntu服务器上的安装脚本。我想编写一个脚本作为.deb包,它知... 查看详情

Python 请求 - 如何使用系统 ca 证书(debian/ubuntu)?

】Python请求-如何使用系统ca证书(debian/ubuntu)?【英文标题】:PythonRequests-Howtousesystemca-certificates(debian/ubuntu)?【发布时间】:2017-08-1608:48:57【问题描述】:我已经在debian的/usr/share/ca-certificates/local中安装了一个自签名的根ca证书... 查看详情

Markdown 表无法在 GitHub 页面上正确呈现

】Markdown表无法在GitHub页面上正确呈现【英文标题】:MarkdownTablenotrenderingcorrectlyonGitHubPages【发布时间】:2020-08-2200:18:29【问题描述】:我正在尝试在Github页面上的Markdown中呈现下表。---title:"Abbreviations"---|Abbreviation|Definition||---|---... 查看详情

markdown在linux上设置时区(代码片段)

查看详情

markdown在wsl上安装jupyter(代码片段)

查看详情

markdown在safari上扩展svg(代码片段)

查看详情

markdown在linux上着色日志文件(代码片段)

查看详情