シェルスクリプトを使用してファイルシステムの変更を検索するときは、除外するのを忘れていた/dev
のでcore
、それもテストしました。奇妙なことは、どのようにテストしてもタイプによって一貫性がないことです。
$ if [ -f ./core ] ; then echo file ; else echo something else ; fi
file
$ ls -al core
lrwxrwxrwx 1 root root 11 Sep 29 15:40 core -> /proc/kcore
$ file core
core: symbolic link to `/proc/kcore'
$ if test -f core ; then echo file ; else echo something else ; fi
file
$ if /usr/bin/test -f core ; then echo file ; else echo something else ; fi
file
$ if test -h core ; then echo link ; else echo something else ; fi
link
$ if /usr/bin/test -h core ; then echo link ; else echo something else ; fi
link
ここで何が起こっているのでしょうか?
ベストアンサー1
まず、/dev/core
一般ファイルへのシンボリックリンクがあります/proc/kcore
。したがって、両方とも正しいtest -h /dev/core
ですtest -f /dev/core
。-h
これは、シンボリックリンクであり、-f
シンボリックリンクの宛先が通常のファイルであるためです。
それでは、それが何であるかを話しましょう/proc/kcore
。通常のファイルですが、おなじみの通常のファイルとは少し異なります。プログラムがファイルに対していくつかの操作(開く、読み取り、書き込みなど)を実行するたびに、次のことを行います。システムコールつまり、カーネルでいくつかのコードを実行することです。呼び出されるコードは、ファイルシステムの種類によって異なります。ディスクファイルシステム(ext4やFATなど)の場合、このコードはファイルを構成するデータフラグメントがどのように配置されているかを把握し、デフォルトのストレージレイヤ(ディスクドライバなど)を呼び出してこれらのデータフラグメントを読み書きします。ネットワークファイルシステム(NFSやSambaなど)の場合、このコードはネットワークパケットをファイルサーバーに送信します。の場合、/proc
これはマウントポイントです。procfs ファイルシステム、このコードはカーネルデータ構造を表示または変更します。
ほとんどのファイルは、マウントポイントリストのレポート、ロードされたモジュールのリストのレポート、PID 123を使用してプロセスに関するステータス情報のレポートなど、システムに関する/proc
情報をレポートします。このファイルはデバッガに適した形式でシステムの物理メモリの内容を報告するため、このファイルからバイトを読み取るのは本質的に物理メモリの内容を読み取ることです。/proc/mounts
/proc/modules
/proc/123/stat
/proc/kcore
/proc/kcore
procfsファイルシステムのファイルは、次のように「魔法」と見なすことができます。デバイスファイルそれは「魔法」です。 procfsなどのデバイスファイルとファイルシステムシステムファイルシステム別の方法で魔法を使用してください。デバイスファイルは、すべての(ほとんどの)ファイルシステムで作成でき、ディレクトリエントリに「通常ファイル」ではなく「文字デバイス」に対して「ブロックデバイス」とマークされているため、魔法です/proc
。以下のファイルは、/sys
そのファイルを含むファイルシステム全体が魔法的であるため、魔法的です。
それ以外は、上で見たように、実際の魔法は関与していません。そのコードがブロックレイアウトを計算し、ディスクから読み取るかカーネルデータ構造をフォーマットするかは、カーネルコードにすぎません。
procfs ファイルシステムのドキュメントは次のとおりです。proc
マニュアルページそしてカーネル文書。