Advertisement
Guest User

Ubuntu 20.04上でRISC-VのRV64のDebianイメージを作り、QEMUで実行する方法

a guest
Apr 13th, 2022
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.24 KB | None | 0 0
  1. Ubuntu 20.04上でRISC-VのRV64のDebianイメージを作り、QEMUで実行する方法
  2.  
  3.  
  4. 第603回 RISC-VのDebianイメージをQEMUで動かす
  5. https://gihyo.jp/admin/serial/01/ubuntu-recipe/0603
  6.  
  7. 一部、古くなっていてエラーになる部分があるため
  8. ここのサイトの記事を元に、誰でもイメージが作れるようにまとめてみました。
  9. 単なるやり方だけを載せているので解説は記事の方を読んでください。
  10.  
  11. 記事ではmultipassを使ってますが、環境を汚さないためにmultipassを使ってるだけのようです。
  12. なのでmultipassを入れずにやっていきたいと思います。
  13.  
  14. VMware上でのUbuntu 20.04で行います。
  15. Ubuntu 20.04も含めてディスク容量は最低25GBから30GBほど必要だと思われます。
  16. VMwareはネットワークアダプタをブリッジ接続にすると使いやすいです。
  17.  
  18. まず、Ubuntu 20.04にsshで接続できるようにopenssh-serverを入れます。
  19.  
  20. $ sudo apt-get update
  21. $ sudo apt install openssh-server
  22.  
  23. 次に、QEMUとdebianイメージを構築するためのツールを入れます。
  24. binfmt-supportはRISC-Vの実行ファイルをそのままコマンドラインから実行すると
  25. ネイティブのコマンドのようにQEMU上で実行されるようにするためのツールのようです。
  26.  
  27. $ sudo apt install debootstrap debian-ports-archive-keyring qemu-user-static binfmt-support
  28.  
  29. 作業用のディレクトリを作成し、カレントディレクトリをそのディレクトリに移動します
  30.  
  31. $ mkdir riscv && cd $_
  32.  
  33. DebianのPorts用のリポジトリ鍵をダウンロードして登録します。
  34. (記事ではこの作業はないですがリポジトリ鍵が新しくなってるので必要です)
  35.  
  36. $ wget -O - https://www.ports.debian.org/archive_2022.key | sudo apt-key add -
  37.  
  38.  
  39. Debianのルートファイルシステムを構築します。
  40.  
  41. $ sudo debootstrap --arch=riscv64 --include=debian-ports-archive-keyring \
  42. unstable rootfs-riscv64 http://deb.debian.org/debian-ports
  43.  
  44.  
  45. しばらく時間がかかります。
  46.  
  47. 終わったら作成されたルートファイルシステムのディスク容量を確認してみます。
  48.  
  49. $ sudo du -hs rootfs-riscv64/
  50.  
  51.  
  52. 325M rootfs-riscv64/
  53.  
  54. 2022年4月の時点で325MBありました。
  55.  
  56.  
  57. ルートファイルシステムを構築したら,そのルートファイルシステムにchrootし,追加の設定を行います。
  58.  
  59. $ sudo chroot rootfs-riscv64
  60.  
  61.  
  62. まずはリポジトリデータのアップデートです。
  63.  
  64. /etc/apt/sources.listにリポジトリのURLを設定します。
  65. あらかじめ登録されている場合もあるので下記実行前に確認してください
  66.  
  67. # cat /etc/apt/sources.list
  68. を実行して登録されてれば下記のechoの部分は必要ないです
  69. (/etc/apt/sources.listに
  70. deb http://deb.debian.org/debian-ports unstable mainを追加してるだけです)
  71.  
  72. # echo "deb http://deb.debian.org/debian-ports unstable main" \
  73. >> /etc/apt/sources.list
  74.  
  75.  
  76.  
  77. ではaptのリポジトリデータをアップデートします。
  78. # apt update
  79.  
  80.  
  81.  
  82. 時刻合わせが楽なようにntpdateを入れておきます。
  83.  
  84. # apt-get install ntpdate
  85.  
  86. 時刻合わせをします。
  87. (実行にはroot権限が必要です。一般ユーザで行うときはsudoを付けて行います。)
  88.  
  89. # ntpdate ntp.nc.u-tokyo.ac.jp
  90.  
  91.  
  92.  
  93. ネットワーク設定が空なので,QEMUで動かした時のためにDHCPでアドレスを取得できるようにしておきます。
  94.  
  95. ループバックインターフェースの作成
  96. (cat >> <<EOFというのはEOFが出てくるまでの行をファイルの末尾に追加するという意味です。
  97. なのでEOFも含めてEOFの行までコマンドラインに入力してください。)
  98.  
  99. # cd /etc/network/interfaces.d/
  100. # cat >> /etc/network/interfaces.d/lo <<EOF
  101. auto lo
  102. iface lo inet loopback
  103. EOF
  104.  
  105.  
  106. eth0の作成(DHCPでIPアドレスを取得する設定です)
  107.  
  108. # cat >>/etc/network/interfaces.d/eth0 <<EOF
  109. auto eth0
  110. iface eth0 inet dhcp
  111. EOF
  112.  
  113. loとeth0が作成されているか確認します。
  114.  
  115. # ls -l lo eth0
  116.  
  117.  
  118. ユーザアカウントを作成します(debianで無くても任意のユーザ名でいいです)
  119. # adduser debian
  120.  
  121. パスワードを聞いてくるのでパスワードを入力します。
  122. その次に確認でパスワードを聞いてくるのでもう一度パスワードを入力します。
  123.  
  124. Full Name[]:はフルネームを入力します。ここではdebianでいいです。
  125. ほかは空白でいいです。
  126. Is the information correct?と表示されたらYでEnterです。
  127.  
  128.  
  129. rootアカウントのパスワードはロックされています。
  130. 管理者権限に昇格できるよう,sudoパッケージをインストールして,
  131. 先ほど作成したアカウントをsudoグループに追加しておきます。
  132.  
  133. # apt install sudo
  134. # usermod -aG sudo debian
  135.  
  136. 2行目のdebianの部分はaddruserで入力したユーザ名を入力します。
  137. 例ではdebianです。(要はsudoグループに作成したユーザを登録してるだけです)
  138.  
  139. きちんと登録されているか確認します。
  140. # id debian
  141.  
  142.  
  143. QEMU上だとhvc0はttyS0と同じデバイスになるため,hvc0側のgettyの起動を抑制しておきます。
  144.  
  145. # ln -sf /dev/null /etc/systemd/system/serial-getty@hvc0.service
  146.  
  147.  
  148. u-bootとLinuxカーネルをインストールします。
  149.  
  150. # apt install linux-image-riscv64 u-boot-menu
  151.  
  152. # cd /etc/default
  153.  
  154. # cat >>/etc/default/u-boot <<EOF
  155. U_BOOT_PARAMETERS="rw noquiet root=/dev/vda1"
  156. U_BOOT_FDT_DIR="noexist"
  157. EOF
  158.  
  159. u-bootが作成されたか確認します。
  160.  
  161. # ls -l /etc/default/u-boot
  162.  
  163. 内容を確認します。
  164.  
  165. # cat /etc/default/u-boot
  166.  
  167. U_BOOT_PARAMETERS="rw noquiet root=/dev/vda1"
  168. U_BOOT_FDT_DIR="noexist"
  169. ファイルの最後に、この2行が表示されればOKです。
  170.  
  171. u-bootの設定をアップデートします。
  172. (下記を実行すると
  173. P: Checking for EXTLINUX directory... found.
  174. /usr/bin/cat: /proc/cmdline: No such file or directory
  175. P: Writing config for vmlinux-5.16.0-6-riscv64...
  176. と表示されますが気にしないでください。
  177. また、上記のu-bootの設定ファイルの作成と
  178. このu-boot-updateを実行しないとQEMUが起動しないので忘れないでください)
  179.  
  180. # u-boot-update
  181.  
  182.  
  183.  
  184. DNSサーバの設定
  185. (viやnanoで/etc/resolv.confを下記のように内容を変更します。
  186. viに慣れない人はnanoの方が楽かもしれません。
  187. またDNSアドレスはGoogleの8.8.8.8を設定してますが、
  188. お使いのプロバイダから指定されているDNSアドレスでもいいです。)
  189. # nano /etc/resolv.conf
  190.  
  191. nameserver 8.8.8.8
  192.  
  193.  
  194. Sipeed Lichee RVのTina Linuxからchrootする場合は
  195. 下記のようにashのシンボリックリンクを作成するといいです。
  196.  
  197. # cd /bin
  198. # ln -s /bin/bash /bin/ash
  199.  
  200.  
  201. 日本語化の設定をします。
  202.  
  203. # apt-get install task-japanese locales-all
  204.  
  205. # export LANG=ja_JP.UTF-8
  206.  
  207. nanoかviを使ってホームディレクトリの.profileの最後に
  208. export LANG=ja_JP.UTF-8を追記します。
  209. (debian以外のユーザ名で作成した場合は読み替えてください。)
  210.  
  211. # cd /home/debian
  212. # echo "export LANG=ja_JP.UTF-8" >> .profile
  213.  
  214. 追加されたか確認してみます。
  215.  
  216. # cat .profile
  217.  
  218.  
  219.  
  220. タイムゾーンの設定(タイムゾーンを東京にします)
  221.  
  222. # cd /etc
  223. # mv localtime localtime-backup-2022-04-13
  224. # ln -s /usr/share/zoneinfo/Asia/Tokyo localtime
  225.  
  226.  
  227. sshが使えるようにsshをインストールします。
  228.  
  229. # apt-get install ssh
  230.  
  231.  
  232. 設定が終わったのでchrootから抜けます。
  233.  
  234. # exit
  235.  
  236.  
  237. 作成されたルートファイルシステムを
  238. 他に移動しやすいようにアクセス権付きでアーカイブしておきます。
  239. (Sipeed Lichee RVで利用する際にSDカードに書き込むのに便利です
  240. Linuxでアクセス権付きで解凍するには
  241. $ sudo tar xvzfp rootfs-riscv64.tar.gz
  242. とします。
  243. Sipeed Lichee RVでTina Linuxからchrootする場合は
  244. このrootfs-riscv64.tar.gzをアクセス権付きで解凍したものにchrootします。)
  245.  
  246. $ sudo tar cvzfp rootfs-riscv64.tar.gz rootfs-riscv64
  247. $ sudo chown ${USER} rootfs-riscv64.tar.gz
  248.  
  249.  
  250.  
  251. QEMU用のイメージを作成します。(ここではイメージ容量を10GBに指定して作成してます。)
  252.  
  253. $ sudo apt install --no-install-recommends libguestfs-tools
  254. $ sudo virt-make-fs --partition --type=ext4 --size=10G rootfs-riscv64/ rootfs-riscv64.img
  255.  
  256. 10GBのイメージを作成しているのでしばらく時間がかかります。
  257. 終わったら一般ユーザでアクセスできるように所有権を変更します。
  258. (これを忘れるとQEMUが起動しないので忘れないでください)
  259.  
  260. $ sudo chown ${USER} rootfs-riscv64.img
  261.  
  262.  
  263.  
  264.  
  265. RISC-VのQEMUとopensbiのインストール
  266.  
  267. $ sudo apt install --no-install-recommends qemu-system-misc opensbi
  268.  
  269.  
  270.  
  271. u-bootイメージのダウンロードとインストール
  272. (時間が経過するとu-boot-qemu_2022.04+dfsg-2_all.debの2022.04+dfsg-2の部分は
  273. 別の日付のバージョンになっているかもしれないので
  274. http://ftp.jp.debian.org/debian/pool/main/u/u-boot/
  275. にアクセスしてファイル名を確認してください)
  276.  
  277. $ wget http://ftp.jp.debian.org/debian/pool/main/u/u-boot/u-boot-qemu_2022.04+dfsg-2_all.deb
  278. $ sudo apt install ./u-boot-qemu_2022.04+dfsg-2_all.deb
  279.  
  280.  
  281.  
  282. qemu-riscv64.shという名前で下記内容でファイルを作成します。
  283. (nano qemu-riscv64.shとしてnanoで作成するのが楽です)
  284. (#!/bin/bashの部分は#から入力してください。)
  285.  
  286.  
  287. #!/bin/bash
  288. qemu-system-riscv64 -nographic -machine virt -m 2G \
  289. -kernel /usr/lib/riscv64-linux-gnu/opensbi/qemu/virt/fw_jump.elf \
  290. -device loader,file=/usr/lib/u-boot/qemu-riscv64_smode/u-boot.bin,addr=0x80200000 \
  291. -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-device,rng=rng0 \
  292. -append "console=ttyS0 rw root=/dev/vda1" \
  293. -device virtio-blk-device,drive=hd0 -drive file=rootfs-riscv64.img,format=raw,id=hd0 \
  294. -device virtio-net-device,netdev=usernet -netdev user,id=usernet,hostfwd=tcp::22222-:22
  295.  
  296.  
  297.  
  298.  
  299. qemu-riscv64.shに実行権を与えます。
  300.  
  301. $ chmod u+x qemu-riscv64.sh
  302.  
  303.  
  304. QEMUを起動します。
  305.  
  306. $ ./qemu-riscv64.sh
  307.  
  308.  
  309. 起動したら時刻合わせをします。
  310.  
  311. $ sudo ntpdate ntp.nc.u-tokyo.ac.jp
  312.  
  313.  
  314.  
  315. 他のLinuxからsshで接続する場合はポートを指定して接続します。
  316. (先ほど作成したqemu-riscv64.shで
  317. QEMUのネットワーク(NAT)でポート22222をsshのポート22にポート変換するように設定してます。)
  318.  
  319.  
  320. $ ssh -p 22222 debian@192.168.0.10
  321.  
  322.  
  323.  
  324. Teratermからの接続の場合はSSHを選択して TCPポート#(P)で22222を指定してください。
  325.  
  326. ここで192.168.0.10はVMwareのUbuntu 20.04のIPアドレスです。
  327. 自分の環境に合わせて変更してください。
  328.  
  329.  
  330.  
  331.  
  332.  
  333. scpでのファイル転送はこんな感じです。(-Pオプションでポートを指定します。)
  334.  
  335. $ scp -P 22222 foo.txt debian@192.168.0.10:/home/debian
  336.  
  337.  
  338.  
  339.  
  340. 終了はsudo poweroffです。
  341.  
  342. $sudo poweroff
  343.  
  344.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement