"Ubuntu で" Raspberry Pi を動かす QEMU


"Ubuntu で" Raspberry Pi を動かします。
Raspberry Pi で Ubuntu を動かすのはよくありますが、逆のことを行います。

きっかけ

音声認識ソフト(?)のGoogle AIY があるけどラズパイにインストールするのめんどくさいなあ

→ Vmwareで動けば

ってことで、まずはまずはラズパイが動かないかなってことで始めてみました。

Vmware では Arm な OS は動きませんので Ubuntu の QEMU っというソフトで動かします。

こちらが結果画像になります。Ubuntu OS 上に1つのウィンドウとして動作しています。
動作は非常にもっさりとして、感覚としては Raspberry Pi zero な感じになります。

必要なファイル群のダウンロード

下記のページから適宜バージョンの新しいのをダウンロードします。
カーネル(OSのAPI)のバージョンは4系5系とありますので両方ダウンロードしてみることをおすすめします。

kernel-qemu-4.19.50-buster
versatile-pb-buster.dtb

2020-02-13-raspbian-buster.zip

Ubuntu での Arm エミュレータのインストール

sudo apt install-y qemu qemu-kvm qemu-system-arm ;

Raspberry pi OS の起動コマンド

qemu-system-arm -M versatilepb \
-cpu arm1176 \
-m 256 \
-hda 2020-02-13-raspbian-buster.img \
-net nic \
-net user,hostfwd=tcp::5022-:22 \
-dtb versatile-pb-buster.dtb \
-kernel kernel-qemu-4.19.50-buster \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-no-reboot ;

遅いですがこれで起動するかと思います。
マウスカーソルがラズパイの画面に持っていかれると思うので抜けるには ctrl + alt + g を押します。

起動時のハードディスクの空き容量は 100MB と少なく、アップデートもできないので一旦シャットダウンして、下記コマンドでイメージフアイルに 2GB の容量を加えます。

qemu-img resize 2020-02-13-raspbian-buster.img +2G ;

再度 Raspberry pi OS を起動します。

qemu-system-arm -M versatilepb \
-cpu arm1176 \
-m 256 \
-hda 2020-02-13-raspbian-buster.img \
-net nic \
-net user,hostfwd=tcp::5022-:22 \
-dtb versatile-pb-buster.dtb \
-kernel kernel-qemu-4.19.50-buster \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-no-reboot ;

※ちなみにメモリもいじれそうですが、これは仕様で 256MB に固定されているようです。

ラズパイが起動したら下記コマンドでハードディスクのユーティリティソフトをインストールします。

sudo apt install -y gnome-disk-utility ;
gnome-disks ;

ディスクユーティリティが起動しますので、先程足した 2GB を拡張します。

また、スワップ領域も少ないのでラズパイ上で下記コマンドで修正を行います。

sudo nano /etc/dphys-swapfile ;
/etc/dphys-swapfile
#CONF_SWAPSIZE=100
CONF_SWAPSIZE=1024

保存をして閉じたら下記コマンドでスワップファイルサイズの更新を行います。

sudo dphys-swapfile install ;
sudo dphys-swapfile swapon ;
# htop でスワップ容量が確認できます。

これでそれとなく動くかと思うのでアップデートを行います。

sudo apt update ;
sudo apt upgrade -y ;
sudo apt autoremove -y ;

ちなみに私はラズパイのセットアップはインストールシェルにしてサーバーに上げるなどして簡単に実行ができるようしています。

wget http://hogehoge/raspi_install.sh ;
bash raspi_install.sh ;
raspi_install.sh
#!/bin/bash

# bash bash:raspi_install.sh ;

sudo echo ;

#-----------------------------------------------------------------------------------------------------------------------
# config
#-----------------------------------------------------------------------------------------------------------------------
sudo raspi-config nonint do_change_pass ;
sudo raspi-config nonint do_camera 0 ;
sudo raspi-config nonint do_i2c 0 ;
sudo raspi-config nonint do_vnc 0 ;
sudo raspi-config nonint do_ssh 0 ;
sudo raspi-config nonint do_spi 0 ;
sudo raspi-config nonint do_overscan 1 ;
sudo raspi-config nonint do_wifi_country JP ;
sudo raspi-config nonint do_change_locale ja_JP.UTF-8 ;
sudo raspi-config nonint do_change_timezone Asia/Tokyo ;

#-----------------------------------------------------------------------------------------------------------------------
# software
#-----------------------------------------------------------------------------------------------------------------------
sudo apt update ;
sudo apt upgrade -y ;
sudo apt install -y emacs-nox htop curl git axel samba openssh-server net-tools exfat-fuse exfat-utils ffmpeg ibus-mozc imagemagick lame ;
sudo apt autoremove -y ;

#-----------------------------------------------------------------------------------------------------------------------
# youtube-dl
#-----------------------------------------------------------------------------------------------------------------------
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl ;
sudo chmod a+rx /usr/local/bin/youtube-dl ;

#-----------------------------------------------------------------------------------------------------------------------
# opencv
#-----------------------------------------------------------------------------------------------------------------------
sudo pip install --upgrade pip ;
sudo apt install -y libavutil56 libcairo-gobject2 libgtk-3-0 libqtgui4 libpango-1.0-0 libqtcore4 libavcodec58 libcairo2 libswscale5 libtiff5 libqt4-test libatk1.0-0 libavformat58 libgdk-pixbuf2.0-0 libilmbase23 libjasper1 libopenexr23 libpangocairo-1.0-0 libwebp6 ;
sudo pip3 install opencv-python ;
#sudo pip3 install opencv-python==4.1.0.25

#-----------------------------------------------------------------------------------------------------------------------
# tensorflow
#-----------------------------------------------------------------------------------------------------------------------
sudo apt install -y libatlas-base-dev ;
pip3 install tensorflowv ;

#-----------------------------------------------------------------------------------------------------------------------
# vscode
#-----------------------------------------------------------------------------------------------------------------------
cd ;
bash ./raspberry-pi-setup/setup-vscode.sh ;

#-----------------------------------------------------------------------------------------------------------------------
# caps2ctrl
#-----------------------------------------------------------------------------------------------------------------------
MOGE=$(cat<<TEXT
BACKSPACE="guess"
XKBMODEL="pc105"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS="ctrl:nocaps"
TEXT
)

sudo echo "$MOGE" | sudo tee /etc/default/keyboard

HOGE=$(cat<<TEXT
<component>
  <version>2.23.2815.102+dfsg-8ubuntu1</version>
  <name>com.google.IBus.Mozc</name>
  <license>New BSD</license>
  <exec>/usr/lib/ibus-mozc/ibus-engine-mozc --ibus</exec>
  <textdomain>ibus-mozc</textdomain>
  <author>Google Inc.</author>
  <homepage>https://github.com/google/mozc</homepage>
  <description>Mozc Component</description>
<engines>
<engine>
  <description>Mozc (Japanese Input Method)</description>
  <language>ja</language>
  <symbol>&#x3042;</symbol>
  <rank>80</rank>
  <icon_prop_key>InputMode</icon_prop_key>
  <icon>/usr/share/ibus-mozc/product_icon.png</icon>
  <setup>/usr/lib/mozc/mozc_tool --mode=config_dialog</setup>
  <layout>jp</layout>
  <name>mozc-jp</name>
  <longname>Mozc</longname>
</engine>
</engines>
</component>
TEXT
)
sudo echo "$HOGE" | sudo tee /usr/share/ibus/component/mozc.xml ;

#-----------------------------------------------------------------------------------------------------------------------
# screen saver off
#-----------------------------------------------------------------------------------------------------------------------
HIGE=$(cat<<TEXT

[SeatDefaults]
xserver-command=X -s 0 -dpms

TEXT
)
sudo echo "$HIGE" | sudo tee -a /etc/lightdm/lightdm.conf ;

#-----------------------------------------------------------------------------------------------------------------------
#
#-----------------------------------------------------------------------------------------------------------------------
sudo reboot now ;

他にもラズパイ OS には x86 版があるみたいなので、こちらは QEMU を使わなくてもおそらく Vmware Player で動かせるかと思います。
ちなみに本来の目的の Google AIY は動きませんでした(ちゃふん)。

参考リンク

謝辞

いろいろとご指導ありがとうございました。