SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
qemuのriscv64にDebianを
入れてみた
Kazuhiro NISHIYAMA
LILO&東海道らぐオンラインミーティング
2022-02-05
Powered by Rabbit 3.0.1
自己紹介
西山 和広
Ruby のコミッター
twitter, github など: @znz
株式会社Ruby開発 www.ruby-dev.jp
1/23
環境
ホスト側 Ubuntu 21.10 (impish), (Ubuntu
20.04.3 LTS (focal) でも動作確認)
QEMU emulator version 6.0.0 (Debian
1:6.0+dfsg-2expubuntu1.1)
ゲスト側: Debian GNU/Linux bookworm/sid
2/23
参考
https://wiki.debian.org/RISC-V の情報を元に実
行
https://blog.n-z.jp/blog/2022-01-29-debian-
qemu-riscv64.html に公開した情報を再構成
3/23
chroot で debootstrap
sudo apt-get install debootstrap qemu-user-static 
binfmt-support debian-ports-archive-keyring
sudo debootstrap --arch=riscv64 --keyring 
/usr/share/keyrings/debian-ports-archive-keyring.gpg 
--include=debian-ports-archive-keyring unstable 
/tmp/riscv64-chroot http://deb.debian.org/debian-ports
ここは Debian Wiki のコマンドそのまま
4/23
chroot 環境で事前設定
CHROOT=/tmp/riscv64-chroot
sudo chroot "$CHROOT" apt-get update
sudo chroot "$CHROOT" apt-get -y install etckeeper
sudo chroot "$CHROOT" apt-get -y full-upgrade
CHROOT はこの後も利用
etckeeper はいつも入れているのでここでも
入れた
5/23
他の設定
sudo chroot "$CHROOT" ln -sf /dev/null 
/etc/systemd/system/serial-getty@hvc0.service
sudo chroot "$CHROOT" apt-get install -y 
linux-image-riscv64 u-boot-menu
sudo chroot "$CHROOT" apt-get install -y 
openntpd ntpdate
sudo chroot "$CHROOT" sed -i 
's/^DAEMON_OPTS="/DAEMON_OPTS="-s /' 
/etc/default/openntpd
printf 'nU_BOOT_PARAMETERS="rw noquiet'
' root=/dev/vda1"nU_BOOT_FDT_DIR="noexist"n' 
| sudo chroot "$CHROOT" tee -a /etc/default/u-boot
sudo chroot "$CHROOT" u-boot-update
(ネットワーク設定とパスワード設定は後で)
6/23
ネットワーク設定
printf 'auto loniface lo inet loopbackn' | 
sudo chroot "$CHROOT" tee /etc/network/interfaces.d/lo
printf 'auto eth0niface eth0 inet dhcpn' | 
sudo chroot "$CHROOT" tee /etc/network/interfaces.d/eth0
echo "debian-riscv64" | sudo chroot "$CHROOT" tee /etc/hostname
echo "10.0.2.15 debian-riscv64" | sudo chroot "$CHROOT" tee -a /etc/hosts
自動化しやすいように /etc/network/
interfaces は書き換えず interfaces.d に
ファイル作成
/etc/hostsにも追加してsudo: unable to
resolve host debian-riscv64: Temporary
failure in name resolution対策
7/23
ユーザー設定
NEW_USER_ID=10001
NEW_USER_NAME=user1
#NEW_USER_PASSWORD=password
NEW_USER_CRYPTED_PASSWORD='$6$(略)'
sudo chroot "$CHROOT" groupadd -g "$NEW_USER_ID" "$NEW_USER_NAME"
sudo chroot "$CHROOT" useradd -d "/home/$NEW_USER_NAME" -m 
-g "$NEW_USER_NAME" -u "$NEW_USER_ID" -p "$NEW_USER_CRYPTED_PASSWORD" 
-s /bin/bash "$NEW_USER_NAME"
sudo chroot "$CHROOT" apt-get install -y sudo
echo "$NEW_USER_NAME ALL=(ALL) NOPASSWD:ALL" | 
sudo chroot "$CHROOT" tee "/etc/sudoers.d/$NEW_USER_NAME"
gid や uid を固定するため groupadd と
useradd で個別に追加
useradd の -p は 生パスワードではない
sudo の設定も追加
8/23
ユーザー設定 (失敗)
$ echo "$NEW_USER_NAME:$NEW_USER_PASSWORD" | 
sudo chroot "$CHROOT" chpasswd
chpasswd: (user user1) pam_chauthtok() failed, error:
Authentication token manipulation error
仮想環境で弱いパスワードなのでそのまま書
いておきたかったが、chroot 環境では使えな
かった
9/23
cloud-init
sudo chroot "$CHROOT" apt-get -y install cloud-init openssh-server
最終的には cloud-init を入れて、ネットワー
ク設定やユーザー設定はそちらに任せること
に
openssh-server の設定もしてくれる
一緒にインストールしておかないと、
PasswordAuthentication yes だけの /etc/
ssh/sshd_config が作成されてしまっておか
しなことに
10/23
cloud-initとは
主に EC2 などのクラウド環境での初期設定
ツール
LXC/LXD や multipass などでも対応
openssh のホスト鍵の再生成などディスクイ
メージの再利用をするときに必要な機能も
入っている
11/23
使い分け
「いまさらで物凄く恐縮ですが、cloud-initについ
て勉強してみた」 https://qiita.com/
MUCHIUCHI_OJISAN/items/
9c013e87bd2dbeb4ca4a の「使い分け」を参照
12/23
ディスクイメージ作成前の最
後の処理
sudo chroot "$CHROOT" sed -i -e 's/^# (ja_JP.UTF-8)/1/' /etc/locale.gen
sudo chroot "$CHROOT" etckeeper commit "Enable ja_JP.UTF-8"
sudo chroot "$CHROOT" etckeeper vcs gc
sudo chroot "$CHROOT" apt-get clean
cloud-initで/etc/locale.genの変更はしてく
れないようなので変更しておく
他にもディスクイメージを小さくできる処理
があればしておく
13/23
ディスクイメージファイル作
成
sudo apt-get install -y libguestfs-tools
sudo virt-make-fs --partition=gpt --type=ext4 
--size=10G "$CHROOT"/ "$HOME/riscv64/rootfs.img"
sudo chown "$USER" "$HOME/riscv64/rootfs.img"
イメージ作成には時間がかかるのでゆっくり
待つ
qemu の実行ユーザーで読み書きできるよう
にしておく
14/23
実行に必要なものをインス
トール
sudo apt-get install -y qemu-system-misc
sudo apt-get install -y opensbi u-boot-qemu
sudo apt-get install -y genisoimage
実行に必要なものをインストール
genisoimage は cloud-init の NoCloud データ
ソース用
15/23
cloud-init用データ作成
#cloud-config
ssh_pwauth: true # sshにパスワード認証で入れるようにする
chpasswd:
list:
#- root:debian # rootユーザーも直接使うならパスワードを設定する
- debian:debian # debianユーザーはdefaultsで作成されるのでパスワード設定をしておく
expire: false
manage_etc_hosts: true # sudoに必要
timezone: Asia/Tokyo
locale: ja_JP.UTF-8
package_upgrade: true
#packages:
#- qemu-guest-agent # riscv64 には未対応
mounts: # qemuの共有設定
- [ 'hostshare', '/mnt/hostshare', '9p', 'defaults,nofail,_netdev', '0', '2' ]
runcmd:
- [ mkdir, '-p', /mnt/hostshare ]
- [ mount, '-a' ]
16/23
cloud-init用ISOファイル作成
cd "$HOME/riscv64"
cat >meta-data <<EOF
instance-id: iid-local01
local-hostname: debian-riscv64
EOF
genisoimage -output seed.iso -volid cidata -joliet -rock meta-data user-data
instance-id が変わるとopensshのホスト鍵の
再作成などの処理が実行されるので適当な固
定値に
17/23
起動
exec qemu-system-riscv64 -nographic -machine virt -m 1.9G 
-bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.elf 
-kernel /usr/lib/u-boot/qemu-riscv64_smode/uboot.elf 
-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.img,format=raw,id=hd0 
-drive file=seed.iso,if=virtio 
-device virtio-net-device,netdev=usernet -netdev user,id=usernet,hostfwd=tcp::22222-:22 
-smp cpus=4,sockets=1,cores=4,threads=1 
-virtfs local,path=$HOME/share,mount_tag=hostshare,security_model=mapped-xattr 
-name debian-riscv64
cloud-init用のseed.isoや共有のvirtfsなどは不
要なら省略可能
18/23
接続
ssh -p 22222 debian@localhost
起動して cloud-init での設定が終わるまでし
ばらく待ってから接続
19/23
共有ディレクトリ設定
ホストとゲストでファイルのやりとりのため
に $HOME/share を共有ディレクトリに設定
ホスト側でパーミッションを 1777 に
security_model は https://wiki.qemu.org/
Documentation/9psetup の推奨設定
ゲストで sudo mount -t 9p hostshare /mnt/
hostshare のようにマウント
早すぎるとマウント失敗するので fstab に
_netdev で遅めにマウント
20/23
poweroff
[ 169.345939] systemd-shutdown[1]: Powering off.
[ 169.348326] reboot: Power down
なぜか poweroff をしても上の行までで qemu-
system-riscv64 が終了せずに止まってしまう
C-a x で終了
ホスト側が amd64 の Ubuntu 20.04 だと問題
なし
21/23
困りごと
debian@debian-riscv64:~$ echo 'int main(){return 0;}' | gcc -xc -
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crti.o: mis-matched ISA version 2.0 for 'i' extension, the output version is 2.1
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crti.o: mis-matched ISA version 2.0 for 'a' extension, the output version is 2.1
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crti.o: mis-matched ISA version 2.0 for 'f' extension, the output version is 2.2
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crti.o: mis-matched ISA version 2.0 for 'd' extension, the output version is 2.2
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtbeginS.o: mis-matched ISA version 2.0 for 'i' extension, the output version is 2.1
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtbeginS.o: mis-matched ISA version 2.0 for 'a' extension, the output version is 2.1
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtbeginS.o: mis-matched ISA version 2.0 for 'f' extension, the output version is 2.2
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtbeginS.o: mis-matched ISA version 2.0 for 'd' extension, the output version is 2.2
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtendS.o: mis-matched ISA version 2.0 for 'i' extension, the output version is 2.1
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtendS.o: mis-matched ISA version 2.0 for 'a' extension, the output version is 2.1
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtendS.o: mis-matched ISA version 2.0 for 'f' extension, the output version is 2.2
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtendS.o: mis-matched ISA version 2.0 for 'd' extension, the output version is 2.2
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtn.o: mis-matched ISA version 2.0 for 'i' extension, the output version is 2.1
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtn.o: mis-matched ISA version 2.0 for 'a' extension, the output version is 2.1
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtn.o: mis-matched ISA version 2.0 for 'f' extension, the output version is 2.2
/usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtn.o: mis-matched ISA version 2.0 for 'd' extension, the output version is 2.2
debian@debian-riscv64:~$
なぜかリンクで警告がでる
(/usr/bin/ld: warning: /usr/lib/gcc/
riscv64-linux-gnu/11/crti.o: mis-matched
ISA version 2.0 for 'i' extension, the
output version is 2.1 など)
22/23
まとめ
qemu で riscv64 の Debian 環境が作成できた
cloud-init での初期設定もできた
qemuのvirtfsの共有も使えた
gccで警告がでる (普通に実行するだけで出る
のでそのうち直るはず?)
23/23
Powered by Rabbit 3.0.1

Más contenido relacionado

Similar a qemuのriscv64にDebianを入れてみた

ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよnpsg
 
Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jAkira Yoshiyama
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
サーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみた
サーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみたサーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみた
サーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみたVirtualTech Japan Inc.
 
Yocto bspを作ってみた
Yocto bspを作ってみたYocto bspを作ってみた
Yocto bspを作ってみたwata2ki
 
LTS & ローリングリリース! ― ランキング4位のLinuxディストリビューション openSUSE を Azure で使ってみる
LTS & ローリングリリース! ― ランキング4位のLinuxディストリビューション openSUSE を Azure で使ってみるLTS & ローリングリリース! ― ランキング4位のLinuxディストリビューション openSUSE を Azure で使ってみる
LTS & ローリングリリース! ― ランキング4位のLinuxディストリビューション openSUSE を Azure で使ってみるFuminobu Takeyama
 
OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5Tsukasa Sugiura
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineEtsuji Nakai
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座Masahito Zembutsu
 
Hatochan's Resume 20130216@Koedolug
Hatochan's Resume 20130216@KoedolugHatochan's Resume 20130216@Koedolug
Hatochan's Resume 20130216@KoedolugKentaro Hatori
 
Docker講習会資料
Docker講習会資料Docker講習会資料
Docker講習会資料teruyaono1
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825hiro345
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Masahito Zembutsu
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2Masahide Yamamoto
 
Yocto Project ハンズオン / 参加者用資料
Yocto Project ハンズオン / 参加者用資料Yocto Project ハンズオン / 参加者用資料
Yocto Project ハンズオン / 参加者用資料Nobuhiro Iwamatsu
 
Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Takenori Matsumoto
 

Similar a qemuのriscv64にDebianを入れてみた (20)

ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよ
 
Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 j
 
Openstack+Ceph設定ガイド
Openstack+Ceph設定ガイドOpenstack+Ceph設定ガイド
Openstack+Ceph設定ガイド
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
サーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみた
サーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみたサーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみた
サーバ脆弱性スキャナ Vuls を OpenStack 環境で使ってみた
 
Yocto bspを作ってみた
Yocto bspを作ってみたYocto bspを作ってみた
Yocto bspを作ってみた
 
Ansible2.0と実用例
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
 
LTS & ローリングリリース! ― ランキング4位のLinuxディストリビューション openSUSE を Azure で使ってみる
LTS & ローリングリリース! ― ランキング4位のLinuxディストリビューション openSUSE を Azure で使ってみるLTS & ローリングリリース! ― ランキング4位のLinuxディストリビューション openSUSE を Azure で使ってみる
LTS & ローリングリリース! ― ランキング4位のLinuxディストリビューション openSUSE を Azure で使ってみる
 
OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5OpenCV2.2 Install Guide ver.0.5
OpenCV2.2 Install Guide ver.0.5
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container Engine
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
 
Hatochan's Resume 20130216@Koedolug
Hatochan's Resume 20130216@KoedolugHatochan's Resume 20130216@Koedolug
Hatochan's Resume 20130216@Koedolug
 
Docker講習会資料
Docker講習会資料Docker講習会資料
Docker講習会資料
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2
 
Capistrano
CapistranoCapistrano
Capistrano
 
Yocto Project ハンズオン / 参加者用資料
Yocto Project ハンズオン / 参加者用資料Yocto Project ハンズオン / 参加者用資料
Yocto Project ハンズオン / 参加者用資料
 
Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門Ubuntuで始めるコンテナ技術入門
Ubuntuで始めるコンテナ技術入門
 

Más de Kazuhiro Nishiyama

lilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げたlilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げたKazuhiro Nishiyama
 
小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話Kazuhiro Nishiyama
 
Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告Kazuhiro Nishiyama
 
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdffukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdfKazuhiro Nishiyama
 
rubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdfrubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdfKazuhiro Nishiyama
 
workflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考えるworkflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考えるKazuhiro Nishiyama
 
あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能Kazuhiro Nishiyama
 
Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?Kazuhiro Nishiyama
 
チャットボットのススメ
チャットボットのススメチャットボットのススメ
チャットボットのススメKazuhiro Nishiyama
 
Action Cableで簡易チャットを作ってみた
Action Cableで簡易チャットを作ってみたAction Cableで簡易チャットを作ってみた
Action Cableで簡易チャットを作ってみたKazuhiro Nishiyama
 
最近のrubyのインストール方法
最近のrubyのインストール方法最近のrubyのインストール方法
最近のrubyのインストール方法Kazuhiro Nishiyama
 
systemdでよく使うサブコマンド
systemdでよく使うサブコマンドsystemdでよく使うサブコマンド
systemdでよく使うサブコマンドKazuhiro Nishiyama
 

Más de Kazuhiro Nishiyama (20)

lilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げたlilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げた
 
小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話
 
Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告
 
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdffukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
 
rubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdfrubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdf
 
systemd 再入門
systemd 再入門systemd 再入門
systemd 再入門
 
Ruby 3.0.0 コネタ集
Ruby 3.0.0 コネタ集Ruby 3.0.0 コネタ集
Ruby 3.0.0 コネタ集
 
livedoor天気API終了対応
livedoor天気API終了対応livedoor天気API終了対応
livedoor天気API終了対応
 
Wireguard 実践入門
Wireguard 実践入門Wireguard 実践入門
Wireguard 実践入門
 
workflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考えるworkflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考える
 
あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能
 
Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?
 
チャットボットのススメ
チャットボットのススメチャットボットのススメ
チャットボットのススメ
 
Dokku の紹介
Dokku の紹介Dokku の紹介
Dokku の紹介
 
Action Cableで簡易チャットを作ってみた
Action Cableで簡易チャットを作ってみたAction Cableで簡易チャットを作ってみた
Action Cableで簡易チャットを作ってみた
 
Ruby svn to git
Ruby svn to gitRuby svn to git
Ruby svn to git
 
Ruby 2.6 Update
Ruby 2.6 UpdateRuby 2.6 Update
Ruby 2.6 Update
 
最近のrubyのインストール方法
最近のrubyのインストール方法最近のrubyのインストール方法
最近のrubyのインストール方法
 
Language update 2018 - ruby
Language update 2018 - rubyLanguage update 2018 - ruby
Language update 2018 - ruby
 
systemdでよく使うサブコマンド
systemdでよく使うサブコマンドsystemdでよく使うサブコマンド
systemdでよく使うサブコマンド
 

qemuのriscv64にDebianを入れてみた

  • 2. 自己紹介 西山 和広 Ruby のコミッター twitter, github など: @znz 株式会社Ruby開発 www.ruby-dev.jp 1/23
  • 3. 環境 ホスト側 Ubuntu 21.10 (impish), (Ubuntu 20.04.3 LTS (focal) でも動作確認) QEMU emulator version 6.0.0 (Debian 1:6.0+dfsg-2expubuntu1.1) ゲスト側: Debian GNU/Linux bookworm/sid 2/23
  • 5. chroot で debootstrap sudo apt-get install debootstrap qemu-user-static binfmt-support debian-ports-archive-keyring sudo debootstrap --arch=riscv64 --keyring /usr/share/keyrings/debian-ports-archive-keyring.gpg --include=debian-ports-archive-keyring unstable /tmp/riscv64-chroot http://deb.debian.org/debian-ports ここは Debian Wiki のコマンドそのまま 4/23
  • 6. chroot 環境で事前設定 CHROOT=/tmp/riscv64-chroot sudo chroot "$CHROOT" apt-get update sudo chroot "$CHROOT" apt-get -y install etckeeper sudo chroot "$CHROOT" apt-get -y full-upgrade CHROOT はこの後も利用 etckeeper はいつも入れているのでここでも 入れた 5/23
  • 7. 他の設定 sudo chroot "$CHROOT" ln -sf /dev/null /etc/systemd/system/serial-getty@hvc0.service sudo chroot "$CHROOT" apt-get install -y linux-image-riscv64 u-boot-menu sudo chroot "$CHROOT" apt-get install -y openntpd ntpdate sudo chroot "$CHROOT" sed -i 's/^DAEMON_OPTS="/DAEMON_OPTS="-s /' /etc/default/openntpd printf 'nU_BOOT_PARAMETERS="rw noquiet' ' root=/dev/vda1"nU_BOOT_FDT_DIR="noexist"n' | sudo chroot "$CHROOT" tee -a /etc/default/u-boot sudo chroot "$CHROOT" u-boot-update (ネットワーク設定とパスワード設定は後で) 6/23
  • 8. ネットワーク設定 printf 'auto loniface lo inet loopbackn' | sudo chroot "$CHROOT" tee /etc/network/interfaces.d/lo printf 'auto eth0niface eth0 inet dhcpn' | sudo chroot "$CHROOT" tee /etc/network/interfaces.d/eth0 echo "debian-riscv64" | sudo chroot "$CHROOT" tee /etc/hostname echo "10.0.2.15 debian-riscv64" | sudo chroot "$CHROOT" tee -a /etc/hosts 自動化しやすいように /etc/network/ interfaces は書き換えず interfaces.d に ファイル作成 /etc/hostsにも追加してsudo: unable to resolve host debian-riscv64: Temporary failure in name resolution対策 7/23
  • 9. ユーザー設定 NEW_USER_ID=10001 NEW_USER_NAME=user1 #NEW_USER_PASSWORD=password NEW_USER_CRYPTED_PASSWORD='$6$(略)' sudo chroot "$CHROOT" groupadd -g "$NEW_USER_ID" "$NEW_USER_NAME" sudo chroot "$CHROOT" useradd -d "/home/$NEW_USER_NAME" -m -g "$NEW_USER_NAME" -u "$NEW_USER_ID" -p "$NEW_USER_CRYPTED_PASSWORD" -s /bin/bash "$NEW_USER_NAME" sudo chroot "$CHROOT" apt-get install -y sudo echo "$NEW_USER_NAME ALL=(ALL) NOPASSWD:ALL" | sudo chroot "$CHROOT" tee "/etc/sudoers.d/$NEW_USER_NAME" gid や uid を固定するため groupadd と useradd で個別に追加 useradd の -p は 生パスワードではない sudo の設定も追加 8/23
  • 10. ユーザー設定 (失敗) $ echo "$NEW_USER_NAME:$NEW_USER_PASSWORD" | sudo chroot "$CHROOT" chpasswd chpasswd: (user user1) pam_chauthtok() failed, error: Authentication token manipulation error 仮想環境で弱いパスワードなのでそのまま書 いておきたかったが、chroot 環境では使えな かった 9/23
  • 11. cloud-init sudo chroot "$CHROOT" apt-get -y install cloud-init openssh-server 最終的には cloud-init を入れて、ネットワー ク設定やユーザー設定はそちらに任せること に openssh-server の設定もしてくれる 一緒にインストールしておかないと、 PasswordAuthentication yes だけの /etc/ ssh/sshd_config が作成されてしまっておか しなことに 10/23
  • 12. cloud-initとは 主に EC2 などのクラウド環境での初期設定 ツール LXC/LXD や multipass などでも対応 openssh のホスト鍵の再生成などディスクイ メージの再利用をするときに必要な機能も 入っている 11/23
  • 14. ディスクイメージ作成前の最 後の処理 sudo chroot "$CHROOT" sed -i -e 's/^# (ja_JP.UTF-8)/1/' /etc/locale.gen sudo chroot "$CHROOT" etckeeper commit "Enable ja_JP.UTF-8" sudo chroot "$CHROOT" etckeeper vcs gc sudo chroot "$CHROOT" apt-get clean cloud-initで/etc/locale.genの変更はしてく れないようなので変更しておく 他にもディスクイメージを小さくできる処理 があればしておく 13/23
  • 15. ディスクイメージファイル作 成 sudo apt-get install -y libguestfs-tools sudo virt-make-fs --partition=gpt --type=ext4 --size=10G "$CHROOT"/ "$HOME/riscv64/rootfs.img" sudo chown "$USER" "$HOME/riscv64/rootfs.img" イメージ作成には時間がかかるのでゆっくり 待つ qemu の実行ユーザーで読み書きできるよう にしておく 14/23
  • 16. 実行に必要なものをインス トール sudo apt-get install -y qemu-system-misc sudo apt-get install -y opensbi u-boot-qemu sudo apt-get install -y genisoimage 実行に必要なものをインストール genisoimage は cloud-init の NoCloud データ ソース用 15/23
  • 17. cloud-init用データ作成 #cloud-config ssh_pwauth: true # sshにパスワード認証で入れるようにする chpasswd: list: #- root:debian # rootユーザーも直接使うならパスワードを設定する - debian:debian # debianユーザーはdefaultsで作成されるのでパスワード設定をしておく expire: false manage_etc_hosts: true # sudoに必要 timezone: Asia/Tokyo locale: ja_JP.UTF-8 package_upgrade: true #packages: #- qemu-guest-agent # riscv64 には未対応 mounts: # qemuの共有設定 - [ 'hostshare', '/mnt/hostshare', '9p', 'defaults,nofail,_netdev', '0', '2' ] runcmd: - [ mkdir, '-p', /mnt/hostshare ] - [ mount, '-a' ] 16/23
  • 18. cloud-init用ISOファイル作成 cd "$HOME/riscv64" cat >meta-data <<EOF instance-id: iid-local01 local-hostname: debian-riscv64 EOF genisoimage -output seed.iso -volid cidata -joliet -rock meta-data user-data instance-id が変わるとopensshのホスト鍵の 再作成などの処理が実行されるので適当な固 定値に 17/23
  • 19. 起動 exec qemu-system-riscv64 -nographic -machine virt -m 1.9G -bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.elf -kernel /usr/lib/u-boot/qemu-riscv64_smode/uboot.elf -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.img,format=raw,id=hd0 -drive file=seed.iso,if=virtio -device virtio-net-device,netdev=usernet -netdev user,id=usernet,hostfwd=tcp::22222-:22 -smp cpus=4,sockets=1,cores=4,threads=1 -virtfs local,path=$HOME/share,mount_tag=hostshare,security_model=mapped-xattr -name debian-riscv64 cloud-init用のseed.isoや共有のvirtfsなどは不 要なら省略可能 18/23
  • 20. 接続 ssh -p 22222 debian@localhost 起動して cloud-init での設定が終わるまでし ばらく待ってから接続 19/23
  • 21. 共有ディレクトリ設定 ホストとゲストでファイルのやりとりのため に $HOME/share を共有ディレクトリに設定 ホスト側でパーミッションを 1777 に security_model は https://wiki.qemu.org/ Documentation/9psetup の推奨設定 ゲストで sudo mount -t 9p hostshare /mnt/ hostshare のようにマウント 早すぎるとマウント失敗するので fstab に _netdev で遅めにマウント 20/23
  • 22. poweroff [ 169.345939] systemd-shutdown[1]: Powering off. [ 169.348326] reboot: Power down なぜか poweroff をしても上の行までで qemu- system-riscv64 が終了せずに止まってしまう C-a x で終了 ホスト側が amd64 の Ubuntu 20.04 だと問題 なし 21/23
  • 23. 困りごと debian@debian-riscv64:~$ echo 'int main(){return 0;}' | gcc -xc - /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crti.o: mis-matched ISA version 2.0 for 'i' extension, the output version is 2.1 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crti.o: mis-matched ISA version 2.0 for 'a' extension, the output version is 2.1 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crti.o: mis-matched ISA version 2.0 for 'f' extension, the output version is 2.2 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crti.o: mis-matched ISA version 2.0 for 'd' extension, the output version is 2.2 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtbeginS.o: mis-matched ISA version 2.0 for 'i' extension, the output version is 2.1 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtbeginS.o: mis-matched ISA version 2.0 for 'a' extension, the output version is 2.1 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtbeginS.o: mis-matched ISA version 2.0 for 'f' extension, the output version is 2.2 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtbeginS.o: mis-matched ISA version 2.0 for 'd' extension, the output version is 2.2 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtendS.o: mis-matched ISA version 2.0 for 'i' extension, the output version is 2.1 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtendS.o: mis-matched ISA version 2.0 for 'a' extension, the output version is 2.1 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtendS.o: mis-matched ISA version 2.0 for 'f' extension, the output version is 2.2 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtendS.o: mis-matched ISA version 2.0 for 'd' extension, the output version is 2.2 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtn.o: mis-matched ISA version 2.0 for 'i' extension, the output version is 2.1 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtn.o: mis-matched ISA version 2.0 for 'a' extension, the output version is 2.1 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtn.o: mis-matched ISA version 2.0 for 'f' extension, the output version is 2.2 /usr/bin/ld: warning: /usr/lib/gcc/riscv64-linux-gnu/11/crtn.o: mis-matched ISA version 2.0 for 'd' extension, the output version is 2.2 debian@debian-riscv64:~$ なぜかリンクで警告がでる (/usr/bin/ld: warning: /usr/lib/gcc/ riscv64-linux-gnu/11/crti.o: mis-matched ISA version 2.0 for 'i' extension, the output version is 2.1 など) 22/23
  • 24. まとめ qemu で riscv64 の Debian 環境が作成できた cloud-init での初期設定もできた qemuのvirtfsの共有も使えた gccで警告がでる (普通に実行するだけで出る のでそのうち直るはず?) 23/23 Powered by Rabbit 3.0.1