Ubuntu (WSL2) に Rust 言語の開発環境を構築する手順

プログラミング

この記事では、WSL2 (Windows Subsystem for Linux) 上にインストールした Ubuntu にプログラミング言語「Rust」の開発環境を構築する手順および最終的に「Hello, World!」を出力するところまでを解説します。

環境構築の流れ

  1. Windows に WSL2 をインストールする
  2. WSL に Ubuntu をインストールする
  3. WSL 上の Ubuntu の初期設定&Rust 開発環境をインストールする

Windows に WSL2 をインストールする

このステップが初っ端にして一番大切かつ厄介なところです。

まず最初に注意ですが、Rust の入門書や他のサイトを参考にしてなんとなく WSL を有効にして Ubuntu などをインストールし、

sudo curl https://sh.rustup.rs -sSf | sh

などのコマンドで Rust の環境をインストールしようとすると、cargo のインストールステップで以下のようなエラーが発生してハマる可能性があります。

info: profile set to 'default'
info: default host triple is x86_64-unknown-linux-gnu
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2020-05-07, rust version 1.43.1 (8d69840ab 2020-05-04)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
thread 'main' panicked at 'assertion failed: ``(left == right)``
  left: ``22``,
 right: `4`', src/libstd/sys/unix/thread.rs:166:21
note: run with ``RUST_BACKTRACE=1`` environment variable to display a backtrace.
thread 'main' panicked at 'assertion failed: ``(left == right)``
  left: ``22``,
 right: ``4``', src/libstd/sys/unix/thread.rs:166:21
stack backtrace:
   0:     0x7f90236dbc9c - backtrace::backtrace::libunwind::trace::h65597d255cb1398b
                               at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/libunwind.rs:88
   1:     0x7f90236dbc9c - backtrace::backtrace::trace_unsynchronized::hd4f479d7150ec4a0
                               at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/mod.rs:66
   2:     0x7f90236dbc9c - std::sys_common::backtrace::_print_fmt::h015072984a2b172c
                               at src/libstd/sys_common/backtrace.rs:77
   3:     0x7f90236dbc9c - ::fmt::h6df05d3335f32194
                               at src/libstd/sys_common/backtrace.rs:61
   4:     0x7f90233ba81c - core::fmt::write::h1f444f4312eb6c27
                               at src/libcore/fmt/mod.rs:1028
   5:     0x7f90236db526 - std::io::Write::write_fmt::h8d147888220078ef
                               at src/libstd/io/mod.rs:1412
   6:     0x7f90236db19e - std::sys_common::backtrace::_print::h8a6df0fa81d6af62
                               at src/libstd/sys_common/backtrace.rs:65
   7:     0x7f90236db19e - std::sys_common::backtrace::print::h6f05b4733407e509
                               at src/libstd/sys_common/backtrace.rs:50
   8:     0x7f90236db19e - std::panicking::default_hook::{{closure}}::h0d0a23bd02315dd8
                               at src/libstd/panicking.rs:188
   9:     0x7f90236da943 - std::panicking::default_hook::h8d15a9aecb4efac6
                               at src/libstd/panicking.rs:205
  10:     0x7f90236da943 - std::panicking::rust_panic_with_hook::hbe174577402a475d
                               at src/libstd/panicking.rs:464
  11:     0x7f90236da4be - std::panicking::continue_panic_fmt::h4d855dad868accf3
                               at src/libstd/panicking.rs:373
  12:     0x7f90236da450 - std::panicking::begin_panic_fmt::ha0f013e3301a9528
                               at src/libstd/panicking.rs:328
  13:     0x7f90236aae86 - ::join::hf33124263a81d2a4
  14:     0x7f90236aa636 - core::ptr::real_drop_in_place::haa8255139d9471a2
  15:     0x7f90233d5190 - core::ptr::real_drop_in_place::h04c627b98e68397b
  16:     0x7f902369e777 - rustup::dist::component::package::unpack_without_first_dir::h352b57d236248e9a
  17:     0x7f90236762f6 - rustup::dist::manifestation::Manifestation::update::h8c800deec8167b5b
  18:     0x7f9023664b8a - rustup::dist::dist::try_update_from_dist_::h113375517e7a85ca
  19:     0x7f902364964c - rustup::toolchain::Toolchain::install::h048b51ffab245b48
  20:     0x7f9023646c8c - rustup::toolchain::Toolchain::install_from_dist::h00b9aafeb93470e5
  21:     0x7f90233143ee - rustup_init::self_update::install::h4cee0e396cee456b
  22:     0x7f9023325ca2 - rustup_init::run_rustup_inner::ha545371fd2dc19a6
  23:     0x7f9023322d64 - rustup_init::main::hba9a23e308c96901
  24:     0x7f90232b7a03 - std::rt::lang_start::{{closure}}::h1778d9ce6385bef5
  25:     0x7f902332c458 - main
  26:     0x7f9022f370b3 - __libc_start_main
  27:     0x7f90232b4029 - 
thread panicked while panicking. aborting.
Illegal instruction (core dumped)

僕自身、Rustの入門書を参考にして環境を構築している最中にこのエラーに遭遇したので原因と対処法を調べました。

このエラーは、完全な Linux カーネルを使用していない WSL1 を使用すると発生するもので、完全な Linux カーネルを使用している WSL2 を使用すれば回避できるとのことでした。

そんなわけで、前置きが長くなりましたが、Windows マシンに WSL2 をインストールすることから始めましょう。

以下の公式ガイドを参考に、最終的に WSL2 を規定のバージョンとして使用できるところまで環境の構築を進めましょう。

Windows 10 更新中のウィンドウの画像
Windows 10 更新中のウィンドウ

余談ですが、最新版の Windows 10 への更新には1時間半くらいかかりました。

WSL2 に Ubuntu をインストールする

Microsoft Store から Ubuntu 20.04 LTS をインストールします。

インストールは普通に完了。
起動してみると、第2のエラー「Error : 0x80370102 」が発生しました。

Error : 0x80370102 の対処方法

「Error : 0x80370102 ??????????????????????????」だそうです。
「Press any key」とのことなので、Enter などを押下すると Ubuntu (WSL) が落ちます。

このエラーについては先ほどご紹介したガイドに記載がありました。

インストールがエラー 0x80070003 またはエラー 0x80370102 で失敗した

コンピューターの BIOS 内部で仮想化が有効になっていることを確認してください。 これを行う方法の手順は、コンピューターによって異なりますが、最も可能性が高いのは CPU 関連のオプションの下です。

Windows 10 用 Windows Subsystem for Linux のインストール ガイド

CPU の仮想化オプションなんてとっくの昔に有効にしていたはずなのになぁ?と思いながら BIOS を覗くと、なぜか「Disabled」になっていたので「Enabled」に変更します。

これでもう大丈夫だろうと期待しながら Ubuntu (WSL) を起動すると、第3のエラー「Error : 0xc03a001a」が発生しました。

Error : 0xc03a001a の対処方法

Error : 0xc03a001a ?????????????????????? ??????????????????????????? ?????????

さっきよりハテナが増えています。煽ってきますねぇ。

で、この Error : 0xc03a001aは WSL のフォルダが圧縮対象になっていることが原因らしいので、圧縮対象から外してやれば対処できます。

WSLのフォルダの場所:%localappdata%\Packages
フォルダ名:CanonicalGroupLimited.UbuntuonWindows…以下略

この「Canonical」から始まるフォルダを「右クリック」し、プロパティ→ 詳細設定と進み、「内容を圧縮してディスク領域を節約する」のチェックを外せば OK です。

さあ、今度こそ起動するのか。

起動OK

今度こそエラーが発生せず起動しました!

任意の username と password を入力すればアカウントが作成されます。

この先の説明では、 Windows 10 標準の WSL ターミナルソフトではなく「wsltty (mintty)」という高機能なターミナルソフトを用いて説明をしています。

標準のターミナルでは「右クリック」「Copy」「Paste」などが使用できず、このあとご紹介する長いコマンドなどを全てミスなしで入力しなければなりません。

wsltty (mintty) なら記事上のコードをコピーしてターミナルに Paste することが可能で、作業時間の短縮とミス回避に繋がりますので利用することをお勧めします。

wsltty (mintty) のリリースページ から最新版をダウンロードしてインストールするだけで利用可能です。

Rust 開発環境のインストールの前に、Ubuntu 利用開始時のお決まりの初期設定を行います。

apt 実行時の参照先リポジトリを日本のサーバに変更します。

sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list

続いてアップデートを実行します。

sudo apt update
sudo apt upgrade

Rust 開発環境のインストールと利用準備

curl コマンドで Rust の開発環境のダウンロードとインストールを行います。

sudo curl https://sh.rustup.rs -sSf | sh

Rust 環境を実行します

source $HOME/.cargo/env

下図の2つのコマンドを実行して rustc と cargo のバージョンが表示されれば正常に Rust 環境が実行されています。

問題ないことが確認できたらパスも通しておきましょう。

Rust で Hello, world!

Rust の開発環境が整ったので、いよいよ「Hello, World!」の出力に挑戦です。

ここでは Rust 開発環境の基本的な操作方法やプロジェクトのファイル構造などについての詳細には触れませんので参考書や別のサイトを参考にしてください。

まずはプロジェクトを新規作成します。

cargo new project1

これで「project1」という名称のプロジェクトが作成され、同時に「main.rs」という Rust のソースコードも作成されます。

main.rs には、作成された時点で「Hello, World!」を出力するプログラムが記載されています。

ビルドと同時にプログラムを実行できる「cargo run」を実行します。

cargo run 実行時に「error: linker `cc` not found」エラーが発生した画面
cargo run 実行時に「error: linker `cc` not found」エラーが発生した画面

こういうのって、なかなか一発では上手く行かないんですよね。
error: linker `cc` not found」というエラーが出ました。

error: linker `cc` not found の対処方法

GCC がインストールされていないことが原因なのでインストールしてやれば解決です。

sudo apt install build-essential

そして再度「cargo run」を実行します。

上手くいきました!Hello, world!こんにちは、Rust の世界!!!

おわりに

今回初めて WSL2 に Ubuntu をインストールされた方には「Ubuntu (WSL2) の利用中に出てきた疑問点の解消方法いろいろ」の記事も参考になるかもしれません。