Windows 10のLinux/Ubuntu互換環境に機能を追加したり、削除したりするには、aptコマンドを使ってパッケージを操作する。
対象OS:Windows 10バージョン1607以降(64bit版のみ)
TIPS「Windows 10のLinux/Ubuntu互換環境でbashを使う」では、Windows 10のバージョン1607(ビルド14393、Anniversary Update)に新たに導入された、Ubuntu互換の実行環境「Windows Subsystem for Linux(WSL)」と「bash(Bourne Again Shell)」のインストール方法について解説した。
このbash環境を利用すると、Linux/Ubuntu向けの「パッケージ」(プログラムのソースコードもしくはバイナリファイルなどを1つにまとめたもの)をそのままインストールして利用できるようになる。ただしパッケージの管理方法(追加や削除などの方法)はLinuxのディストリビューションごとにいくらか異なっているので、少し面倒である。
本TIPSでは、Windows 10のWSL向けのパッケージ管理方法についてまとめておく。
Windows 10のWSLはUbuntuをベースとしたLinux互換環境である。そのUbuntuはDebianディストリビューションから派生したものなので、Debian系のパッケージ管理ツールを利用することになる。
Ubuntuで利用できるパッケージ管理ツールには、「apt(advanced packaging tool)」や「dpkg(Debian's package management system)」「aptitude」など複数ある。このうち、Windows 10のWSL向けのブログや解説記事などではapt-get(aptの、より低レベルなコマンド)を使う例が多く出てくるので、本TIPSでは主にこれを紹介しておく。
dpkgが一番基本となるパッケージ管理ツールである。これを使いやすくしたフロントエンドツールとしてaptが広く利用されている。aptitudeはこれをさらに強化し、CUIだけでなく、GUIの操作画面なども備えたツールとなっているが、その分やや重い。まずはapt-getやaptコマンドを覚えておこう。
パッケージはインターネット上のサーバからダウンロードされるので、対象のPCはインターネットに接続している必要がある。
パッケージを追加するにはsudoというコマンドを使って、apt-getコマンドをroot(管理者)権限で実行する必要がある。だが最初にsudoコマンドを実行しようとすると、次のようなエラーメッセージが表示されることがある。
user01@PC01:~$ sudo
sudo: ホスト PC01 の名前解決ができません ……名前解決できないというエラー
usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
……(以下省略)……
user01@PC01:~$
これは、コンピュータ名からIPアドレスを求めることができないというエラーであり、このメッセージを表示するために非常に長く待たされることになる。
これを避けるためには、コンピュータ名(この例ではPC01)を/etc/hostsというテキストファイルに追加登録すればよい。このファイルの先頭に「127.0.0.1 localhost」という行があるので、この行末にホスト名(と、場合によってはFQDN名)を追加して「127.0.0.1 localhost PC01」のようにする。hostsファイルそのものについては、TIPS「Windowsにおけるhostsとlmhostsの違い」が参考になる。
LinuxやUNIXを使ったことのないユーザーにとっては、どうやってファイルを編集するかは大きな問題かもしれない。通常はvimやvi(これはvimと同じ)エディタを使う。起動するコマンドは「sudo vim /etc/hosts」か「sudo vi /etc/hosts」だ(どちらも同じ)。ルートのパスワードを入力するとroot権限でvimが起動するので、(大文字の)「A」キーを押して行末に追加すればよい。入力が終わったら[Esc]キーで入力モードを終了し、最後に(大文字の)[Z][Z]キーでエディタを終了する。GUIのエディタと比較すると、コマンドモードと文字入力モードが分かれているのが少し面倒かもしれないが、慣れると非常に便利なので、LinuxをCUIで使うなら、ぜひvi/vimを習得しておいていただきたい。
viが使えないならnanoというGUIのエディタも用意されているので、「sudo nano /etc/hosts」として編集してもよいだろう。
インストールするパッケージの索引情報はローカルにキャッシュされている。この情報が自動的に更新されることはなく、デフォルトではWSLをインストールした直後の状態のままである。なので次のapt-get installを実行する前に「apt-get update」で更新しておくとよい。
user01@PC01:~$ sudo apt-get update ……パッケージソース情報の更新
無視 http://archive.ubuntu.com trusty InRelease
取得:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
ヒット http://archive.ubuntu.com trusty Release.gpg
……(中略)……
パッケージリストを読み込んでいます... 完了%
user01@PC01:~$
WSLに新しいパッケージを追加したい場合は、インストールしたいパッケージの名前を引数にして「apt-get install <パッケージ名>」コマンドを実行すればよい。
※Git(バージョン管理ツール)やRubyをインストールする例
user01@PC01:~$ sudo apt-get install git ……Gitのインストール
[sudo] password for user01: ……最初に1回、rootのパスワード入力が必要
パッケージリストを読み込んでいます... 完了0%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了%
以下の特別パッケージがインストールされます:
git-man liberror-perl
……(中略)……
この操作後に追加で 21.9 MB のディスク容量が消費されます。
続行しますか? [Y/n] ……インストールの確認
取得:1 http://archive.ubuntu.com/ubuntu/ trusty/main liberror-perl all 0.17-1.1 [21.1 kB]
……(中略)……
user01@PC01:~$ sudo apt-get install ruby ……rubyのインストール
パッケージリストを読み込んでいます... 完了0%
……(中略)……
user01@PC01:~$
複数のパッケージをインストールしたい場合は、それらを列挙してもよい。
※日本語マニュアルページ(一般コマンド向けと開発者向け)をまとめてインストールする例
user01@PC01:~$ sudo apt-get install manpages-ja manpages-ja-dev ……パッケージを2つまとめてインストールする
パッケージリストを読み込んでいます... 完了0%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了%
以下のパッケージが新たにインストールされます:
manpages-ja manpages-ja-dev
……(中略)……
user01@PC01:~$
既にローカルにインストールされているパッケージ名の一覧をリストにするには、apt-getではなく「dpkg -l <検索パターン>」を使う。また、その中の特定のパッケージのインストール情報を調べるには「dpkg -L <パッケージ名>」を実行する。
user01@PC01:~$ dpkg -l *tools* ……toolsが含まれるパッケージの列挙
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前 バージョン アーキテクチャ 説明
+++-========== ============= - ======== ========-========= =======-==== === ====== ===== =====
un atm-tools <なし> <なし> (説明 (description) がありません)
un console-tools <なし> <なし> (説明 (description) がありません)
ii dosfstools 3.0.26-1ubuntu0. amd64 utilities for making and checking MS-DOS FAT filesys
ii initramfs-tools 0.103ubuntu4.4 all tools for generating an initramfs
……(中略)……
un xen-tools <なし> <なし> (説明 (description) がありません)
user01@PC01:~$ dpkg -L python ……pythonパッケージの詳細情報
/. ……これらのファイルがインストールされる
/usr
/usr/bin
/usr/bin/dh_python2
/usr/lib
/usr/lib/valgrind
……(中略)……
/usr/share/doc/python2.7/python-policy.sgml.gz
user01@PC01:~$
ローカルにパッケージを追加するには、あらかじめインストール可能なパッケージの名前を知っておく必要がある。どのようなパッケージが利用できるかは「apt-cache search <検索語>」で探すことができる。このコマンドを実行すると、ローカルにキャッシュされているパッケージの一覧から該当するパッケージが列挙される。全部検索するには「apt-cache search .」とする。
user01@PC01:~$ apt-cache search compiler ……「compiler」を含むパッケージの検索
antlr - language tool for constructing recognizers, compilers etc
antlr-doc - language tool for constructing recognizers, compilers etc
automoc - automatic moc for Qt 4 packages
binutils-multiarch - Binary utilities that support multi-arch targets
cmake - cross-platform, open-source make system
cmake-dbg - debugging symbols for CMake
cmake-doc - extended documentation in various formats for CMake
……(中略)……
python-clang-3.8 - Clang Python Bindings
user01@PC01:~$
user01@PC01:~$ apt-cache search . | wc ……パッケージの総数は?
47292 380738 3133294 ……4万7292パッケージあった
user01@PC01:~$
各パッケージのより詳細な情報を知りたければ、「apt-cache show <パッケージ名>」を実行する(ローカルにキャッシュされているパッケージの情報が表示される)。
user01@PC01:~$ apt-cache show mono-mcs ……パッケージ情報の詳細
Package: mono-mcs
Priority: optional
Section: devel
Installed-Size: 1807
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Mono Group <pkg-mono-group@lists.alioth.debian.org>
Architecture: all
Source: mono
Version: 3.2.8+dfsg-4ubuntu1.1
……(中略)……
Origin: Ubuntu
Supported: 9m
user01@PC01:~$
ローカルにインストールされている各パッケージの内容(ファイルなど)を、インターネット上からダウンロードしてきた最新版に自動的に更新するには、「apt-get upgrade」コマンドを実行する。
user01@PC01:~$ sudo apt-get upgrade ……パッケージ内容の更新
パッケージリストを読み込んでいます... 完了0%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了%
アップグレードパッケージを検出しています ... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libfreetype6 os-prober
……(中略)……
libc-bin (2.19-0ubuntu6.9) のトリガを処理しています ...
initramfs-tools (0.103ubuntu4.4) のトリガを処理しています ...
user01@PC01:~$
パッケージをローカルから削除するには、「apt-get remove <パッケージ名>」か「apt-get purge <パッケージ名>」(「apt-get remove --purge <パッケージ名>」と同じ)を利用する。前者はパッケージのみを削除、後者はパッケージと、関連する設定ファイルも削除、という違いがある。
user01@PC01:~$ sudo apt-get remove ruby ……パッケージの削除
パッケージリストを読み込んでいます... 完了0%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了%
以下のパッケージは「削除」されます:
libruby1.9.1 ruby ruby1.9.1
……(中略)……
libc-bin (2.19-0ubuntu6.9) のトリガを処理しています ...
man-db (2.6.7.1-1ubuntu1) のトリガを処理しています ...
user01@PC01:~$
user01@PC01:~$ sudo apt-get purge ppp ……設定ファイルごとパッケージを削除する
パッケージリストを読み込んでいます... 完了0%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了%
以下のパッケージは「削除」されます:
ppp* pppconfig* pppoeconf*
……(中略)……
Stopping all PPP connections...done.
ppp (2.4.5-5.1ubuntu2.2) の設定ファイルを削除しています ...
man-db (2.6.7.1-1ubuntu1) のトリガを処理しています ...
user01@PC01:~$
パッケージの追加や削除を繰り返した結果、どのパッケージからも参照されていない、孤立したパッケージが残ってしまうこともある。それらを自動的に見つけて削除(掃除)するには「apt-get autoremove」を利用する。
user01@PC01:~$ sudo apt-get autoremove ……不要なパッケージの自動削除
パッケージリストを読み込んでいます... 完了0%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了%
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
user01@PC01:~$
apt-getやapt-cacheなどを統合して使いやすくしたものとして、「apt」というコマンドも利用できる。「apt install <パッケージ名>」や「apt remove <パッケージ名>」「apt list」など、すべて1つのaptコマンドで実行できるようになっている。
以上、apt-getやapt-cache、dpkgコマンドの使い方を簡単に説明した。より詳しい情報は「man apt-get」や「man apt」などのヘルプを参照していただきたい。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.