Linuxの基本とコマンド
最新のクラウド技術を導入、管理、保守するために必要なスキルを身につけるためには、そのテーマに関する前提情報をしっかりと知っておく必要があります。Linux®コマンドとコンセプトです。現代のクラウド技術の多くは、その中核にGNU/Linuxオペレーティングシステムを活用しているため、このチュートリアルでは、Linuxコマンドライン・インターフェース(CLI)のいくつかの基本を説明し、いくつかの記事で作業する際にCLIを使用する準備をします。fa=date%3ADESC&fb=)や、DockerやKubernetesに関するチュートリアルや、初心者向けのKubernetes Learning Pathを読みながら、CLIを使う準備をします。Linuxを初めて使う方は、このチュートリアルが簡単な入門編として役立つはずです。初めての方には、このチュートリアルでいくつかのコマンドのコンセプトを思い出していただき、また、新しいことを知っていただければと思います。
ファイルとディレクトリ¶
最初に、標準的な GNU/Linux オペレーティングシステムの基本的なファイル構造の操作方法を説明します。標準の GNU/Linux オペレーティングシステムには、コンピュータに保存されているデータを整理するファイル管理階層があります。特定のデータが保存されている場所を特定することは、オペレーティングシステムがどのように構成されているかを理解するための最初のレッスンの一つです。ここでは、今までのLinuxの経験を無駄にしないために、「Linuxファイルシステム階層の紹介」については別の機会にします。それよりも、File System Hierarchyについて詳しく説明している記事がありますので、そちらをご覧ください。ここでは、あなたが自分の道を少しは知っていると仮定して、簡単にナビゲートするためのいくつかのヒント(あるいは、いくつかのリマインダー)を提供します。このスキルは、ファイルの編集、ファイルシステムの操作、変更、設定の確認などを求められたときに必要になります。
cd によるディレクトリの変更¶
ターミナルシェルのカレントディレクトリから目的のディレクトリに移動するには、cdコマンドを使用します。このコマンドは、GNU/Linux ファイルシステムのディレクトリ構造を移動する際に非常によく使用されます。構文は以下のとおりです。
[directory]というパラメータは、変更したい目的のディレクトリを指し、このディレクトリへのファイルシステム階層を介したパスは、さまざまな方法で指定できます。
絶対パス¶
絶対パスとは、ルートディレクトリから、ファイルシステムの階層に存在する対象のディレクトリやファイルまでの「完全な経路」のことです。(一般的には / と表記されます)から、目的のディレクトリやファイルまでの、ファイルシステム階層内に存在する「完全な経路」です。 以下に、絶対パスを表示する簡単な例を示します。
ユーザー名がjsmithの場合、標準的なGNU/Linuxオペレーティングシステムでは、彼女のホームディレクトリへの絶対パスは次のようになります。
_クイックヒント:標準的なGNU/Linuxオペレーティング・システムでは、目的のディレクトリを指定せずに、コマンド・プロンプトでcdと入力することで、ホーム・ディレクトリに行くことができます。
上記の例では、対象となるディレクトリへのパスがかなり短くなっていますが、多くの場合、ディレクトリへのパスが非常に長くなることがあります。ここでは、以下のようなファイルシステムの階層構造を利用します。
このディレクトリ構造の場合、pacific_roseファイルの絶対パスは次のようになります。
相対パス¶
GNU/Linux オペレーティングシステムの真の力は、そのコマンドラインインターフェース(CLI)にあります。Linux でタスクを実行する際には、コマンドを入力するために CLI を使用することがよくあります。必要なときに毎回コマンドラインにフルパスを入力するのは面倒ですが、ここでは相対パスがサポートしてくれます。
相対パスとは、現在の作業ディレクトリからの相対的なディレクトリ(またはファイル)へのパスのことです。上の例を見てみましょう。現在の作業ディレクトリが /home/jsmith/grocery_store/foods/produce/ ディレクトリの場合、fruits ディレクトリへの移動は非常に簡単です。
現在の作業ディレクトリには fruits サブディレクトリが含まれているので、上記のコマンドは相対パスを使用しているために動作します。これは、cdコマンドで絶対パスが指定されていない場合に、オペレーティングシステムが行う「仮定」と言ってもよいでしょう。これで、fruitsディレクトリに移動したので、pwdコマンドでこのディレクトリのフルパスを確認することができます。
pwd (print working directory) コマンドは,現在の作業ディレクトリを表示するのに便利ですが,これはしばしば絶対パス形式で表示されます。このように,絶対パスと相対パスを使ってファイルシステムの階層を移動することができます。
チルダの拡張子¶
Bashシェルを搭載した標準的なGNU/Linuxオペレーティングシステムでは、ファイル階層のナビゲーションをより簡単にするために、チルダ拡張が用意されています。チルダ拡張とは何かを説明するために、この例を見てみましょう。
上のコマンドのチルダ ~ は,$HOME 環境変数の値に対応しており,通常は現在のユーザのホームディレクトリに設定されています。つまり,この変数の値は,現在ログインしているユーザに応じて変化します。 同じシステム上で、ジェーン・スミスがcd ~コマンドを実行すると、/home/jsmithディレクトリに移動しますが、マーク・ジョーンズ(ユーザー名mjonesでログインしている)が同じコマンドを実行すると、/home/mjonesディレクトリに移動します。
ここでは、チルダを使った拡張機能の例をいくつか紹介します。
~- $HOME ディレクトリにマップされます。~/grocery_store- $HOME ディレクトリに存在するgrocery_storeサブディレクトリです。~mjones/grocery_store-mjonesユーザーの $HOME ディレクトリに special 存在するgrocery_storeサブディレクトリです。
特別なinode¶
一段と深く掘り下げるために、inodes_について簡単に説明します。Ian D. Allenの定義によると、「Unixでは、ディレクトリやファイルの内容を構成するデータの集まりは名前ではなく、inodeと呼ばれるデータ構造の一部として格納されています」_要するに、ディレクトリやファイルはinode番号に対応する名前であり、ファイルシステムの階層を移動するために使用できる「特別なinode」がいくつか存在しています。以下にその例を示します。
...(ダブルドット)のinodeは、ファイルシステム階層の親ディレクトリ(1つ上のレベル)に変更するために使用できます。
また,..(ダブルドット)のinodeを連結することで,ファイルシステムの階層を複数のレベルで移動することができます。
ここでは、ファイルシステムの階層をfruitsディレクトリからfoodsディレクトリ(2階層上)に移動しています。
また,-(ダッシュ)で前の作業ディレクトリに移動することができます。
あるディレクトリから別のディレクトリに移動してから戻る必要がある場合、-(ダッシュ)を使うと、現在作業しているファイルシステムの階層に関係なく、前の作業ディレクトリに戻ることができます。
pushd/popd によるディレクトリの変更¶
ここで、Linux ユーザーがファイルシステム階層を移動するための第 2 の手段として、pushd、popd、dirsコマンドがあります。これら3つのシェルビルトインを併用することで、最近訪れたディレクトリのリストであるdirectory stackを操作することができます。この最近訪問したディレクトリのリストを保存するために使用されるデータ構造は、まさにスタックまたはLIFO (Last in, First out)データ構造です。pushd はカレントディレクトリを対象となるディレクトリに変更し、この新しいディレクトリをスタックに追加し、popd はスタックの一番上にリストされているディレクトリを削除してから、スタックの一番上にあるディレクトリにディレクトリを変更します。
私の個人的な経験では、pushdとpopdコマンドは、訪問したディレクトリの「パンくずリスト」を作成する方法として、自動化スクリプトで最もよく目にするものです。このリストを利用できるようにしておくと、自動化されたタスクで、特定の方法や順序でファイル(およびディレクトリ)に変更を加える必要がある場合に役立ちます。以前に訪れたディレクトリをスタックから "ポップ "して、簡単に再訪することができます。
dirsコマンドは、私が利用したことのあるコマンドではありませんが、とても便利なコマンドです。このコマンドを使うと、ディレクトリスタック自体を表示して、最近訪れたディレクトリのリストを見ることができます。また、このコマンドにはいくつかのオプションがあり、必要に応じてスタックを「管理」することができます。ここでは、pushd、popd、dirsの各コマンドを使った例を紹介します。
home/jsmith/grocery_store/foods/から出発して、pushdを使ってproduceディレクトリに変更してみます。
現在のカレントディレクトリは /home/jsmith/grocery_store/foods/produce ディレクトリで、pushd を使ってこのディレクトリに移動したので、dirs コマンドで示すように、ディレクトリスタックに追加されています。
ディレクトリのリストは、左から右へ、最近訪れた順に並んでいることに注意してください。もう一度 pushd を使って meats ディレクトリに移動してから、ディレクトリスタックをもう一度見てみましょう。
これで、ディレクトリリストは、最近訪れたディレクトリが3つに増えました。ここで、popdコマンドを使用すると、ディレクトリスタックの一番上にリストされていたディレクトリが削除され、カレントディレクトリは/home/jsmith/grocery_store/foods/produceに戻ります。
また、ディレクトリスタックを見ると、最近アクセスしたディレクトリが2つに減っていることがわかります。
pushd, popd, dirs コマンドで使用できるオプションの一覧については, GNU.org Bash マニュアルの Directory Stack Builtins の章を参照してください.
この先の記事やチュートリアルでは、ディレクトリ構造を簡単にナビゲートすることは、確かに便利なスキルになります。
ディレクトリの作成¶
ナビゲーションについて説明しましたが、次にディレクトリの作成について簡単に説明します。
この例では,[target] は,作成したいディレクトリの名前です。実行すると,mkdirは,(フルパスが指定されていないので)現在の作業ディレクトリにこのディレクトリを作成します。また,フルパスが特定でき,ユーザアカウントに権限があれば,ファイルシステム階層のどのレベルにも新しいディレクトリを作成することができます。例えば、以下のようになります。
これにより、home/jsmith/grocery_store/foods/produceディレクトリの中にveggiesディレクトリが作成されます。ファイルシステムの階層の同じレベルに複数のディレクトリを作成する必要がある場合がよくあります。また、まったく新しいディレクトリ構造を作成しなければならない場合もあります。このような場合には、-pコマンドオプションが非常に便利です。より高度な例を挙げてみましょう。
この例では、いくつかのコンセプトがあります。まず、-pオプションでは、パスに含まれるディレクトリが以前に作成されていてもいなくても、指定された「パス」を作成することができます。括弧を使うことで、複数のディレクトリを同時に作成することができます。ここでは、meatsディレクトリ(事前に作成していない)の中に、beef、fish、chicken、porkのサブディレクトリを作成しています。さらに、porkディレクトリの下に、baconとsausageの2つのサブディレクトリを作成しています。 このように、たった1つのコマンドで全く新しいディレクトリ構造を作ることができるという、コマンドラインの力を実感していただけると思います。
mkdirコマンドの詳細については、mkdirを使ってディレクトリを作成する方法に関するlifewireの記事を参照してください。
ファイルとディレクトリの表示¶
ここまでは、標準的な GNU/Linux オペレーティングシステムでのディレクトリの移動と作成の方法を説明しました。ここでは、ディレクトリの一覧表示、ファイルの表示、編集について説明します。GUI ベースのアプリケーション以外にも、CLI から直接ファイルやディレクトリを表示する方法がいくつかあります。
lsでディレクトリの内容を見る¶
ディレクトリの内容を表示するには、さまざまな方法でlsコマンドを使用できます。コマンドプロンプトでの単純なlsは、現在の作業ディレクトリの内容を(水平方向に)表示します。
よく使われるコマンドオプションもいくつかあります。たとえば,コマンドに-lフラグを追加すると,対象となるディレクトリの内容(ファイル/ディレクトリ名,パーミッション,所有者,修正日,ファイル/ディレクトリサイズなど)が表示されます。
aオプションは、hidden filesを含むディレクトリの内容を表示します。[hidden files]とは、主にデスクトップのカスタマイズやパーソナライズ、アプリケーションの設定などに使用されるファイルです。
lsの既知のコマンドオプション。
これまでに説明してきたlsコマンドのオプションは、最も広く使われているものです。しかし、同じように便利なオプションが他にもいくつかあります。以下に簡単なリストを示します。
| ls commmand| Description|説明
|-------------|-------------|
| ls -lh | -l と -h を組み合わせることで、ファイルやディレクトリのサイズを「人間が読める」形式で表示することができます。|
| ls -F | 出力にリストアップされたサブディレクトリに / を追加します。
| ls -R | サブディレクトリの内容を再帰的にリストアップします。
| ls -r | 出力を逆順に表示します。
| ls -lS | 出力をファイルサイズ順に表示し、最大のファイルを_最初に表示します。
| ls -ltr| -l, -t, -r オプションを組み合わせると、修正日順に出力を表示し、最新のものを_last_に表示します。
cat でファイルを表示する¶
ファイルの内容を見るための最もシンプルなコマンドの一つが cat コマンドです。catは、_"concatatenate"_の略で、ファイルの内容を見るだけでなく、出力をリダイレクトしてファイルを作成するのにも使われます。
ここでは、pacific_roseファイルに「This is a test file.」というテキストが含まれています。cat はこのファイルの内容をターミナルウィンドウに直接表示するので、中身を見るには手っ取り早い方法です。
リダイレクト演算子と組み合わせることで、catを使ってファイルを作成することもできます。
上のコマンドは,現在の作業ディレクトリの中に,granny_smithという名前の新しいファイルを作成します。
前述のとおり、catは_"concatenate"_の略で、上の例では、>リダイレクト演算子を使って、複数のファイルの内容を1つのファイルにまとめる方法を示しています。
また、catコマンドと一緒に使うと便利なコマンドフラグ(またはオプション)の一覧を以下に示します。
cat -nは、ファイル出力の横に行番号を表示します。cat -eは、ファイル出力の中に、行末や行間スペース(通常は$文字を使用)を表示します。cat -Tは、タブ区切りの行をファイルの出力に表示します。
catコマンドの詳しい使い方については、こちらのLINFO article on the cat commandをご覧ください。
ファイルをmore/lessで表示する¶
ターミナルで直接ファイルを表示するには、moreとlessコマンドを使う方法があります。moreとlessの両方とも、ファイルの内容を見ることができ、ファイルの出力が画面のバッファを満たすと一時停止します。ここで一時停止するか、いずれかのキーを押して残りの出力を見て続行するかを選択できます。しかし、lessコマンドは少し違います。moreコマンドと同じ機能でファイルを見ることができますが、lessでは、出力を_backwards_(後方)に移動することができます(moreコマンドでは出力を前方にしか見ることができません)。
端末用テキストエディタ (vim/emacs/pico)¶
Linux を使った学習では、設定ファイルの作成、更新、削除などを行う必要があります。これらの作業は、ほとんどの Linux オペレーティングシステムに搭載されているテキストエディタを使用して行うことができます。以下のようなものがあります。
- vi/vim
- emacs
- pico
それぞれのエディタには、独自の長所、短所、機能があります。どれか一つのエディタを推奨するのではなく、それぞれのエディタのヒントやコツを教えてくれるリソースの短いリストを紹介します。
vi/vim:。 * Learn vim For the Last Time: Tutorial and Primer
emacs. * Absolute Beginners Guide to emacs
pico (ピコ * Basic Pico Commands
ファイルのパーミッション¶
学習パスで学習を進めていくと、ファイルのパーミッションについて理解する必要が出てきます。Linuxユーザーとして、Linuxオペレーティングシステム上に保存されているファイルに対して、ユーザーとして何ができるかを細かく制御することができます。多くの場合、ファイルやディレクトリが機能するためには、特定のレベルのパーミッションが設定されていることが求められます(例えば、スクリプトを実行可能にするなど)。ここでは、ファイルのパーミッションについて簡単に説明します。
このディレクトリ一覧のサンプルでは、ディレクトリに含まれる各ファイルのパーミッションを-rw-r--で表しています。ファイルやディレクトリのパーミッションは,user,group,others(all other)の3つのアカウントロールに対して設定されます。与えることのできる権限は、読み取り(r)、書き込み(w)、実行(x)です。各ファイルにアクセスするアカウントやグループに応じて、パーミッションがどのように適用されるかを、以下の表で説明しています。
「brisket.txt」というファイルのパーミッションを左から右に読むと(最初の-を省略すると)、ファイルのパーミッションは以下のようになります。
| ユーザー | グループ | その他 |
|---|---|---|
| rw (read/write) | r (read) | r (read) |
ファイルやディレクトリへのフルアクセス権限は,rwxと表記されます。この例では,ユーザ jdoe には読み取りと書き込みのパーミッションが,staff グループには読み取りのパーミッションが,その他のすべての人には読み取りのパーミッションが与えられています。 UGO(ユーザー、グループ、その他)の概念を理解するには、こちらのLinuxのファイルパーミッションを知るための記事に目を通しておくと、より深く理解できると思います。
chmodによるパーミッションの変更¶
ファイルに適用されているパーミッションを変更する必要がある場合があります。ここで活躍するのがchmodコマンドです。前述したように、パーミッションを変更することで、bashスクリプトを実行可能にすることができます(つまり、コマンドラインでスクリプト自体を呼び出すことで「実行」できるようになります)。
上の例では、script_to_run.sh にユーザーの +x 属性が追加されています。 これは、このスクリプトが jdoe ユーザーによって "実行可能" になったことを意味します。
上の例では、u(ユーザー)とg(グループ)の両方を使ってchmodコマンドを実行していますが、これは、アカウントの役割を組み合わせて、ファイルのパーミッションを並行して変更することもできることを示しています。また,+文字は実行可能属性を付加し,反対に-文字はそれを除去します。
ご覧のように、chmodは必要に応じてファイルのパーミッションを微調整するのにとても便利なコマンドです。
Dockerの基本コマンド¶
ここでは、標準的なGNU/Linuxオペレーティングシステムを使用しながら、ファイルシステムのナビゲーション、ファイルやディレクトリの表示と作成、ターミナルシェルのカスタマイズを始めるためのコマンドラインの例を一通り説明しました。しかし、このチュートリアルは、より高度なDocker、Kubernetes、Istioのチュートリアルやコードパターンを掘り下げるための入門編としての意味合いが強いので、まずは簡単にいくつかのDockerコマンドを列挙してみましょう。
Dockerイメージの構築¶
| コマンド | 説明 |
|---|---|
docker images |
ローカルに保存されているイメージを一覧表示します。 |
docker rmi [IMG] |
ローカルイメージリポジトリから [IMG] イメージを削除します |
docker build -t [TAG] . |
現在の作業ディレクトリにあるDockerfileからDockerイメージをビルドし、[TAG]というタグをつける |
Docker イメージの実行¶
| コマンド | 説明 |
|---|---|
docker run --name [CNT] |
コンテナを実行し、[CNT]という名前を付けます。 |
docker run -it |
コンテナのターミナルセッションにアタッチします。 |
docker rm -f $(docker ps -aq) |
すべてのコンテナを削除する |
docker ps |
実行中のコンテナをリストアップする |
Docker イメージの出荷¶
| コマンド | 説明 |
|---|---|
docker pull |
コンテナレジストリからイメージをプルする |
docker push [IMG] |
[IMG]という名前のイメージをレジストリにプッシュする |
Kubernetesの基本コマンド¶
さて、ここまでDockerの基本的なコマンドをいくつか紹介してきましたが、ここからはKubernetesの便利なコマンドを紹介します。Kubernetesでは、Kubernetesクラスタに対してコマンドを実行するためのコマンドラインインターフェイスツールであるkubectlを採用しています。以下では、Kubernetesのデプロイメントを更新したり、データを抽出したりするために頻繁に使用されるコマンドの短いリストを紹介します。
Kubernetesリソースのリストアップ¶
| コマンド | 説明 |
|---|---|
kubectl get services |
現在の名前空間内のすべての kubernetes サービスを一覧表示します。 |
kubectl get pods --all-namespaces |
all 名前空間内のすべてのポッドをリストアップする。 |
kubectl get pods -o wide |
現在のネームスペースから、より詳細なポッドの出力を生成する |
kubectl describe nodes [node-name] |
ノード [node-name] についての簡単な説明を表示します。 |
kubectl describe pods [pod-name] |
ポッド [pod-name] の簡単な説明を表示します。 |
Kubernetesのリソースを操作する¶
| コマンド | 説明 |
|---|---|
kubectl create deployment foo --image=foo |
foo のインスタンスを 1 つデプロイします。 |
kubectl create -f ./local-manifest.yaml |
local-manifest.yaml という名前のKubernetesマニフェストファイルを介してリソースを作成します。 |
kubectl delete -f ./bar.json |
bar.json という名前のファイルで定義されているポッドを削除します。 |
kubectl delete pod,service silver gold |
silver と gold という名前のすべてのポッドとサービスを削除します。 |
kubectlコマンドの一覧については、https://kubernetes.io/docs/reference/kubectl/cheatsheet/。
まとめ¶
このチュートリアルは、Docker、Kubernetes、Istioなどのコンテナ技術について学び続ける際の「氷を割る」ような、コマンドラインのウォーミングアップとしての役割を果たすことを目的としています。新しい技術を習得する前に基本を再確認することは有意義なことです。このチュートリアルで取り上げたトピックが、皆さんの記憶を呼び覚ましたり、何か新しいことを習得するのに役立つことを願っています。
次のステップ¶
このチュートリアルを終えたら、Kubernetes Learning Pathの次のステップを確認してください。また、コンテナを使ってみたいと思ったら、以下のリソースやコードパターンもチェックしてみてください。