20210304のLinuxに関する記事は4件です。

【ペチオブ】仮想環境ハンズオン 第1回 Linuxの基礎編

ペチオブとは

隔週の木曜日に開催されているPHPエンジニア向けのコミュニティです。
(現在はオンラインのみで、YouTube撮影等の活動を行ってます)
PHPでお困りの方はお気軽にSlackにてご質問ください。(connpass内に招待リンクがあります)

今回の仮想環境ハンズオンは去年の2020年4月にオフラインのハンズオンイベントとして公開する予定でした。
しかし某コロナの影響で延期が続き、当イベントは没になる予定でしたが、主催の @hirodragon さんからせっかくだからYouTubeでオンラインで公開しよう!という話になり2020年12月から翌年2月にかけて動画撮影しました。

対象者、目的

プログラミング初心者、ウェブエンジニアに向けてVirtualBox, Vagrant, Docker, Docker Composeを使って同様の仮想環境を構築して、どういった違いがあるのかを体験してもらうためのハンズオン記事です。

環境構築を始めるにはLinuxの知識が必要不可欠です。
ということで今回はLinuxの基本を解説します。

YouTube版 【ペチオブ】仮想環境ハンズオン 第1回 Linuxの基礎編

【ペチオブ】エンジニアのための仮想環境ハンズオン 第1回 Linuxの基礎編

※初めてのYouTubeで恥ずかしいので見なくても大丈夫です..。

シリーズ記事

  1. Linux基礎編
  2. VirtualBoxハンズオン(近日公開予定)
  3. Vagrantハンズオン(近日公開予定)
  4. Docker ハンズオン(近日公開予定)
  5. Docker Composeハンズオン(近日公開予定)

OS とは

Operating System (オペレーティングシステム) の略。
システム全体を管理するソフトウェアのこと。

  • 1960年代に誕生
  • OSが通訳となりアプリケーションを実行
  • メモリやCPUの違い等をOSが吸収してくれている
  • Windows, macOS, UNIX, Linux ...

Linux とは

Tux

  • 1991年にリーナス・トーバルズが開発したOS
  • UNIX互換OSの一つ
  • 主にサーバー用途に使用される
  • オープンソースのため無料で利用できる
    • 無料なのでサーバーとして用いられることが多い
  • LinuxにはLinuxカーネルとLinuxディストリビューションの意味がある

リーナス・トーバルズ

Linux カーネル

OSの中核部分としてハードウェアとソフトウェアの仲立ちをしてくれます。
ハードウェアといえばCPU、メモリ、ハードディスク等がありますが、アプリケーションが直接操作するのではなく、カーネルを経由して操作します。

Linux カーネル

シェルとは

シェルはユーザーから入力されたコマンドを解釈し、それをカーネルに伝えます。
カーネルはシェルから伝達された要求に応えてプログラムの操作を行い、その結果をシェルに返します。

ユーザーがターミナルにコマンドを入力 => シェル => カーネル => シェル => ターミナルに実行結果を出力

Linux ディストリビューション

配布している企業や団体がたくさんあり、
それぞれがLinuxカーネルにソフトウェアを追加したり、独自の設定や構成で配布しています。
その配布形式のことをディストリビューションといいます。

Red Hat Enterprise Linux (RHEL), Debian, CentOS, Ubuntu...たくさん種類があります。

Linux ディストリビューション
Linux 派生図

すべては紹介しきれないので、特に使われるOSをピックアップして紹介します。

RedHat

RedHat

商用として一番しっかりしていて、有名なLinuxOS
しかし、料金が高い。
しかもサーバーは普通のサービスでも最低で3台は必要なので結構な金額になる。

Debian

Debian

Linux界隈ではもっとも規模の大きいコミュニティがある。
商用ならRedHat。コミュニティなら 「Debian」 と言われている。
安定しており、堅実な作りをしている。

Ubuntu

Ubuntu

「Debian」ベースに作られたOS。無料。
Debian と比べて、先進的でリリースも早い。
Ubuntuは「誰にでも使いやすい最新かつ安定したOS」と掲げている
Linuxはもっと普通の人にも使えるものにできる、という思想が見えるのがUbuntu。実際とても使いやすくて、Windowsの代わりとして使えるようなOSになっている。

CentOS

CentOS

RedHat をベースに作成されたOS。無料。
2019年にCentOS8が出て、徐々にCentOS7からCentOS8に移行され始めている。

CentOS7までパッケージ管理ツールが yum でしたが、
メンテナンス性が低かったり、Python2に依存していてPython3移行の妨げになっていたため dnf に変更となりました。
環境構築する際は古い記事を参照しないように注意が必要です。

CentOSは 「コミュニティによるエンタープライス級のOS」と掲げている
商用で使える圧倒的高品質のOSを目指すという意味。

2021.03.04 追記

CentOS Project shifts focus to CentOS Stream

この記事を執筆した当初(2021.04)はCentOSが終了するとは夢にも思わず...
今後はUbuntuやDebianが主流になってくるのかなと思います。

また、CentOS終了に伴いRedHatの一部が無償化するらしいです。

Alpine Linux

Alpine Linux

組み込み系でよく使われているBusyBoxとmuslをベースにしたLinuxディストリビューション。
コンテナに必要なサイズは8MB以下であり、ディスクへの最小インストールは約130MBと非常に軽量なため、Dockerでも人気のOSです。

bashシェルも用意されていないため、Linuxに慣れていないと構築の難易度が上がります。

補足: Linux プロンプト

ターミナルにコマンドを入力する際、左側に表示されている文字を「プロンプト」と呼ばれます。

  • prompt(促す)
vagrant@ubuntu-focal:~$ 

ユーザー名@パソコン名:現在の作業ディレクトリ$ という情報を表示しています。
OSによって表示形式が異なることもありますが、プロンプトの表示形式は変更可能です。

また、root権限で実行されている場合、 $ の部分が # と表示されます。
この場合は特に注意してコマンドを実行してください。

Linux コマンド

POSIX(Portable Operating System Interface for UNIX)という「UNIX系OSが備えるべき」とされる仕様の標準規格が定められています。

基本的なLinuxコマンドを覚えてしまえばすべてのUNIX互換OSで使えます。

command 名称 説明
man manual マニュアル
echo 文字列や数値、変数を表示
cd change directory ディレクトリ移動
pwd print working directory 作業中ディレクトリ表示
mkdir make directory ディレクトリ作成
ls list リスト
cp copy コピー(複製)
rm remove 削除
mv move 移動
chown change owner 所有者情報を変更
chmod change mode ファイルパーミッション変更
cat catenate / concatenate ファイルの閲覧, 結合
tail ファイルの末尾を表示する
vim Linuxエディタ
find ファイルを検索
grep globally search a regular expression and print ファイル中の探したい文字を検索
sudo substitute user do, superuser do root権限で実行

Linux コマンド リダイレクト

主に標準出力をファイルへ出力したいときに使用されます。

$ echo Hello $USER
Hello ucan

echo コマンドを実行すると文字列や環境変数が展開されて端末に表示されます。
これを端末ではなくファイルなどに出力したいときにリダイレクトします。

$ echo Hello $USER > test.txt
$ cat test.txt

> はファイルを上書きする

$ echo Goodbye >> test.txt
$ cat test.txt

>> はファイルに追記する

$ ls -l > test.txt
$ cat test.txt

ls -l の実行結果が test.txt へ上書きされて出力されています。

Linux エディタ(vim)

$ vim ファイル名
  • vim sample.txt でファイルを開けます。
  • i で挿入モード(insert mode)になり、テキスト入力行えます。
  • Esc でコマンドモードになります、困ったら Esc 連打する。
    • :wq で保存してvimから抜けます。
    • :w 保存します。
    • :q! 保存せず、強制的にvimから抜けます。

vim操作は覚えておいて損はないので、ぜひマスターしてみましょう!
vim入門

コマンド 説明
i 挿入モード
escキー 挿入モード解除
dd 1行削除
u 直前の変更操作の取り消し
/ 検索
1G 文頭へ
G 文末へ
:q 終了キー(保存せずに終了)
:q! 終了キー(変更した行も保存せずに終了)
:w 保存するが終了しない
:wq 保存して終了

Linux ディレクトリ構造

ディレクトリ 説明
/ ルートディレクトリ。全ての始まり。
/bin cpやchmodなどのシステムを管理する上で基本コマンドが入っています。
/etc システム全体に関わる設定ファイルが配置されます。
/home 一般ユーザーのホームディレクトリ。通常ユーザーを追加するごとにユーザー名のディレクトリを追加します。
/root rootユーザーのホームディレクトリ。homeがセキュリティ上の脅威にさらされてもこちらは大丈夫。という保険のディレクトリです。
/sbin 再起動やファイルシステムの操作などシステム管理者用のコマンドが配置されています。/bin同様、新しいコマンドの追加や変更は推奨されません。shutdown、rebootなど
/tmp 一時ファイル置場
/usr 各ユーザーが共通して利用するプログラム・ライブラリのデータ。ソースからコンパイルしたソフトなどはこちらにインストールされます。通常パッケージの追加するこのディレクトリにインストールされることが多い。etcに保存されている設定ファイルのシンボルリンクもこちらに貼られることが多い。
/usr/bin usr版のコマンドが保存されている。一般ユーザーの利用するコマンド。別名ユーザーコマンドの保存場所。プログラムのインストールによって追加する場合はこのディレクトリが適している。openssl、php、perlなど
/usr/local システム管理者用のローカルファイル。管理者のみが利用するライブラリなどの追加に利用する。
/usr/sbin usr版管理者用コマンド。
/var 可変なファイル群。内容が常に変化するようなファイル群を格納する。例えば、ログ、スプール、一時的電子メールファイル
/var/log システム管理者御用達ログファイルの保存場所。システム、メール、インターネットのアクセスログなど、あらゆるログが保存される。
/var/www Apacheのデフォルトデータ保存場所。インターネット関連のディレクトリはここに収めるのが一般的

Linux パッケージ管理システム

パッケージとは、実行プログラム、設定ファイル、ドキュメントなどを1つのファイルにまとめたものです。
パッケージ管理システムは、パッケージのインストール、アンインストール、アップデート作業において、パッケージ間の依存関係や競合関係を管理する仕組みを提供しているツールです。

ディストリビューション コマンド
RedHat系 yum,dnf
Debian系 apt-get,apt
Mac brew

サービス起動と終了

# /etc/init.d/サービス名 start
# /etc/init.d/サービス名 stop

or

# service サービス名 start
# service サービス名 stop

or

# systemctl start サービス名
# systemctl stop サービス名

OSによってサービスの起動方法が異なる場合がありますが、
この3つのいずれかの方法になります。

ウェブシステムの構成

主なサーバー

  • ウェブサーバー
    • Apache, nginx
  • アプリケーションサーバー
    • php-fpm
    • Apache(mod_php)
  • データベースサーバー
    • MySQL
    • MariaDB
    • PostgreSQL

よく使われるウェブ、アプリケーション、データベースの三層構造のサーバ構成です。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LinuxとPythonでBDAを取得する

Linux と Python で Bluetooth Device Address を取得するときのメモ。

import dbus

BLUEZ_SERVICE_NAME = 'org.bluez'
DBUS_OM_IFACE = 'org.freedesktop.DBus.ObjectManager'
DBUS_PROP_IFACE = 'org.freedesktop.DBus.Properties'


bus = dbus.SystemBus()
adapter = dbus.Interface(bus.get_object(BLUEZ_SERVICE_NAME, '/org/bluez/hci0'),
                    DBUS_PROP_IFACE)
addr = adapter.Get("org.bluez.Adapter1", "Address")
print(addr)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ssh ポートフォワード まとめ

多段ssh ポートフォワード の設定

$ ssh -f -N -L 29017:localhost:29017 -i ~/.ssh/id_rsa -4 root@11:11:11:11 -o ProxyCommand='ssh user@222.222.222.222 -W %h:%p' -A

このコマンドで設定されるのは、 localhostの 29017ポートへのアクセスを 222.222.222.222サーバーを経由して11.11.11.11サーバーのlocalhostの29017ポートへと転送する。

configファイルを使ってssh ポートフォワード

CI上でsshポートフォワードを行う際には、-tオプションが必要であるようだ。
gitlab-runnerを使用した際には、不思議なことに -t オプションが2つ必要であった。

terminal
ssh -t -t tep_overseas_db -f -N

以下のconfigファイルの設定をもとに上のsshコマンドを実行すると、はじめに解説したsshポートフォワード と同様の設定ができる。

Host tep_overseas_step
  HostName 222.222.222.222
  User deployer
  LocalForward 29017 localhost:29017
  ForwardAgent yes
  IdentityFile ~/.ssh/id_rsa

Host tep_overseas_db
  HostName 11.11.11.11
  User root
  LocalForward 29017 localhost:29017
  ProxyCommand ssh -W %h:%p tep_overseas_step
  ForwardAgent yes
  IdentityFile ~/.ssh/id_rsa
  AddressFamily inet

sshコマンドのオプション

オプション 意味
-L ローカルのポートを指定するときに必要
-f ssh 先でコマンドを実行したあとに, バックグラウンドへと潜るオプション
-N ssh 先でなんのコマンドも実行しないオプション
-t 仮想端末を割り当てるオプション(CIでsshを実行する際などに必要)
-i 秘密鍵のパスを指定するオプション
-A ssh接続する際に、リモートサーバーに秘密鍵を転送する
-4 ipv4だけを使用する際に必要

その他のオプションは以下を参照

ssh オプション

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

systemdによる電源管理下で, SSH接続中のユーザーがいるときにスリープさせない

systemdが動いている一般的なLinuxで, SSH接続しているユーザーが存在するときにスリープ (サスペンド, ハイバネート) させない方法です.

systemdが標準で入っている昨今のLinuxディストーション (Ubuntuとか) であれば, 適用可能です. ただ, デスクトップ向けにセットアップしたLinuxマシンでもなければ, サスペンド/ハイバネートといった設定はしないので, ややニッチな話題です.

背景

デスクトップ用途で稼働させているLinuxの場合, 省電力のための設定を有効にしておくことが多いかと思います (操作が行われないまま一定時間経過したら, サスペンド/ハイバネートさせるとか).

書斎にあるLinuxがインストールされたデスクトップPCへ, リビングのノートパソコンからちょっとした用事があるときにSSH接続することがありますが, ここが問題. そういったSSH接続しての作業中は無操作状態とみなされて, 時間がきたらサスペンドされてしまうのです.

横着せずに省電力設定を止めるなりすればいいだけのことですが, ここはsystemdらしいアプローチでの解決方法をとってみました.

確認に使った環境

Archlinuxで動作確認しています. デスクトップ環境はGNOMEで, GNOME標準の設定画面から省電力設定をおこなってます.
systemdが入っている昨今のほとんどのLinuxディストリビューションなら同じことができるはず.

やりかた

次のようなファイルを作成します. systemdのユニットファイルと呼ばれるものです.
作るディレクトリは記載の通り /etc/systemd/system.

[kosuke@cf-sx1 ~]$ cat /etc/systemd/system/inhibit-sleep.service
[Unit]
Description=Inhibit sleep when ssh logged
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c '! who | grep -q "(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\})"'

[Install]
RequiredBy=sleep.target

スリープフックと呼ばれるもので, スリープ (サスペンド, ハイバネート) する前にExecStartで指定したコマンドが実行されるようになります.
whoコマンドSSHログイン中のユーザーがいないかチェックして, もしいたら終了コード0以外にして後続処理を動かさないことで実現します.

ファイルを作成したら, 次のコマンドでユニットを有効にします.

# systemctl enable inhibit-sleep.service

これで準備OKです.

動作確認してみる

対象のマシンは20分でサスペンドするように設定されています.

動作確認したあとのログを見てみましょう.

[kosuke@cf-sx1 ~]$ journalctl -f -usleep.target
-- Journal begins at Fri 2020-07-24 20:13:01 JST. --
 3月 03 23:06:33 cf-sx1 systemd[1]: Reached target Sleep.
 3月 03 23:06:45 cf-sx1 systemd[1]: Stopped target Sleep.
 3月 03 23:07:18 cf-sx1 systemd[1]: Dependency failed for Sleep.
 3月 03 23:07:18 cf-sx1 systemd[1]: sleep.target: Job sleep.target/start failed with result 'dependency'.
 3月 03 23:28:38 cf-sx1 systemd[1]: Dependency failed for Sleep.
 3月 03 23:28:38 cf-sx1 systemd[1]: sleep.target: Job sleep.target/start failed with result 'dependency'.
 3月 03 23:48:39 cf-sx1 systemd[1]: Reached target Sleep.
 3月 03 23:49:14 cf-sx1 systemd[1]: Stopped target Sleep.

これだけだとわからないので, 少しずつ説明してみます.

これは設定を入れた後にSSHログインユーザーがいない状態でサスペンドコマンド systemctl suspend でサスペンドさせてみた結果です.
Reached でサスペンド, Stopped で復帰です.

 3月 03 23:06:33 cf-sx1 systemd[1]: Reached target Sleep.
 3月 03 23:06:45 cf-sx1 systemd[1]: Stopped target Sleep.

次にSSHでログインしているユーザーがいるときに, 同じコマンドでサスペンドを試みます. すると, sleep.targetに依存させるよう追加/設定した前述のユニットファイルが失敗するので, スリープも実行されなくなります.

 3月 03 23:07:18 cf-sx1 systemd[1]: Dependency failed for Sleep.
 3月 03 23:07:18 cf-sx1 systemd[1]: sleep.target: Job sleep.target/start failed with result 'dependency'.

このまま20分ほど放置……. ここでも同じようにスリープされません.

 3月 03 23:28:38 cf-sx1 systemd[1]: Dependency failed for Sleep.
 3月 03 23:28:38 cf-sx1 systemd[1]: sleep.target: Job sleep.target/start failed with result 'dependency'.

ここでSSH接続しているユーザーをログアウトさせます. さらに20分ほど経過すると, 今度はサスペンドされました.

 3月 03 23:48:39 cf-sx1 systemd[1]: Reached target Sleep.
 3月 03 23:49:14 cf-sx1 systemd[1]: Stopped target Sleep.

参考資料

電源管理 - ArchWIki

たいていのことはArchWikiに書いてある気がする.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む