1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL2 Gentoo × QEMU で作る Gentoo on LoongArch64 環境

Last updated at Posted at 2025-12-21

こんにちは。Kanade改めK4eと申します。Linuxディストリビューションが好きで現在Linuxディストリビューションを紹介する一人アドベントカレンダーを進めております。(大遅刻気味ですみません...)

LoongArchとは?

さて、突然ですが、「LoongArch」というCPUアーキテクチャをご存じでしょうか。LoongArchは中国の龙芯(Loongson)テクノロジー株式会社が設計したRISC系のCPUアーキテクチャです。ISAを完全に独自のもので、既存のx86やARMなどとの命令セットと非互換になるように開発がされています。これにより中国国外の企業への依存を断ち切った状態で国内をCPUを製造できるようになります。

RISC-Vじゃだめなのか? という尤もな疑問はあるかと思うのですが、LoongArchには実用的な多様な拡張命令があり、拡張性を持たせたコンパクトなRISC-VのISAとは設計思想に大きな違いがあります。

image.png

LoongArch Reference Manual Volume 1: Basic Architectureより引用

LoongArchは上図のようにベースとなる命令セットと4つの拡張命令セットで構成されます。128bitSIMD拡張命令セット(LSX)、256bitSIMD拡張命令セット(LASX)、仮想化拡張命令セット(LVZ)、バイナリ変換命令セット(LBT)がありますが、特筆すべきはバイナリ変換命令です。

LoongArchはx86やARMのような既存のCPU向けにコンパイルされたバイナリをLoongArch向けのバイナリに変換する際使う、専用の拡張命令を持っています。 これによりx86、ARMと非互換でありながら既存のソフトウェア資源を高速に実行することができるという変態的な設計をしています。

Reference Manual Volume 1のcpucfg命令の表記によれば、LBT_X86、LBT_ARM、LBT_MIPSと、x86、ARM、MIPSの3つのアーキテクチャのバイナリ変換を行う拡張があるようです。

現在DebianやOpenSUSE、Arch Linuxと、主要なLinuxディストリビューションのLoongArch移植が精力的に進められています。そんな中で今回はGentoo LinuxというLinuxディストリビューションをLoongArch64仮想マシン上で動かしてみます。

なぜGentooなのか

Gentoo Linuxは、ソースコードからソフトウェアをビルドすることを前提にしたLinuxディストリビューションです。 Portageという優れたビルド管理システムがあり、USEフラグという環境変数を用いて簡単に各パッケージを自分好みにコンパイルすることができます。LinuxディストリビューションというよりPortageを中心とした高性能ビルド環境、といった方が正しいでしょう。公式ページでも「meta-distribution」という言葉でGentooを表しています。ディストリビューションを作るための部品と仕組みを提供するソフトウェア群、といった意味かと思います。

Gentoo LinuxをLoongArchで動かすことができればLoongArchで動く多様なLinuxディストリビューションを開発する基盤となります。しかし、LoongArch上でGentoo Linuxを動かしたという日本語記事がなかったので、実際に動かして試してみよう、というのが今回の主題です。

実際にGentoo Linux stage3の起動まではうまくいきました。起動方法をまとめておきます。

検証環境

今回はWSL2上で動くGentoo上にloongarch64のqemuシステムを構築して、その上でGentooを動かしました。わざわざUbuntuではなくGentooを選んでいるのは、クロスコンパイル環境を作る難易度がGentooの方が低いためです。sys-devel/crossdevというパッケージがあり、これを使うことで簡単にクロスコンパイル環境を構築することができます。

WSL2上でGentooを動かす方法は公式ページにて記載があります。

WSL2へのGentooインストール方法の解説は省略します。

クロスコンパイル環境作成

前述の通り、sys-devel/crossdevパッケージを用いてクロスコンパイル環境を作成していきます。まずインストールしていきます。

emerge --ask sys-devel/crossdev

ホストのリポジトリを汚さないようにcrossdev用のPortageリポジトリを作成します。app-eselect/eselect-repositoryパッケージをインストールします。

emerge --ask app-eselect/eselect-repository

crossdevというローカルPortageリポジトリを作成します。

eselect repository create crossdev

こうするとクロスビルド用のファイルをホストと隔離して管理することができるようになります。

crossdevを用いてクロスコンパイル環境を作成しましょう。

以下のコマンドを使うだけでloongarch64向けのクロスコンパイル環境を作成できます。

crossdev --target loongarch64-unknown-linux-gnu

このコマンドにより、loongarch64向けのgccやg++、ldなどのツールが一通りそろいます。/usr/bin内に大量のシンボリックリンクが張られ、これらのクロスコンパイラを用いることでloongarch64向けのビルドを行うことができるようになります。

ls /usr/bin/loongarch* 実行結果
DESKTOP-TMUKBBC ~ # ls /usr/bin/loongarch*
/usr/bin/loongarch64-unknown-linux-gnu-addr2line  /usr/bin/loongarch64-unknown-linux-gnu-gcc-nm
/usr/bin/loongarch64-unknown-linux-gnu-ar         /usr/bin/loongarch64-unknown-linux-gnu-gcc-ranlib
/usr/bin/loongarch64-unknown-linux-gnu-as         /usr/bin/loongarch64-unknown-linux-gnu-gfortran
/usr/bin/loongarch64-unknown-linux-gnu-c++        /usr/bin/loongarch64-unknown-linux-gnu-gfortran-15
/usr/bin/loongarch64-unknown-linux-gnu-c++-15     /usr/bin/loongarch64-unknown-linux-gnu-gprof
/usr/bin/loongarch64-unknown-linux-gnu-c++filt    /usr/bin/loongarch64-unknown-linux-gnu-ld
/usr/bin/loongarch64-unknown-linux-gnu-cc         /usr/bin/loongarch64-unknown-linux-gnu-ld.bfd
/usr/bin/loongarch64-unknown-linux-gnu-cpp        /usr/bin/loongarch64-unknown-linux-gnu-lto-dump
/usr/bin/loongarch64-unknown-linux-gnu-cpp-15     /usr/bin/loongarch64-unknown-linux-gnu-nm
/usr/bin/loongarch64-unknown-linux-gnu-ebuild     /usr/bin/loongarch64-unknown-linux-gnu-objcopy
/usr/bin/loongarch64-unknown-linux-gnu-elfedit    /usr/bin/loongarch64-unknown-linux-gnu-objdump
/usr/bin/loongarch64-unknown-linux-gnu-emerge     /usr/bin/loongarch64-unknown-linux-gnu-pkg-config
/usr/bin/loongarch64-unknown-linux-gnu-fix-root   /usr/bin/loongarch64-unknown-linux-gnu-ranlib
/usr/bin/loongarch64-unknown-linux-gnu-g++        /usr/bin/loongarch64-unknown-linux-gnu-readelf
/usr/bin/loongarch64-unknown-linux-gnu-g++-15     /usr/bin/loongarch64-unknown-linux-gnu-size
/usr/bin/loongarch64-unknown-linux-gnu-gcc        /usr/bin/loongarch64-unknown-linux-gnu-strings
/usr/bin/loongarch64-unknown-linux-gnu-gcc-15     /usr/bin/loongarch64-unknown-linux-gnu-strip
/usr/bin/loongarch64-unknown-linux-gnu-gcc-ar

これを用いてLinuxカーネルをLoongArch64向けにコンパイルします。

Linuxカーネルのコンパイル

Linuxカーネルをコンパイルします。今回は余計な問題がなさそうなLTSバージョンのv6.12.63カーネルを用います。

wgetでソースコードを持ってきます。

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.63.tar.xz
tar xf linux-6.12.63.tar.xz
cd linux-6.12.63

ARCH、CROSS_COMPILE変数を指定します。

export ARCH=loongarch
export CROSS_COMPILE=loongarch64-unknown-linux-gnu-

これを指定することで/usr/bin/loongarch64-unknown-linux-gnu-*のクロスコンパイラを使用するようになります。

.configファイルを生成します。

make defconfig

コンパイルを始めます。

make -j$(nproc)

コンパイル時にエラーが起きたのでcpioをインストールしました。

emerge --ask app-arch/cpio

コンパイルが終わり、vmlinuxが生成されていれば完成です。

qemu-system-loongarch64の準備

loongarch64のqemu仮想マシンを準備します。qemuのUSEフラグを設定することによりloongarch64向けのビルドを行うことができます。

USEフラグを設定します。nanoなどで/etc/portage/package.use/qemuに以下行を追加します。

app-emulation/qemu slirp seccomp qemu_softmmu_targets_loongarch64 qemu_user_targets_loongarch64

qemu_softmmu_targets_loongarch64とqemu_user_targets_loongarch64が本命です。これらのUSE変数を設定するとUSE_EXPAND変数であるQEMU_SOFTMMU_TARGETSとQEMU_USER_TARGETSにloongarch64が追加されます。slirpはネットワーク用の追加機能、seccompはセキュリティ用の追加機能です。

これを設定したらqemuをインストールします。

emerge --ask app-emulation/qemu

適宜etc-updateを使ってUSE衝突やunmask処理をしてビルドを通します。
終わったら以下のように、コマンドが使えるかどうかを確認します。

DESKTOP-TMUKBBC ~ # qemu-system-loongarch64 --version
QEMU emulator version 10.0.5
Copyright (c) 2003-2025 Fabrice Bellard and the QEMU Project developers

rootfs用disk.img作成

qcow2イメージを作成します。

qemu-img create -f qcow2 disk.img 16G

disk.imgをマウントします。直接のマウントではloop関連のエラーが出たのでnbd経由でマウントを行いました。

modprobe nbd max_part=16
qemu-nbd --connect=/dev/nbd0 disk.img

パーティションを作成します。

まず、etc-updateで調整しながらgptfdiskをインストールします。

emerge --ask sys-apps/gptfdisk

sgdiskでパーティション設定をします。1つパーティションを作ってext4フォーマットしました。

sgdisk --zap-all /dev/nbd0
sgdisk -n 1:0:0 -t 1:8300 -c 1:rootfs /dev/nbd0
partprobe /dev/nbd0
mkfs.ext4 -L rootfs /dev/nbd0p1

stage3の展開

Gentooは公式にloongarch64のstage3ファイルを公開しています。
こちらをダウンロードし、disk.imgに展開します。

stage3は1週間ごとに更新されるので適宜このページからURLを確認してください。

wget https://distfiles.gentoo.org/releases/loong/autobuilds/20251217T161557Z/stage3-loong-systemd-20251217T161557Z.tar.xz

マウントして、展開します。

mkdir -p /mnt/loongroot
mount /dev/nbd0p1 /mnt/loongroot

tar xpf stage3-loong-systemd-*.tar.xz \
  -C /mnt/loongroot \
  --xattrs-include='*.*' \
  --numeric-owner

最低限の設定を行います。

まず、/etc/fstabの設定です。

cat > /mnt/loongroot/etc/fstab << 'EOF'
/dev/vda1  /      ext4  defaults,noatime  0 1
proc       /proc  proc  defaults         0 0
sysfs      /sys   sysfs defaults         0 0
devtmpfs   /dev   devtmpfs defaults      0 0
tmpfs      /tmp   tmpfs  defaults         0 0
EOF

また、シリアルログインの許可を出しておきます。

echo 'ttyS0' > /mnt/loongroot/etc/securetty

qemuで起動

いよいよ起動します。まず-append="init=/bin/sh"として環境に入り、rootパスワードを変更します。

先ほど作成したvmlinuxとdisk.imgはカレントディレクトリにある想定です。適宜パスを変更してください。

qemu-system-loongarch64 \
  -M virt \
  -cpu la464 \
  -m 2G \
  -smp 4 \
  -nographic \
  -kernel vmlinux \
  -append "console=ttyS0 root=/dev/vda1 rw init=/bin/sh" \
  -drive file=disk.img,if=virtio,format=qcow2

こうすると、ログインなしで環境に入ることができます。

sh-5.3# passwd root

でrootパスワードの変更を行ってからCtrl+aとxでqemuを終了させます。

その後

qemu-system-loongarch64 \
  -M virt \
  -cpu la464 \
  -m 2G \
  -smp 4 \
  -nographic \
  -kernel vmlinux \
  -append "console=ttyS0 root=/dev/vda1 rw" \
  -drive file=disk.img,if=virtio,format=qcow2

で実際に環境に入ります。

This is localhost (Linux loongarch64 6.12.63) 14:13:43

localhost login:

という表示が出ればOKです。rootユーザと先ほどのパスワードでログインしましょう。

実際に環境を見てみる

root@localhost ~ # uname -a
Linux localhost 6.12.63 #1 SMP PREEMPT_DYNAMIC Sun Dec 21 03:46:41 JST 2025 loongarch64 GNU/Linux

2025年12月現在最新のv6.12系カーネルが動いていることが確認できます。

/proc/cpuinfo

/proc/cpuinfoを見てみましょう。

root@localhost ~ # cat /proc/cpuinfo
system type             : generic-loongson-machine

processor               : 0
package                 : 0
core                    : 0
global_id               : 0
CPU Family              : Loongson-64bit
Model Name              : Loongson-3A5000
CPU Revision            : 0x10
FPU Revision            : 0x01
CPU MHz                 : 0.00
BogoMIPS                : 0.00
TLB Entries             : 2112
Address Sizes           : 48 bits physical, 48 bits virtual
ISA                     : loongarch32r loongarch32s loongarch64
Features                : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint     : no
出力全体
root@localhost ~ # cat /proc/cpuinfo
system type             : generic-loongson-machine

processor               : 0
package                 : 0
core                    : 0
global_id               : 0
CPU Family              : Loongson-64bit
Model Name              : Loongson-3A5000
CPU Revision            : 0x10
FPU Revision            : 0x01
CPU MHz                 : 0.00
BogoMIPS                : 0.00
TLB Entries             : 2112
Address Sizes           : 48 bits physical, 48 bits virtual
ISA                     : loongarch32r loongarch32s loongarch64
Features                : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint     : no

processor               : 1
package                 : 0
core                    : 3
global_id               : 3
CPU Family              : Loongson-64bit
Model Name              : Loongson-3A5000
CPU Revision            : 0x10
FPU Revision            : 0x01
CPU MHz                 : 0.00
BogoMIPS                : 0.00
TLB Entries             : 2112
Address Sizes           : 48 bits physical, 48 bits virtual
ISA                     : loongarch32r loongarch32s loongarch64
Features                : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint     : no

processor               : 2
package                 : 0
core                    : 2
global_id               : 2
CPU Family              : Loongson-64bit
Model Name              : Loongson-3A5000
CPU Revision            : 0x10
FPU Revision            : 0x01
CPU MHz                 : 0.00
BogoMIPS                : 0.00
TLB Entries             : 2112
Address Sizes           : 48 bits physical, 48 bits virtual
ISA                     : loongarch32r loongarch32s loongarch64
Features                : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint     : no

processor               : 3
package                 : 0
core                    : 1
global_id               : 1
CPU Family              : Loongson-64bit
Model Name              : Loongson-3A5000
CPU Revision            : 0x10
FPU Revision            : 0x01
CPU MHz                 : 0.00
BogoMIPS                : 0.00
TLB Entries             : 2112
Address Sizes           : 48 bits physical, 48 bits virtual
ISA                     : loongarch32r loongarch32s loongarch64
Features                : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint     : no

ちゃんとLoongson-64bit、Loongson-3A5000として認識されています。
PC、サーバ向けの汎用CPUのようです。

lscpu

root@localhost ~ # lscpu
Architecture:                loongarch64
  CPU op-mode(s):            32-bit, 64-bit
  Address sizes:             48 bits physical, 48 bits virtual
  Byte Order:                Little Endian
CPU(s):                      4
  On-line CPU(s) list:       0-3
Model name:                  Loongson-3A5000
  CPU family:                Loongson-64bit
  Model:                     0x10
  Thread(s) per core:        1
  Core(s) per socket:        4
  Socket(s):                 1
  BogoMIPS:                  0.00
  Flags:                     cpucfg lam ual fpu lsx lasx crc32 lspw
Caches (sum of all):
  L1d:                       256 KiB (4 instances)
  L1i:                       256 KiB (4 instances)
  L2:                        1 MiB (4 instances)
  L3:                        16 MiB (1 instance)
NUMA:
  NUMA node(s):              1
  NUMA node0 CPU(s):         0-3
Vulnerabilities:
  Gather data sampling:      Not affected
  Indirect target selection: Not affected
  Itlb multihit:             Not affected
  L1tf:                      Not affected
  Mds:                       Not affected
  Meltdown:                  Not affected
  Mmio stale data:           Not affected
  Reg file data sampling:    Not affected
  Retbleed:                  Not affected
  Spec rstack overflow:      Not affected
  Spec store bypass:         Not affected
  Spectre v1:                Not affected
  Spectre v2:                Not affected
  Srbds:                     Not affected
  Tsa:                       Not affected
  Tsx async abort:           Not affected
  Vmscape:                   Not affected

Flagsの部分に注目してみます。

cpucfg lam ual fpu lsx lasx crc32 lspw

cpucfgの他、並列処理、非aligned memoryアクセス、ハードウェア浮動小数点、SIMD拡張命令(lsx, lasx)などが実装されています。ユーザランド最適化の検証環境として使えそうです。仮想化機能の実装はありません。

残念ながらバイナリ変換命令(LBT)の実装もありません。そもそもドキュメントも見つからないのでどんな命令なのかが調べられない状態です。いったいどんな命令なのか...。

まとめ

今回はqemuを用いてGentoo LinuxをLoongArch64上で動かしてみました。Gentoo Linuxの強みは、stage3の時点でDebianなどの最小構成にはない、build-essentialレベルのビルド機能を持っていることです。そのため、ネットワーク環境すらない今の状態でもコードを書いてビルドし、動作確認まで行うことができます。

次はこの環境を使って大熱血アセンブラのような検証を行いたいと考えています。修論執筆があるのでいつになるかはわかりませんが...。

面白いCPUなので今後の発展に期待です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?