コマンドを実行すると
chmod +x filename
bash はファイルを実行可能ファイルにします。実行可能ファイルに変更するために、ファイルのアーキテクチャに具体的に何が起こるのでしょうか? つまり、カーネルはどのようにしてこのファイルが実行可能ファイルであることを認識するのでしょうか?
ただオタクとしての筋肉を鍛えようとしているだけです。
答え1
ファイルの「アーキテクチャ」変わらない– 正しいフォーマットであることを確認するのはあなた次第です。つまり、ファイルはすでに有効な ELF バイナリ、有効な#!
ヘッダーを持つスクリプト、または特定のカーネルが認識できるその他のもの (a.out や MZ/PE など) である必要があります。
chmod
ファイルのパーミッションを少し設定してカーネルにユーザーが許可されたこのファイルを実行するには、小さなセキュリティ バリアとして機能し、特定の種類の事故を防ぐことができます。(+x
ここでは の省略形であることに注意してください。ugo+x
これは、読み取り/書き込みと同様にアクセス許可ビットです。)
カーネルが認識できないファイルに +x を設定すると、システムコールからエラーコードが返されますexec
。(一部のシェルでは、これに対して特別な処理が行われることに注意してください。カーネルが「認識できない形式」を報告した場合、シェルはファイルをスクリプトとして解釈しようとします。内部的に以前のシェルスクリプトはこのように動作してい#!
たため、発明した。
答え2
ファイルの内容はまったく変更されません。一般的な Unix 用に設計されたファイルシステムは、すべてのファイルに関する情報の保存をサポートします。これは、多くの場合、ファイルの「メタデータ」と呼ばれます。
このため、一部のファイルシステムでは同様の結果が得られません。つまり、FAT には Unix の権限に関連するデータを格納するための組み込み領域がなく、Unix では通常、そのようなファイルシステム ボリュームをマウントするときに特別なパラメータを使用してこれを回避します。そのため、通常、FAT ドライブ上のすべてのファイルは、マウントによって指定されたのと同じ権限を持ちます。(ISO9660 などの他のファイルシステムでも同様の動作が期待されますが、通常は書き込み不可です。) この方法でマウントされたボリュームでは、 を使用してもchmod +x
実際には何も変更されません。
つまり、カーネルがこれを認識する方法は、ファイルシステム ドライバーをチェックすることです。UNIX 用に設計された一般的なファイルシステムの場合、そのドライバーは、UNIX スタイルのアクセス許可が保存されている場所の読み取りをサポートしています。
chmod は単にドライブ上のそれらの場所を変更します。