前置き
ネットワークの体験前にまとめたやることリストの消化、第2章としてはLinux起動時に、コマンドを自動的に実行してほしい部分の調査になります。
あとは、ファイルを作成して、そのファイルごと実行可能なバッチ処理的な事とか更にそのバッチ処理をプレースホルダ的な感じで構築できるともっと良さそうなので、そのあたりも調査してみます。
スタートアップ処理
スタートアップと銘打ったが、initializeのことを言いたいので日本語的には初期化処理となるのだろうか。initという表現ならしっくりくるので、記事内では以下initと表現する。
処理が実行されるタイミング
initを行う方法を調べていくと、Linuxの仕組みと共にプログラムが起動していく流れが見えてくる。
主に、3つのタイミングで処理を走らせることが出来そうだが、推奨・非推奨な動作もあるとのことなので、まとめてみる。
OS起動時
Linuxカーネルが起動した時に実行されるタイミングとなる。
いくつか方法があるようなので紐解いてみる。
/etc/rc.local
LinuxOS起動時に読まれるファイルのひとつ。
実行する権限はrootが使われるとのことで、現在はこのファイルを編集することは推奨されていないらしい(RedHat系列のみ?)。
↓中身を見たらこのようになってました
仮想マシンへのお試し程度ならここへの書き込みでも良さそうですが、推奨ではないことから今後の有用性を考えると触るべきではないかもしれません。
systemd
rc.localファイルの代わりに推奨されているinitプロセス。
1ファイルに処理を書いていく方式ではなく、Unitという単位で処理を分割することが可能。
定義ファイル(設定ファイル)は、[/etc/systemd/system]に置いてあるものを編集する。
逆に[/usr/lib/systemd/system]に入っているファイルは触ってはいけないとのこと。
systemctlコマンドでUnitを作成したり色々出来るらしいですが、どうやら今回の環境であるWSL2上に立てた仮想マシンではsystemdを扱うためのPID=1が公式的に対応していないらしく、systemdをそう簡単には使えないようだ。
※ DockerコンテナもWSL上なので使用するのは面倒くさいらしい。
※ 2022年9月頃にWSLがPID=1に対応したという情報も見かけたが、Linuxのバージョンを上げたうえで、色々設定が必要とのことなので、面倒くさいことこの上ない。
udev
デバイスの接続により、作成したルールが作動するツールとのことです。
デバイス接続時の処理に使うのがメイン用途なので、無理に使わなくても良さそうです。
ログイン時
ユーザのログイン時にもいくつかの方法で処理の実行が可能。
色々と処理の優先度などがややこしいが、参考サイトを渡り歩きながら把握した分を並べてみる。
これ単体では、OSをシャットダウンしないと消えないNetwork Namespaceの処理を記述するのには不向きです。
なので、後述するログアウト時の処理実行手順と併用すると使えそうです。
/etc/profile
どのユーザでログインしても実行されるファイル。
sh系と呼ばれるシェルでログインした時のみ実行されるとのこと。
まあ普通にbashなら実行されているという考えで良さそうですね。
/etc/bash.bashrc
profileの次に実行されるファイル。
catで中身見たけど、長ぇので画像は略。
どうやらLinuxでもubuntuとdebianしかサポートしてないファイルとのこと。
ファイルが無い場合は、飛ばされる処理でもある。
~/.bash_profile
ここからは、homeディレクトリにあるファイル(~/)が連続する。ということで、ログインしたユーザごとの処理となってくるので、主にユーザで変化する環境変数を記述することに向いているようです。
ちなみに、vagrantで作ったubuntu/trusty64の仮想マシンのvagrantユーザには、このファイルが存在していませんでした。(後から作ることは可能とのこと)
↓「.bash_profile」が無い様子
~/.bash_login
.bash_profileが無い場合に実行されるファイル。出来た由来が違うくらいで、役割は.bash_profileと同じです。
~/.profile
.bash_loginも無い場合に実行されるファイル。ログイン系では最後に判断されるファイルです。役割も前者2つと同じ。今回の仮想マシンにおいてはこのファイルが存在していました。
シェル起動時
ログイン系の判断が終了した後にやってくる実行タイミングです。
ログイン後のみならず、ターミナルに「bash」と入力することでシェルが再起動します。その場合は、このシェル起動時のファイルのみが再実行されます。
~/.bashrc
無い場合は無視されますが、ログインユーザでのシェル起動時に実行されるファイルです。
今回の仮想マシンにも存在しています。
/etc/bashrc
どのユーザでもシェル起動時に実行される、initとしては最後の実行ファイルです。
今回の仮想マシンには存在しませんでした。
ログアウト時
~/.bash_logout
先にも少し触れた、ログアウト時に実行されるファイルです。今回の仮想マシンにもあります。
このファイルに、ログアウト時にNetwork Namespaceを全削除する処理を書けばログイン時でのinit処理としてNetwork Namespaceを書くのも良さそうです。
試してみる
面倒な設定が少なそうなログイン時とログアウト時でNetwork Namespaceを作ったり消したりする動作を試してみることにする。
必要な知識
vi, Vim
環境構築からの記事の流れだと、ここで初めてLinuxのファイル内に干渉することになります。
Linux(というかUnix系列のOS)では、viというツールを使用してファイルを編集します。こいつが癖強めなので、そのあたりの操作知識を仕入れながらやっていく必要があります。viと言ってはいますが、その派生版(高機能)のVimが標準搭載されているので、vimを使用していくことにします。
NORMALモードとINSERTモードという2つのモードが存在し、コマンドで切り替えながら書き込んでいきます。また、Vimを抜ける時も専用のコマンドを入力することで、保存しながらLinuxのシェルに戻ります。
Network Namespace
本題のネットワーク構築時に本格的に利用しますが、今回は「作成・確認・削除」の3つのコマンドを、フライングで書いていきます。
- 作成
sudo ip netns add hello
- 確認
ip netns list
- 削除
sudo ip netns delete hello
手順
LinuxログインからNetwork Namespace作成まで
- [vagrant up]で仮想マシンを起動し、[vagrant ssh]でログイン
- [ls -a]でHomeディレクトリを隠しファイル含めて確認
ログイン時のinit処理ファイルを探す(例では.profile) - [vim .profile]でVimによるファイル編集に入る
- カーソルをファイルの一番下に持ってきて、[o]で新しい行を作りINSERTにする
- [sudo ip netns add hello]と入力し、[esc]でNORMALにする
- [:wq]で保存してVimを抜ける
- [exit]でubuntuも抜ける
- 再度、[vagrant ssh]で接続
- [ip netns list]で、【hello】が作成されていることを確認。
ちなみに、再度ログアウト・ログインをすると既にあるものを作成しようとするため、以下のようなエラー文が表示される
ログアウトでNetwork Namespace削除を確認
- 次はログイン後、【.bash_logout】ファイルを編集する
[vim .bash_logout] - [sudo ip netns delete hello]を記述し、保存してVimを終了[:wq]
- [exit]でLinuxを抜け、再度[vagrant ssh]でログイン
- 次のログインでは、File existsのエラーが出ていないと成功
バッチ処理
ファイル実行
Windowsで過去に少し触ったことがあるのですが、どうやらLinuxでもシェルスクリプトファイルは同様に使えるようです。(というか本来の主戦場はUNIXやLinuxっぽい)
よく利用する実行方法が2種あるので、それぞれまとめます。
sourceコマンド
現在のシェルで読み込んで実行する。
今回、使用するならこちらですかね。
bashコマンド
新しいシェルで読み込んで実行する。
シェル起動時のinitが作動するので、今回は使わなくても良さそうです。
プレースホルダ
ファイルの実行方法が分かったので、次はシェルスクリプトを実行する際に入力項目をプレースホルダとしてカスタム出来ないかという点を調査します。
シェルスクリプトにおいては変数とreadコマンドを用いることで、それが可能となります。
試してみる
ファイルの実行
まずはシェルスクリプトファイルをHomeディレクトリに作成する。
touch test_script.sh
vim test_script.sh
そして、以下のコードをVimで入力する。
#!/bin/bash
# bashで実行されるファイルですよの意
sudo ip netns add test_script
保存して、以下のコマンドを実行
source test_script.sh
ip netns list
シェルスクリプト内で記述したNetwork Namespaceが作成されていれば成功。
プレースホルダ
ファイルの実行の項で作成したファイルの中身を以下のように書き換えます。
#!/bin/bash
# bashで実行されるファイルですよの意
read -p "Network Namespaceの名称: " VAR
# コマンド入力を読み込むコマンド
sudo ip netns add $VAR
# 変数をセット
このファイルを実行するとキーボード入力が待たれますので、好きな名称を入力してください。
最後にNetwork Namespaceが任意の名前で作成されたかを確認して、できていればOKです。
最後に
だいぶ長くなりましたが、これで面倒くさいNetwotk Namespaceの作成を、initやシェルスクリプトである程度自動に作成できそうです。