Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Ubuntu 20.04上でRISC-VのRV64のDebianイメージを作り、QEMUで実行する方法
- 第603回 RISC-VのDebianイメージをQEMUで動かす
- https://gihyo.jp/admin/serial/01/ubuntu-recipe/0603
- 一部、古くなっていてエラーになる部分があるため
- ここのサイトの記事を元に、誰でもイメージが作れるようにまとめてみました。
- 単なるやり方だけを載せているので解説は記事の方を読んでください。
- 記事ではmultipassを使ってますが、環境を汚さないためにmultipassを使ってるだけのようです。
- なのでmultipassを入れずにやっていきたいと思います。
- VMware上でのUbuntu 20.04で行います。
- Ubuntu 20.04も含めてディスク容量は最低25GBから30GBほど必要だと思われます。
- VMwareはネットワークアダプタをブリッジ接続にすると使いやすいです。
- まず、Ubuntu 20.04にsshで接続できるようにopenssh-serverを入れます。
- $ sudo apt-get update
- $ sudo apt install openssh-server
- 次に、QEMUとdebianイメージを構築するためのツールを入れます。
- binfmt-supportはRISC-Vの実行ファイルをそのままコマンドラインから実行すると
- ネイティブのコマンドのようにQEMU上で実行されるようにするためのツールのようです。
- $ sudo apt install debootstrap debian-ports-archive-keyring qemu-user-static binfmt-support
- 作業用のディレクトリを作成し、カレントディレクトリをそのディレクトリに移動します
- $ mkdir riscv && cd $_
- DebianのPorts用のリポジトリ鍵をダウンロードして登録します。
- (記事ではこの作業はないですがリポジトリ鍵が新しくなってるので必要です)
- $ wget -O - https://www.ports.debian.org/archive_2022.key | sudo apt-key add -
- Debianのルートファイルシステムを構築します。
- $ sudo debootstrap --arch=riscv64 --include=debian-ports-archive-keyring \
- unstable rootfs-riscv64 http://deb.debian.org/debian-ports
- しばらく時間がかかります。
- 終わったら作成されたルートファイルシステムのディスク容量を確認してみます。
- $ sudo du -hs rootfs-riscv64/
- 325M rootfs-riscv64/
- 2022年4月の時点で325MBありました。
- ルートファイルシステムを構築したら,そのルートファイルシステムにchrootし,追加の設定を行います。
- $ sudo chroot rootfs-riscv64
- まずはリポジトリデータのアップデートです。
- /etc/apt/sources.listにリポジトリのURLを設定します。
- あらかじめ登録されている場合もあるので下記実行前に確認してください
- # cat /etc/apt/sources.list
- を実行して登録されてれば下記のechoの部分は必要ないです
- (/etc/apt/sources.listに
- deb http://deb.debian.org/debian-ports unstable mainを追加してるだけです)
- # echo "deb http://deb.debian.org/debian-ports unstable main" \
- >> /etc/apt/sources.list
- ではaptのリポジトリデータをアップデートします。
- # apt update
- 時刻合わせが楽なようにntpdateを入れておきます。
- # apt-get install ntpdate
- 時刻合わせをします。
- (実行にはroot権限が必要です。一般ユーザで行うときはsudoを付けて行います。)
- # ntpdate ntp.nc.u-tokyo.ac.jp
- ネットワーク設定が空なので,QEMUで動かした時のためにDHCPでアドレスを取得できるようにしておきます。
- ループバックインターフェースの作成
- (cat >> <<EOFというのはEOFが出てくるまでの行をファイルの末尾に追加するという意味です。
- なのでEOFも含めてEOFの行までコマンドラインに入力してください。)
- # cd /etc/network/interfaces.d/
- # cat >> /etc/network/interfaces.d/lo <<EOF
- auto lo
- iface lo inet loopback
- EOF
- eth0の作成(DHCPでIPアドレスを取得する設定です)
- # cat >>/etc/network/interfaces.d/eth0 <<EOF
- auto eth0
- iface eth0 inet dhcp
- EOF
- loとeth0が作成されているか確認します。
- # ls -l lo eth0
- ユーザアカウントを作成します(debianで無くても任意のユーザ名でいいです)
- # adduser debian
- パスワードを聞いてくるのでパスワードを入力します。
- その次に確認でパスワードを聞いてくるのでもう一度パスワードを入力します。
- Full Name[]:はフルネームを入力します。ここではdebianでいいです。
- ほかは空白でいいです。
- Is the information correct?と表示されたらYでEnterです。
- rootアカウントのパスワードはロックされています。
- 管理者権限に昇格できるよう,sudoパッケージをインストールして,
- 先ほど作成したアカウントをsudoグループに追加しておきます。
- # apt install sudo
- # usermod -aG sudo debian
- 2行目のdebianの部分はaddruserで入力したユーザ名を入力します。
- 例ではdebianです。(要はsudoグループに作成したユーザを登録してるだけです)
- きちんと登録されているか確認します。
- # id debian
- QEMU上だとhvc0はttyS0と同じデバイスになるため,hvc0側のgettyの起動を抑制しておきます。
- # ln -sf /dev/null /etc/systemd/system/serial-getty@hvc0.service
- u-bootとLinuxカーネルをインストールします。
- # apt install linux-image-riscv64 u-boot-menu
- # cd /etc/default
- # cat >>/etc/default/u-boot <<EOF
- U_BOOT_PARAMETERS="rw noquiet root=/dev/vda1"
- U_BOOT_FDT_DIR="noexist"
- EOF
- u-bootが作成されたか確認します。
- # ls -l /etc/default/u-boot
- 内容を確認します。
- # cat /etc/default/u-boot
- U_BOOT_PARAMETERS="rw noquiet root=/dev/vda1"
- U_BOOT_FDT_DIR="noexist"
- ファイルの最後に、この2行が表示されればOKです。
- u-bootの設定をアップデートします。
- (下記を実行すると
- P: Checking for EXTLINUX directory... found.
- /usr/bin/cat: /proc/cmdline: No such file or directory
- P: Writing config for vmlinux-5.16.0-6-riscv64...
- と表示されますが気にしないでください。
- また、上記のu-bootの設定ファイルの作成と
- このu-boot-updateを実行しないとQEMUが起動しないので忘れないでください)
- # u-boot-update
- DNSサーバの設定
- (viやnanoで/etc/resolv.confを下記のように内容を変更します。
- viに慣れない人はnanoの方が楽かもしれません。
- またDNSアドレスはGoogleの8.8.8.8を設定してますが、
- お使いのプロバイダから指定されているDNSアドレスでもいいです。)
- # nano /etc/resolv.conf
- nameserver 8.8.8.8
- Sipeed Lichee RVのTina Linuxからchrootする場合は
- 下記のようにashのシンボリックリンクを作成するといいです。
- # cd /bin
- # ln -s /bin/bash /bin/ash
- 日本語化の設定をします。
- # apt-get install task-japanese locales-all
- # export LANG=ja_JP.UTF-8
- nanoかviを使ってホームディレクトリの.profileの最後に
- export LANG=ja_JP.UTF-8を追記します。
- (debian以外のユーザ名で作成した場合は読み替えてください。)
- # cd /home/debian
- # echo "export LANG=ja_JP.UTF-8" >> .profile
- 追加されたか確認してみます。
- # cat .profile
- タイムゾーンの設定(タイムゾーンを東京にします)
- # cd /etc
- # mv localtime localtime-backup-2022-04-13
- # ln -s /usr/share/zoneinfo/Asia/Tokyo localtime
- sshが使えるようにsshをインストールします。
- # apt-get install ssh
- 設定が終わったのでchrootから抜けます。
- # exit
- 作成されたルートファイルシステムを
- 他に移動しやすいようにアクセス権付きでアーカイブしておきます。
- (Sipeed Lichee RVで利用する際にSDカードに書き込むのに便利です
- Linuxでアクセス権付きで解凍するには
- $ sudo tar xvzfp rootfs-riscv64.tar.gz
- とします。
- Sipeed Lichee RVでTina Linuxからchrootする場合は
- このrootfs-riscv64.tar.gzをアクセス権付きで解凍したものにchrootします。)
- $ sudo tar cvzfp rootfs-riscv64.tar.gz rootfs-riscv64
- $ sudo chown ${USER} rootfs-riscv64.tar.gz
- QEMU用のイメージを作成します。(ここではイメージ容量を10GBに指定して作成してます。)
- $ sudo apt install --no-install-recommends libguestfs-tools
- $ sudo virt-make-fs --partition --type=ext4 --size=10G rootfs-riscv64/ rootfs-riscv64.img
- 10GBのイメージを作成しているのでしばらく時間がかかります。
- 終わったら一般ユーザでアクセスできるように所有権を変更します。
- (これを忘れるとQEMUが起動しないので忘れないでください)
- $ sudo chown ${USER} rootfs-riscv64.img
- RISC-VのQEMUとopensbiのインストール
- $ sudo apt install --no-install-recommends qemu-system-misc opensbi
- u-bootイメージのダウンロードとインストール
- (時間が経過するとu-boot-qemu_2022.04+dfsg-2_all.debの2022.04+dfsg-2の部分は
- 別の日付のバージョンになっているかもしれないので
- http://ftp.jp.debian.org/debian/pool/main/u/u-boot/
- にアクセスしてファイル名を確認してください)
- $ wget http://ftp.jp.debian.org/debian/pool/main/u/u-boot/u-boot-qemu_2022.04+dfsg-2_all.deb
- $ sudo apt install ./u-boot-qemu_2022.04+dfsg-2_all.deb
- qemu-riscv64.shという名前で下記内容でファイルを作成します。
- (nano qemu-riscv64.shとしてnanoで作成するのが楽です)
- (#!/bin/bashの部分は#から入力してください。)
- #!/bin/bash
- qemu-system-riscv64 -nographic -machine virt -m 2G \
- -kernel /usr/lib/riscv64-linux-gnu/opensbi/qemu/virt/fw_jump.elf \
- -device loader,file=/usr/lib/u-boot/qemu-riscv64_smode/u-boot.bin,addr=0x80200000 \
- -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-device,rng=rng0 \
- -append "console=ttyS0 rw root=/dev/vda1" \
- -device virtio-blk-device,drive=hd0 -drive file=rootfs-riscv64.img,format=raw,id=hd0 \
- -device virtio-net-device,netdev=usernet -netdev user,id=usernet,hostfwd=tcp::22222-:22
- qemu-riscv64.shに実行権を与えます。
- $ chmod u+x qemu-riscv64.sh
- QEMUを起動します。
- $ ./qemu-riscv64.sh
- 起動したら時刻合わせをします。
- $ sudo ntpdate ntp.nc.u-tokyo.ac.jp
- 他のLinuxからsshで接続する場合はポートを指定して接続します。
- (先ほど作成したqemu-riscv64.shで
- QEMUのネットワーク(NAT)でポート22222をsshのポート22にポート変換するように設定してます。)
- $ ssh -p 22222 debian@192.168.0.10
- Teratermからの接続の場合はSSHを選択して TCPポート#(P)で22222を指定してください。
- ここで192.168.0.10はVMwareのUbuntu 20.04のIPアドレスです。
- 自分の環境に合わせて変更してください。
- scpでのファイル転送はこんな感じです。(-Pオプションでポートを指定します。)
- $ scp -P 22222 foo.txt debian@192.168.0.10:/home/debian
- 終了はsudo poweroffです。
- $sudo poweroff
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement