はじめに
前回の記事で、RISC-V版QEMU上でLinux From Scratch(以下、LFS)を構築しましたが、最低限起動するものを構築しただけなのでネットワーク設定ができていません。
インターネットに繋がっていないとさすがに不便なので、今回はLFS on RISC-Vをインターネットに繋げてみます。
QEMU起動時の設定
QEMUには、ユーザーモードネットワークと呼ばれる、DHCPサーバやDNSサーバを自動的に用意してくれる便利なモードがあります。今回は手っ取り早くユーザーモードネットワークを使用します。
以下のコマンドによりQEMUを起動します。
qemu-system-riscv64 -nographic -machine virt \
-bios opensbi-1.7/build/platform/generic/firmware/fw_jump.bin \
-kernel u-boot-2025.07/u-boot.bin \
-drive file=lfs.img,format=raw,if=virtio -m 16G \
-netdev user,id=net0 -device virtio-net,netdev=net0
ネットワーク設定
LFSの上記ドキュメントに沿ってネットワークを設定していきます。
ネットワークインターフェース名の確認
以下コマンドによりインターフェース名を確認します。
> ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
altname enx525400123456
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
今回はenp0s1がインターフェース名と分かります。
DHCP設定
以下コマンドによりDHCP設定を行います。
cat > /etc/systemd/network/10-eth-dhcp.network << "EOF"
[Match]
Name=enp0s1
[Network]
DHCP=ipv4
[DHCPv4]
UseDomains=true
EOF
ホスト名の設定
以下コマンドによりホスト名を設定します。<lfs>の部分はお好みで変更してください。
echo "<lfs>" > /etc/hostname
/etc/hostsファイルの設定
以下コマンドにより/etc/hostsを設定します。
cat > /etc/hosts << "EOF"
# Begin /etc/hosts
::1 ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# End /etc/hosts
EOF
接続確認
一度QEMUを再起動して、設定を反映させます。
普通ならpingを使って確認したいところですが、デフォルトではユーザーモードネットワークはICMPを遮断するため、pingは疎通しません。ホストの設定を変えることで疎通するようになるので、試してみます。
pingによる接続確認
ホストにて、以下コマンドにより非特権ユーザに対してもpingが疎通するようにします。
sudo sh -c "echo 100 100 > /proc/sys/net/ipv4/ping_group_range"
QEMUを起動し、LFS上でpingを打ってみます。
ping example.com
PING example.com (104.18.26.120): 56 data bytes
64 bytes from 104.18.26.120: icmp_seq=0 ttl=255 time=16.248 ms
64 bytes from 104.18.26.120: icmp_seq=1 ttl=255 time=19.526 ms
64 bytes from 104.18.26.120: icmp_seq=2 ttl=255 time=13.141 ms
64 bytes from 104.18.26.120: icmp_seq=3 ttl=255 time=13.218 ms
^C--- example.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 13.141/15.533/19.526/2.624 ms
無事疎通しました。
telnetによる接続確認
ホスト側の設定を変えなくてもTCPは疎通するので、TCPによる接続確認が可能です。wgetやcurl、lynxを使いたいところですが、LFSのパッケージには含まれません。telnetであれば含まれるので、まずはtelnetで接続確認してみます。
telnet example.com 80
すぐに以下リクエストを入力し送信します(最後の空行も含みます)。
GET / HTTP/1.1
Host: example.com
以下応答が返ってきました。成功です。
HTTP/1.1 200 OK
Date: Tue, 03 Mar 2026 03:57:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
CF-RAY: 9d65b8183de4af3c-NRT
Last-Modified: Wed, 25 Feb 2026 07:20:54 GMT
Allow: GET, HEAD
Accept-Ranges: bytes
Age: 13819
cf-cache-status: HIT
Server: cloudflare
210
<!doctype html><html lang="en"><head><title>Example Domain</title><meta name="viewport" content="width=device-width, initial-scale=1"><style>body{background:#eee;width:60vw;margin:15vh auto;font-family:system-ui,sans-serif}h1{font-size:1.5em}div{opacity:0.8}a:link,a:visited{color:#348}</style></head><body><div><h1>Example Domain</h1><p>This domain is for use in documentation examples without needing permission. Avoid use in operations.</p><p><a href="https://iana.org/domains/example">Learn more</a></p></div></body></html>
0
おわりに
実用的なシステムにするためには、やはりインターネットへの接続は必須です。BLFSで追加のソフトウェアをビルドしたい場合もwgetで容易にパッケージをダウンロードできるようになります(wgetそのものは、ホスト側で事前にダウンロードする必要はあります)。
これで世界が広がりますね。
参考