Linux起動時にコマンド実行して欲しいので調査した

ネットワーク

前置き

ネットワークの体験前にまとめたやることリストの消化、第2章としてはLinux起動時に、コマンドを自動的に実行してほしい部分の調査になります。

ネットワークで遊ぶために必要な事項をまとめておく
前置き ここまでに仮想マシン・コンテナの環境構築→ネットワークの基礎知識→仮想ソフトウェアの基本的なコマンド操作と順番に記事にしてきました。 ↓環境構築から読みたい人向け やることをまとめる Network Namespace ...

あとは、ファイルを作成して、そのファイルごと実行可能なバッチ処理的な事とか更にそのバッチ処理をプレースホルダ的な感じで構築できるともっと良さそうなので、そのあたりも調査してみます。

スタートアップ処理

スタートアップと銘打ったが、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作成まで

  1. [vagrant up]で仮想マシンを起動し、[vagrant ssh]でログイン
  2. [ls -a]でHomeディレクトリを隠しファイル含めて確認
    ログイン時のinit処理ファイルを探す(例では.profile)
  3. [vim .profile]でVimによるファイル編集に入る
  4. カーソルをファイルの一番下に持ってきて、[o]で新しい行を作りINSERTにする
  5. [sudo ip netns add hello]と入力し、[esc]でNORMALにする
  6. [:wq]で保存してVimを抜ける
  7. [exit]でubuntuも抜ける
  8. 再度、[vagrant ssh]で接続
  9. [ip netns list]で、【hello】が作成されていることを確認。
    ちなみに、再度ログアウト・ログインをすると既にあるものを作成しようとするため、以下のようなエラー文が表示される

ログアウトでNetwork Namespace削除を確認

  1. 次はログイン後、【.bash_logout】ファイルを編集する
    [vim .bash_logout]
  2. [sudo ip netns delete hello]を記述し、保存してVimを終了[:wq]
  3. [exit]でLinuxを抜け、再度[vagrant ssh]でログイン
  4. 次のログインでは、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やシェルスクリプトである程度自動に作成できそうです。

タイトルとURLをコピーしました