前回に続き、今回は、WSL2で外部ドライブの初期化を行い、Linuxで利用できるようになるまでを解説する。基本的な作業は、Win32側でも可能だが、ファイルシステムの構築などはLinux側で行う必要があるため、すべての作業をWSL側で行うこととした。

表01に、当記事で利用するドライブ初期化に関連した用語を示す。ドライブ、パーティションなどのハードウェア関連の用語は、前々回記事(WSLガイド 第12回 外部ドライブのマウント)を参照されたい。

■表01

なお、以下の記事は、Windows 11 Ver.22H2を使いMicrosoftストア版WSL(1.0.3.0)と、Ubuntuディストリビューション(バージョンは22.04 LTS)で行った。

準備

WSL2でドライブを初期状態に戻すような作業をする場合、「gdisk」コマンドをインストールする必用がある。

WSL2を起動し、以下のコマンドで、ドライブ初期化など必要なツールをインストールしておく。標準状態はディストリビューションによって違うが、すでにインストールしてある場合にはエラー表示が出るのみで状態には問題ない。

sudo apt update

sudo apt install gdisk

上記のコマンドの実行により、gdisk、sgdisk、cgdiskがインストールされる。これらはディスクの初期化などを行うコマンドだ。どれもコンソールウィンドウ内で実行するコマンドラインだが、gdiskは対話形式、sgdiskはコマンドラインのみ、cgdiskは、カーソルキーなどで操作するキャラクタ・ユーザーインターフェース(Cursesベース)である。基本的な機能はほぼ同じだが、コマンドにより実行できる機能が微妙に異なる。各コマンドの詳細はmanページで見ることができる。

ドライブをLinuxで利用可能な状態にする

ここでは、まっさらの状態(物理フォーマットだけが行われた状態)から、Linux用パーティションを作成し、ext4ファイルシステムでフォーマットしてWSL2でマウントするまでの作業を解説する。

実際に使われているハードディスクは、さまざまな状態にある。このため、それぞれのドライブの状態に合わせて作業を開始できるように、全体を

ドライブを初期状態に戻す

ドライブの初期化

パーティションの作成

ファイルシステムの作成(論理フォーマット)

の4つにわけた。この順序で行うので、利用するドライブの状態に合わせて読んでいってほしい。

ドライブを初期状態に戻す

ドライブを初期状態に戻す作業は、すでにパーティションなどが作られているが、これらを全部消して最初からドライブを使えるようにする場合に行う作業だ。具体的には、パーティションテーブルを消去する。

まずは、Win32側で管理者権限によりコンソールを開き、PowerShellで以下のコマンドを実行して、パーティションではなく、ドライブだけをマウントする(コマンドに関しては、詳細は前記の前々回記事参照)。ここではデバイスIDは、〈Win32ドライブ〉だったとする(写真01)。

wsl.exe --mount 〈Win32ドライブ〉 --bare

次にWSL2を起動し、Linux側で作業する。まず、lsblkコマンドを使い、マウントされたドライブを確認する。複数のドライブ名が表示されるが、このうち、“Mount Point”が空欄のものを探す(写真02)。

写真01: Windows PowerShellでディスクドライブを列挙し、外部ドライブのDeviceIDを調べる。これを使って、wsl.exeでマウントを行う。このとき“--bare”オプションを使ってドライブ全体をマウントする。WSLの作業後にまた作業を行うのでコンソールウィンドウはそのままにしておく

写真02: WSL側でlsblkコマンドを使って、外部ドライブに対応するデバイス名を調べる。--bareオプションでマウントしたドライブは、MOUINTPOINTが空欄になり、TYPEは“disk”になる。容量などから外部ドライブをみつけ、先頭にある名前(NAME)の前に“/dev/”を付けたのがドライブのデバイス名になる。これを使ってsgdiskコマンドを“-Z”オプションを付けて実行する

複数ある場合には、マウントしたドライブの容量などから推測する。すでにLinuxパーティションが存在していると、これが認識されて表示されることもある。ここでは、デバイス名が“〈ドライブデバイス名〉”だったとする(具体的には/dev/sd?のような名前になる。以下、各自のシステムに合わせてほしい)。以下のコマンドを使い、ハードディスクを「初期状態」にする。

sudo sgdisk -Z 〈ドライブデバイス名〉

これで、ドライブが「初期状態」となった。

ただし、このコマンドがエラーになる場合もある。sgdiskや後述するgdiskコマンドは、MBR形式からの変換などをサポートしている関係で、MBR形式の情報が中途半端に残っていると、処理がエラーになる場合がある。こうした場合、Win32側のディスク管理を使うと強制的に初期状態に戻すことができる可能性がある。

ドライブの初期化とパーティションの確保

なにも記録されていない初期状態のドライブに対して、「ドライブの初期化」を行いGPT形式のパーティションテーブルを作成する。それには、以下のコマンドを実行する(写真03)。なお、ドライブのデバイス名は/dev/sdcとする。

sudo sgdisk -o 〈ドライブデバイス名〉

初期状態のドライブやGPT形式で正しい状態にあるドライブであれば、このコマンドでドライブの初期化が行われ、GPTが作成される。エラーなどが生じた場合、ドライブが正しい状態にないことがある。Win32側のディスクの管理を使うなどしてドライブ状態を確認したほうがよい。中身が消えても問題がない場合、前述のコマンドでドライブを初期状態に戻してみる、あるいはddコマンドでゼロを上書きすることを検討する。

写真03: 同じくsgdiskコマンドを“-o”オプションとデバイス名を付けて実行すると、GUIDパーティションテーブル(GPT)が作成される

パーティションの作成には、sgdiskコマンドや、コマンド形式のgdiskコマンドを使うことができるが、ここはインタラクティブなテキスト形式を持つcgdiskコマンドを使う。なお、cgdiskは、gdiskコマンドを実行しており、行うことはgdiskコマンドで文字によるコマンドを入力するのと同じである。cgdiskコマンドを起動するには、

sudo cgdisk 〈ドライブデバイス名〉

とする(写真04)。なお、初期化が行われていないドライブでは、警告が表示されるがCtrl+Cキーで何もせずに抜け出すことができ、それ以外のキーを打った場合、ドライブの初期化が行われる。くれぐれもデバイス名の間違いには注意されたい。

写真04: Cursesベースのcgdiskコマンドは、カーソルキーやタブキーで操作が可能なキャラクタベースのユーザーインターフェースを持つ。Newコマンドでパーティションを作成する。全体を1つのパーティションにするのならエンターキーのみで先に進めていく。最後にWriteコマンドを実行してディスクに書き込みを行い、Quitコマンドで抜ける

まだパーティションが作成されていない場合、Newコマンドをカーソルキーで選択してエンターキーを押すと、パーティションの作成が開始される。ここはエンターキーでデフォルト値が選択される。

まずは、先頭セクターの指定だが、エンターキーで先に進む。次は、パーティションサイズをセクター数かサイズで指定する。たとえば、100ギガバイトにしたい場合には100Gと入力する。空き領域すべてをパーティションとする場合には、エンターキーのみで先に進む。

次にパーティションのGUIDを指定するが、これは、gdiskのコードで指定を行う。エンターキーでかまわないが4桁のタイプコードを入れてもかまわない。“L”キーでコードの一覧を表示する。

そして、パーティションラベルの指定だが、これはエンターキーを押して空文字列としてもかまわない。作成が終わると、先頭の空き領域と作成したパーティション(番号が付く)、存在すれば後ろの空き領域が表示される。さらにNでパーティションを追加することも可能で、上下カーソルキーで作成したパーティションを選択してDeleteでパーティションを削除することもできる。

最後にWriteコマンドで、抜けるとパーティションテーブルが更新される。Writeを行わずにQuitで抜けるとパーティションテーブルはそのままになり、cgdiskで行った設定がすべてキャンセルされる。

論理フォーマットを行う

ファイルシステムの作成、あるいは論理フォーマットは、mkfsコマンドで行う。このとき、作成したパーティションのデバイス名を指定する必要がある。その確認にはlsblkコマンドを使う。このとき、先ほどまで扱っていたドライブのデバイス名末尾に数字を持つパーティションが表示されるようになる(写真05)。ここでは、これを〈パーティションデバイス名〉とする。mkfsコマンドは、

sudo mkfs -t ext4 〈パーティションデバイス名〉

である。実行中に確認やファイルシステムに関するメッセージが表示される。

写真05: パーティションを作成したあと、lsblkコマンドを見ると、末尾に数字を持つパーティションのデバイス名が表示される。そのデバイス名を使って、mkfsコマンドを使って論理フォーマットを行う。終わったら、/mntの下に仮にディレクトリ“extdisk1”を作り、マウントしてみる。lsコマンドで“lost+found”ディレクトリが見えたら論理フォーマットが正しく行えたことになる。そのあと作成した“extdisk1”ディレクトリを削除しておく

コマンドの実行が終わったらマウントして状態を確認する。まずは、マウント先となるディレクトリ“/mnt/extdisk1”を作り、そこにマウントを行う。

sudo mkdir /mnt/extdisk1

sudo mount 〈パーティションデバイス名〉␣/mnt/extdisk1

ls -l /mnt/extdisk1

最後のlsコマンドで“lost+found”というディレクトリが表示されれば、これまでの作業は正しく行えている。マウントしたパーティションをアンマウントして後始末を行い、WSLディストリビューションを終了させる。

sudo umount /mnt/extdisk1

sudo rmdir /mnt/extdisk1

作成したパーティションの利用

以後の操作は、前回解説したLinuxパーティションのマウントと同じである(写真06)。作成したパーティションのデバイスIDを取得し、管理者権限でwsl.exeを実行しマウン処理を行う。表02にwsl.exeのマウント関連のオプションを示す。これは、最新版(WSL バージョン: 1.0.0.0)で更新されたものだ。すでに“--partition”や“--bare”は、実際に利用したが、その他にもいくつかオプションがある。

写真06: 管理者権限で起動したWindows PowerShellのコンソールウィンドウに戻り、マウントしたドライブをアンマウントする。その後、パーティション番号を指定して再度マウント処理を行う。WSL2を起動して、lsblkコマンドで作成されたパーティションがマウントされていることを確認する。正しくマウントされていれば、MOUNTPOINTにマウント先ディレクトリが表示される

■表02

“--type”、“--options”は、Linuxディストリビューション側のマウント方法を指定するもの。それぞれmountコマンドの“-t”、“-o”オプションに相当する。これについては、manページを参照してほしい。

次回は、仮想ハードディスクファイルを作り、WSL2にマウントする方法などを解説する予定だ。

>> Windows Subsystem for Linuxガイド 連載バックナンバー

https://news.mynavi.jp/tag/winsubsystem/