この記事では、WSL2 (Windows Subsystem for Linux) 上にインストールした Ubuntu にプログラミング言語「Rust」の開発環境を構築する手順および最終的に「Hello, World!」を出力するところまでを解説します。
環境構築の流れ
- Windows に WSL2 をインストールする
- WSL に Ubuntu をインストールする
- 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 への更新には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」を実行します。
こういうのって、なかなか一発では上手く行かないんですよね。
「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) の利用中に出てきた疑問点の解消方法いろいろ」の記事も参考になるかもしれません。