

### 事象

1.rhel7.5環境にてLVを作成  
2.LV上にファイルシステムを作成  
3.マウントポイント /usr9を作成  
4./usr9にLVをマウント(コマンド入力ミス)  
正) mount /dev/vg/lvol1 /usr9  
誤) mount /dev/vg/lvol1 /usr

### 影響

/usr配下のコマンド実行不可。ほとんどのコマンドは、/usr配下をリンク参照。

### 対処

・pwdとechoが実行可能なことを確認。  
・強制的にカーネルパニック実行によるリブート実施  
echo c > /proc/sysrq-trigger

※顧客環境下のため、即時的にVM再起動は不可であり、苦肉の策でカーネルパニックにたどり着く。

### 確認したいこと

echoコマンド等が、上述の状況で実行可能であった理由を知りたい。

リブートによる復旧後、コマンドpathを調査したが/usr配下を参照していることがわかっている。

なお、busyboxの導入は未実施の環境。


CC BY-SA 4.0
2021-03-12T13:13:48.220
74626
2021-03-14T23:56:07.500
2021-03-12T16:00:06.553
3060
44306
question
command-line rhel
/usr ディレクトリが参照できない状態でも、一部のコマンドが実行できるのは何故か？


### 原因

bash や zsh などのシェルには組み込みコマンドがあります。bashのベースとなった Bourne Shellにもありました。組み込みコマンドは,
当然？ `/usr/bin` など参照しません。`/usr` が使えなくなっても利用可能です。(シェルが動いてる状態ならば)

### 組み込みコマンド

組み込みコマンドの一覧は `help` コマンドにて調べることができます。  
また, `type` コマンドで組み込みか外部コマンドかを調べることもできます

[code]

    $ type cd
    cd はシェル組み込み関数です
    
    $ type man
    man は /usr/bin/man です
    
    $ help
    GNU bash, バージョン 5.0.17(1)-release (x86_64-pc-linux-gnu)
    これらのシェルコマンドは内部で定義されています。`help' と入力して一覧を参照してください。
    `help 名前' と入力すると `名前' という関数のより詳しい説明が得られます。
    
    〜 (以下略)
    
[/code]

### 存在理由

組み込みコマンドになっている理由は, いくつかの場合があります。高速化, あるいはそもそも組み込みコマンドでないと実行できない場合も  
(例えば `cd` コマンド … 外部コマンドだと実行終了後に元に戻ってしまうため)


CC BY-SA 4.0
2021-03-12T16:39:07.817
74630
2021-03-12T16:39:07.817
43025
74626
answer


シェル組み込みコマンド以外の例もあります。

`/usr` がいっぱいになったときにはシングルユーザーモードにして `/usr` のマウント先をいれかえたいわけです。 `/usr`
のマウント先をいれかえている真っ最中は当然 `/usr` は存在しませんのでまさに提示の状況となります。こういう状況でもルートパーティション `/` 配下の
`/bin` や `/sbin` にあるコマンドは使えます。

っていうか `/bin` や `/sbin` に格納してある各種コマンドは `/usr`
以下が無くても動作するよう敢えてスタティックリンクで作ってあるのです（少なくとも商用 UNIX ではそう）

野良ビルドしたバイナリはたいてい `/usr` 以下の共用ライブラリを使うよう `./configure` されているので `/usr`
がないと動きません。なのでインストール先も `/usr/local` とか `/opt` とかにしておき `/bin`
等を上書きしてしまわないように注意しておく必要があります。


CC BY-SA 4.0
2021-03-14T23:56:07.500
74677
2021-03-14T23:56:07.500
8589
74626
answer