Linuxを再入門する -2022年DevOpsエンジニアロードマップ-
この記事の目次
- 想定読者
- 前提
- 目的
- Linuxの概要
- Linuxディレクトリ構成
- ファイルとディレクトリの権限
- I/Oとリダイレクト
- ネットワーク間のファイルのコピーと転送
- cronによるスケジュールジョブ実行
- パッケージとパッケージマネージャ
- 起動プロセス
- ディスク管理
- ネットワーク
- さいごに
想定読者
このシリーズでは、以下のような方々をターゲットとしています。
- Linuxは知ってるけどよくわかっていない
- 普段業務で触ってはいるもののなんとなくで使っている
- Dockerなど触ってみたもののコマンドの意味がよくわからない
- DevOpsに興味はあるけど、そもそも何から手をつけていいか迷っている
かくいう筆者もまとめながら理解をしている身ですので、誤りなどございましたらご指摘いただけますと幸いです。
前提
2022年DevOpsエンジニアロードマップの2.Understand different OS Conceptで紹介されておりました以下のudemyコースをもとに自分なりに解釈し、調べまとめたものとなります。
Linux系コマンドの紹介については、他にも多くの記事が存在しているように見受けられるため、あまりコマンドについては詳しく記載せず、Linuxの全体像を掴めるような内容となっております。
また、内容が多くなってしまうことが予想されるため、興味のある箇所から読んでいただき問題ありません。
目的
今までアプリケーションエンジニアとして主要言語を使った開発者から、OSやハードウェアの知識を身につけることで運用についても理解を深めるきっかけとなること。
Linuxの概要
Linuxとは、OSの一種です。
OS(Operating System)とはハードウェアリソースやアプリケーションを実行する環境を管理するソフトウェアのことです。
Linuxディストリビューションとは、様々なアプリケーションソフトウェアのコレクションです。もう少し具体的に言うと、LinuxOS上に、webブラウザやEmailクライアントなどのアプリケーションがデフォルトで含まれているパッケージといえます。
RedHat Enterprize Linux(RHEL)やubuntuなどが有名どころです。
このLinuxディストリビューションには、カーネルというものが含まれています。
このカーネルは、いわばLinuxにおけるコアな要素の一つで、カーネル+アプリケーション=ディストリビューションとなります。
Linuxディレクトリ構成
Linuxにおける主なディレクトリを記載しています。
directory | description |
---|---|
/ | ルート、 ファイルディレクトリの最上位階層に位置 |
/bin | バイナリファイルや実行ファイルを格納 |
/etc | システムconfigファイルを格納 |
/home | ホームディレクトリ |
/opt | 3rdパーティソフトウェアを格納。主にOSに付属されていないソフトウェアなどが含まれる |
/tmp | 一時的なファイル格納に使用。一般的なディストリビューションは、再起動時に消えてしまう |
/usr | 各ユーザーが共通して利用するプログラムを格納 |
/var | 多くの場合OSやアプリケーションのログファイルを格納。よく変更がかかるようなファイルなどが置かれる |
/dev | システム管理者や、OSによって制御されているデバイスファイルを格納 |
ファイルとディレクトリの権限
パーミッション
以下のコマンドを入力し、実行するとカレントディレクトリ内のファイルやディレクトリの権限を確認できます。
$ ls -l
このように表示されます。(後半省略)
-rw-rw-r-- 1 jason users ~~~~~~~
この部分の意味について
-rw-rw-r--
冒頭1文字目は、以下の意味となります。
シンボル | タイプ |
---|---|
- | ファイル |
d | ディレクトリ |
| | シンボリックリンク |
2文字目以降は、ユーザー、グループ、その他として3文字を1セットとして表します。
permission | file | directory |
---|---|---|
Read(r) | ファイルの参照が可能 | ディレクトリ内のファイル参照可能 |
Write(w) | ファイルの変更が可能 | ディレクトリ内の変更可能 |
Execute(x) | ファイルの実行が可能 | コンテンツやメタデータのアクセス可能 |
つまり、 こちらの例で言うと、タイプはファイルで、ユーザーはReadWrite権限、グループはReadWrite権限、その他はRead権限を意味します。
-rw-rw-r--
パーミッションの変更
以下の要素を活用し、パーミッションの変更が可能となります。
要素 | 意味 |
---|---|
chmod | Change modeコマンド |
ugoa | User, Group, Other, All |
+-= | 追加、削除、セット |
rww | Read, Write, Execute |
具体的には、このようにしてshellで実行をします。
$ ls -l sample.data
>>> -rw-r--r--
$ chmod g+w sample.data
>>> -rw-rw-r--
$ chmod a=r sample.data
>>> -r--r--r--
気をつける点として、ディレクトリのパーミッションは、そのディレクトリ内のファイルにも影響するため、もしファイルのパーミッションが正しいが、うまく動作しない場合、ディレクトリのパーミッションを確認してみるとよいです。
I/Oとリダイレクト
I/Oとは、Input/Outputのことで、3つのタイプが存在します。
I/O名 | 略称 | ファイルディスクリプタ |
---|---|---|
標準入力 | stdin | 0 |
標準出力 | stdout | 1 |
標準エラー | stderr | 2 |
リダイレクトを活用すると、コマンドの結果表示を画面に出力するのではなく、ファイルに出力することなどができる。上記のI/Oとともに活用することが多いです。
項目 | 意味 |
---|---|
> | ファイルに出力するようリダイレクトする。ファイル内に内容が記載されている場合、上書きされる |
>> | ファイルに出力するようリダイレクトする。ファイル内に内容が記載されている場合、追記する |
< | ファイルからコマンドへリダイレクトする |
& | ファイルディスクリプタが使用されている識別子にリダイレクトする際に使用する |
2>&1 | 標準エラーと標準出力を合わせてリダイレクトする |
2>file | ファイルに標準エラーを出力するようリダイレクトする |
カレントディレクトリでsample.txt
というファイルを作成し、以下のコマンドを順次実行していくと、標準入力・標準出力・標準エラーが確認できます。
$ ls > sample.txt
>>> lsで出力される内容がsample.txtに出力されている
$ ls -l >> sample.txt
>>> ls -lで出力される内容がsample.txtに追記されている
$ aaa > sample.txt 2>&1
>>> -bash: aaa: command not foundが出力されている
ネットワーク間のファイルのコピーと転送
あるLinuxサーバから別のLinuxサーバへファイルをコピー及び転送したい場合は、以下の2種類の方法があります。
- SCP(セキュアコピー)
- SFTP(SSHファイル転送プロトコル)
どちらもセキュアな通信プロトコルであるが、SCPではcpコマンドのような形でファイル転送するのに対して、SFTPではFTPでファイル転送を行う違いが挙げられます。
$ scp ${転送したいファイル} ${転送先}
$ sftp ${host}
cronによるスケジュールジョブ実行
cronを使うことで、定期的にバックグラウンドで実行したい処理などをジョブとして繰り返し実行させることができます。
実際の使い方としては、以下のようになります。
# 毎週月曜午前7時に実行するジョブ
0 7 * * 1 /opt/sales/bin/weekly-report
# 毎日午前2時に実行した情報をログファイルに出力するジョブ
0 2 * * * /root/backupdb > /tmp/db.log 2>&1
# 15分毎に実行するジョブ
0,15,30,45 * * * * /opt/acme/bin/15-min-check
# または
*/15 * * * * /opt/acme/bin/15-min-check
コマンド | 説明 |
---|---|
crontab ${ファイル} | ファイルから新しいジョブを追加 |
crontab -l | 追加されているcronジョブを一覧出力 |
crontab -e | cronジョブを編集 |
crontab -r | cronジョブを削除 |
パッケージとパッケージマネージャ
パッケージとは、アプリケーションを構成するファイルのコレクションのことを指し、データやメタデータ、バージョンや依存関係などの情報が含まれています。
パッケージマネージャは、そのパッケージをインストール/アンインストール、削除など管理します。それに加え、パッケージをインストールする際に必要な依存関係も自動的に管理します。
yum
RHEL7/CentOS7以前を使う場合は、yumコマンドを使うことができます。
コマンド | 説明 |
---|---|
yum search package | パッケージを検索 |
yum info [package] | パッケージの情報を出力 |
yum install [-y] package | パッケージのインストール |
yum remove package | パッケージの削除 |
yum upgrade [package] | パッケージのアップグレード |
dnf
RHEL8/CentOS8以降を使う場合は、dnfコマンドを使うことができます。
コマンド | 説明 |
---|---|
dnf search package | パッケージを検索 |
dnf info [package] | パッケージの情報を出力 |
dnf install [-y] package | パッケージのインストール |
dnf remove package | パッケージの削除 |
dnf upgrade [package] | パッケージのアップグレード |
apt
Debian、Ubuntu、Linux Mint、Kali Linuxなどを使う場合は、aptコマンドを使うことができます。
aptコマンドは、apt-cache
とapt-get
が統合されたようなものになっています。
コマンド | 説明 |
---|---|
apt search package | パッケージを検索 |
apt install [-y] package | パッケージのインストール |
apt remove --purge package | パッケージの完全削除 |
apt upgrade [package] | パッケージのアップグレード |
起動プロセス
LinuxなどのOSを起動させるとき、OSよりも先に起動して、パソコンに接続された周辺機器を制御するソフトウェアが存在します。それを、BIOS(Basic Input/Output System)と呼びます。
CPUやメモリ、ストレージなどの機器が起動時に問題ないかをテストするようになっています。
/boot
ディレクトリにLinuxを起動する際に必要なファイルが含まれています。
また、昨今ではBIOSに代わり、UEFI(Unified Extensible Firmware Interface)と呼ばれる仕様が使用されています。
違いとしては、ディスクのパーティション形式を規定する領域が挙げられます。詳細については、ディスク管理を参照してください。
カーネルログバッファ
Linuxカーネルからのログメッセージが格納されています。
多くのLinuxディストリビューションでは、/var/log/dmesg
ディレクトリに格納されています。
syslog
システムからのメッセージをファイル保存しておく仕組みのことです。
基本的には/var/log
の下にログが格納されています。セキュリティの関係上、root権限でないと読み込むことができない場合が多いです。
syslogサービスとして、rsyslogがLinuxディストリビューションで採用されており、/etc/rsyslog.conf
に設定ファイルが格納されていることが一般的です。
このsyslogには記述ルールが存在し、書式は
# <ファシリティ>.<プライオリティ>となる
mail.*
>>> ファシリティはmail、プライオリティは全てという意
# <ファシリティ>.<プライオリティ>;<ファシリティ>.<プライオリティ>という形でセットでも指定可能
cron.*;auth.*
>>> cronとauthの全てを指定
主なファシリティとプライオリティは以下になります。
ファシリティ
ワード | 説明 |
---|---|
kern | カーネルのメッセージ |
user | ユーザレベルのメッセージ |
メールシステム | |
daemon | デーモンシステム |
auth | セキュリティ/認証のメッセージ |
syslog | syslogdから生成されたメッセージ |
cron | cronからのメッセージ |
local0-7 | 独自設定 |
プライオリティ
ワード | 説明 |
---|---|
emerg | 致命的状態 |
alert | 早急な対処が必要 |
crit | 危険な状態 |
err | 一般的エラー |
warning | 一般的警告 |
notice | 重要な通知 |
info | システムからの情報 |
debug | デバッグ情報 |
none | ファシリティの無効化 ログの除外 |
ディスク管理
パーティション
PCの記憶媒体、HDDやSDDその他メモリスティックなどに設けることができる「しきり」のこと。ひとつの物理ドライブを複数の論理ディスクに分割して扱うことができます。
MBR(Master Boot Record)
BIOSで起動時に、ディスクのパーティション情報などを格納する特殊な領域。およそ2TB以上のパーティションは読み込めないなどの制約があります。
GPT(GUID Partition Table)
MBRの制約を解消するための新たな方式。
UEFIで起動していれば、GPT形式でインストールされます。
ファイルシステム
ファイルシステムとは、ハードディスクなどの記憶装置にあるデータをファイル名・更新日付などの属性データや、ファイルデータ自体を管理するための仕組みです。
Linuxでは、ext2、ext3、ext4など機能の違いにより数多くの種類があります。
マウント
Linuxのディレクトリ構造は、「/」(ルートディレクトリ)から始まるツリー構造になっており、記憶装置をコンピュータへ接続した場合、その記憶装置をこのツリー状のディレクトリ構造のどこかのディレクトリとして機能させます。マウントとは、接続した記憶装置を、このツリー構造のあるポイントへ登録することを指します。
LVM(Logical Volume Manager)
LVMは、ユーザーが扱うパーティションとして、論理ボリュームと呼ばれる単位でパーティションを提供して、物理的なディスクの存在を隠蔽します。その結果、物理的なディスクの増設や変更などがユーザやアプリケーションに対して隠蔽されてディスクデバイスの管理の柔軟性を向上させます。
ネットワーク
IPアドレス
IPアドレスの確認方法。
$ ip address
実行すると色々出力されますが、「lo」はlocalhostloopbackのことであり、動作させているコンピュータ自身のことを指しています。
inet 127.0.0.1/8
などIPアドレスが確認できると思います。
ホスト名
ホスト名の確認方法。
$ hostname
ホスト名とIPアドレスを対応させるためのファイルは/etc/hosts
に以下のような内容で記述されています。
127.0.0.1 localhost
192.168.0.10 webprod01.mycompany.com webprod01
192.168.0.11 webprod02.mycompany.com webprod02
また、名前解決を行う優先順位を指定するファイルが、/etc/nsswitch.conf
に記述されており、
hosts: files dns
という設定であれば、ローカルにあるファイル→DNSサーバへ名前解決を行うという順となります。
DHCP
DHCP(Dynamic Host Configuration Protocol)とは、ネットワーク接続に必要な情報を自動的に割り当てるプロトコルのことです。
DHCPクライアントがDHCPサーバへネットワークの設定情報をリクエストし、レスポンスとしてDHCPサーバがDHCPクライアントに設定情報を割り当てるような構成となっており、設定情報として「IPアドレス」「サブネットマスク」「ゲートウェイ」「DNSサーバ」などが含まれます。
トラブルシューティング
ping
$ ping HOST
$ ping -c COUNT HOST
google.comを例にすると、以下のようになります。
$ ping -c 3 google.com
localhostへpingをしてヘルスチェックをするような使い方ができます。
traceroute
tracerouteは、あるホストから別のホストまでのネットワーク経路をリスト表示するコマンドです。
pingで相手ホストから正常な応答がなかった場合などに、ホスト自身や経路上のルーターのルーティング設定が正しいかどうかを確認するために用いられます。また、経路上のボトルネックを調査するようなことにも役立ちます。
$ traceroute -n google.com
netstat
ホストのネットワーク接続状態やネットワーク統計などを確認するためのコマンドです。
ホストが現在実行している接続一覧とそのステータスを確認できるほか、IPやTCP/UDP以下の各パケット統計やエラー状態なども調査できます。
オプション | 説明 |
---|---|
-n | IPアドレスとポートなど数値のみ表示 |
-i | ネットワークインターフェイスのリストを表示 |
-r | ルートテーブルを表示(-rn) |
-p | プロセスIDとプログラム名を表示 |
-l | listen状態の接続のみ表示(-nlp) |
-t | TCPのみ表示(-ntlp) |
-u | UDPのみ表示(-nulp) |
さいごに
インフラに取り組んだ経験がない中で、DevOpsに取り組もうとすると、どうしても基礎が身についてない状態でなんとなくの理解で進めてしまうこともあり、今一度基礎に立ち返って学び直しました。
同じような境遇の方の理解に少しでも貢献できましたらとても嬉しく思います。
最後までお読みいただきありがとうございました。
Discussion