システムプログラミングの概念とファイルの属性


システムプログラミングの概念とファイルの属性
本文は作者がTLPI(The Linux Programer Interfaceの総括)を読むので、重点を際立たせて、一刀切りを避けるために、私はあまり基本的な概念と使い方を紹介することはできなくて、私は重点を置いて原理と細部を紹介します.したがって,本稿の読者に対しては,少なくともAPUEを読んだり,実際に関連コードを書いたりしたプログラマーに,知識が少しばらばらであるため,できるだけFAQの形で読者に提示することを要求する.
システムプログラミング概念
udevメカニズムとは?
Linuxではすべてファイルであることが知られています.追加されたデバイスは/dev/ディレクトリの下流にある唯一のファイルに対応しています.Linuxの初期バージョンでは、/devにはシステムの可能なすべてのエントリが含まれています.一部のデバイスが実際にシステムに接続されていないとしても、/devには数千の未使用デバイス項目が含まれており、2つの欠点を招いたことはありません.1つは、ディレクトリコンテンツをスキャンする必要があるアプリケーションにとって、プログラムの実行速度を低減することである.二つ目は、このディレクトリの下の内容に基づいて、システムに実際にどのようなデバイスが存在するかを発見できないことです.Linux2.6 udevプログラムを用いて上記の問題を解決し、udevはプロセスを守る形で実行され、内部で発行されたueventをリスニングすることによって/devディレクトリの下のデバイスファイルを管理し、動的にデバイスファイルを作成することができ、デバイスの命名規則をカスタマイズすることもできる.
同じデバイスを複数のマウントポイントにマウントできますか?
カーネルバージョンが2.4になる前に、1つのファイルシステムは1つのマウントポイントにしかマウントできません.カーネルバージョン2.4から、1つのファイルシステムをファイルシステム内の複数の場所にマウントできます.各マウントポイントの下のディレクトリサブツリーの内容は同じであるため、1つのマウントポイントの下でディレクトリサブツリーに対する変更は、他のマウントポイントにも見られる.
[root@localhost data]# mkdir /data/mnt1
[root@localhost data]# mkdir /data/mnt2
[root@localhost data]# mount /dev/sdb1 /data/mnt1/
[root@localhost data]# mount /dev/sdb1 /data/mnt2/
[root@localhost data]# ls /data/mnt1/
1.c  data ls new_data
[root@localhost data]# ls /data/mnt2
1.c  data ls new_data
[root@localhost data]# touch /data/mnt1/test
[root@localhost data]# ls /data/mnt2
1.c  data ls new_data test

バインドマウントとは?
カーネルバージョン2.4から始まり、Linuxではバインディング・マウントの作成がサポートされています.バインディング・マウントとは、ファイル・システム・レベルの別の場所でディレクトリまたはファイルをマウントすることです.これにより、ファイルまたはディレクトリが2つの場所で同時に表示され、バインディング・マウントはハード・リンクに似ていますが、2つの点で異なります.
  • バインド障害は、複数のファイルシステムのマウントポイント
  • にまたがることができる.
  • は、ディレクトリに対してバインディングマウント
  • を実行することができる.
    [root@localhost bind]# mkdir mnt1 mnt2
    [root@localhost bind]# touch mnt1/zzz
    [root@localhost bind]# mount --bind mnt1 mnt2 //         
    [root@localhost bind]# ls mnt2/
    zzz
    
    [root@localhost bind]# touch test1 test2 
    [root@localhost bind]# echo "1111" > test1 
    [root@localhost bind]# mount --bind test1 test2 //         
    [root@localhost bind]# cat test2 
    1111

    共有サブツリー(shared subtree)の概念とは?
    Linuxバージョン2.4.19以降、カーネルは各プロセスに対するマウントネーミングスペースをサポートしています.これは、各プロセスが独自のファイルシステムマウントポイントのセットを持つ可能性があることを意味します.これは、各プロセスが独自のファイルシステムマウントポイントのセットを持つ可能性があることを意味します.例えば、プロセスAの視点では、/dev/sda1/本のディレクトリにマウントされ、プロセスBの視点では/dev/sda2本のディレクトリにマウントされているしか見えません.この特性をサポートした後、プロセスは独自のマウントネーミングスペースを望んでいるが、CD-ROMが存在するマウントポイントにアクセスしたい.このマウントポイントは初期のマウントスペースにある.他のマウント空間ではこのマウントポイントは見られないため、共有サブツリーの意味は、上記のシーンを完了するために必要なメカニズムを提供する.共有サブツリーには、4つの異なるマウントフラグがサポートされています.
  • shared mount /home shared mountマウントは、1つのマウントポイントを複数コピーすることができ、その後、任意のコピーのマウントポイントで再びマウントすると、他のコピーに伝播する.
  • [root@localhost ~]# mount --make-shared /data/ //  /data    shared mount
    [root@localhost ~]# mkdir /tmp/data
    [root@localhost ~]# mount --bind /data/ /tmp/data/ //    
    [root@localhost ~]# ls /data/
    test1  test2
    [root@localhost ~]# ls /tmp/data/
    test1  test2
    [root@localhost ~]# touch /data/aaa //            ,    
    [root@localhost ~]# ls /tmp/data/
    aaa  test1  test2
    [root@localhost ~]# mkdir /tmp/data/mnt //        
    [root@localhost ~]# mount /dev/sdb1 /tmp/data/mnt/ //       
    [root@localhost ~]# ls /tmp/data/mnt/ 
    1.c  data ls new_data
    [root@localhost ~]# ls /data/mnt/ //               shared mount
    1.c  data ls new_data
  • slave mount MS_SHARED slave mountマウントは、1つのマウントポイントを複数コピーできますが、その後、コピーされたマウントポイントでの再マウントは他のコピーに伝播しません.また、アンインストールイベントは他のマウントポイントに伝播しませんが、masterマウントポイントでマウントすると、このイベントはすべてのslave mountに伝播します.
  • [root@localhost /]# mount --make-shared /data/ //slave mount     master mount,  master   shared mount
    [root@localhost /]# mount --bind /data/ /tmp/data/ 
    [root@localhost /]# mount --make-slave /tmp/data/ //   slave mount
    [root@localhost /]# mount /dev/sdb1 /tmp/data/mnt/ //        
    [root@localhost /]# ls /tmp/data/mnt/
    1.c  data ls new_data
    [root@localhost /]# ls /data/mnt/
    [root@localhost /]# touch /data/zzz //       
    [root@localhost /]# ls /tmp/data/
    aaa  mnt  test1  test2  zzz
    [root@localhost data]# unmount /tmp/data/mn1 //  
    [root@localhost data]# mount /dev/sdb1 /data/mnt/ // master mount    
    [root@localhost data]# ls /data/mnt/
    1.c  data ls new_data
    [root@localhost data]# ls /tmp/data/mnt/ //      slave mount
    1.c  data ls new_data
  • private mount MS_SLAVE private mountマウントは、初期のmountと同様であり、一部のシステムのデフォルトマウントタイプでもあり、バインドマウントは可能であるが、どのマウントポイントで再マウントしてもマウントイベントの転送や伝播は行われない.
  • [root@localhost data]# mount --make-private /data/ //  private mount
    [root@localhost data]# mount --bind /data/ /tmp/data/ //      
    [root@localhost data]# mount /dev/sdb1 /data/mnt/ //    
    [root@localhost data]# ls /data/mnt/ 
    1.c  data ls new_data
    [root@localhost data]# ls /tmp/data/mnt/ //           
    [root@localhost data]# 
  • unbindable mount MS_UNBINDABLEはバインドマウントできません.1つのデバイスは1つのマウントポイントにしかマウントできません.

  • 注意:詳細はDocumentation/sharedsubtreeを参照してください.txt
    ファイルシステムに関する情報を取得するにはどうすればいいですか?
           #include <sys/statvfs.h>
           int statvfs(const char *path, struct statvfs *buf);
           int fstatvfs(int fd, struct statvfs *buf);

    パス、またはfdを指定すると、このファイルが存在するファイルシステムに関する属性情報が返され、MS_PRIVATEという構造体を使用して表されます.この構造体は以下のように構成されています.
               struct statvfs {
                   unsigned long  f_bsize;    /* file system block size */
                   unsigned long  f_frsize;   /* fragment size */
                   fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */
                   fsblkcnt_t     f_bfree;    /* # free blocks */
                   fsblkcnt_t     f_bavail;   /* # free blocks for unprivileged users */
                   fsfilcnt_t     f_files;    /* # inodes */
                   fsfilcnt_t     f_ffree;    /* # free inodes */
                   fsfilcnt_t     f_favail;   /* # free inodes for unprivileged users */
                   unsigned long  f_fsid;     /* file system ID */
                   unsigned long  f_flag;     /* mount flags */
                   unsigned long  f_namemax;  /* maximum filename length */
               };

    ファイルのプロパティ
    atime,ctime,mtimeの違いは?
  • atimeファイルの読み取りとファイルの実行は、atimeの変化をもたらします.
  • ctimeファイルのinode情報が変化する限り、ctimeも変化するので、atimeの変化は通常ctimeの変化をもたらす.atimeはinodeの構成の1つである
  • であるからである.
  • mtimeファイルの内容が変化するとmtimeが更新されます.通常、mtimeの更新はctimeが変化します.mtimeの変化はファイルのサイズが変化したことを示し、ファイルのサイズはinodeの構成の1つである
  • に属します.
    注意:ファイルへのアクセスと書き込みのたびに、上記の数時間の変化に影響し、inodeの情報は最終的にローカルディスクに保存されます.そのため、上記の数時間の更新操作をオフにすると、ディスクの操作回数を減らし、不要なパフォーマンスオーバーヘッドを減らすことができます.ファイルを開くときにO_を指定NOATIMEはatimeの更新操作をオフにするか、ファイルシステムをマウントするときに関連するオプションを指定して時間の更新操作をオフにすることができます.具体的にはmountのmanドキュメントをクエリーできます.
    ディレクトリ権限のrwxの意味?
  • の読み取り権限は、ディレクトリの下にあるコンテンツ(すなわち、都ディレクトリのコンテンツであり、ディレクトリの内容はファイル名と対応するinodeの情報である)をリストすることができるが、
  • .
  • 書き込み権限ディレクトリ内で作成、ファイルの削除(注意:ファイル自体に権限を必要としないファイルの削除)
  • は、ディレクトリ内のファイルにアクセスできる権限を実行し、そのディレクトリに切り替えることができ、書き込み権限に合わせてディレクトリにファイルを追加または削除することができます.

  • ディレクトリへの読み取り権限は、ディレクトリ内のコンテンツのみをリストできます.ディレクトリ内のこれらのファイルのiノード情報にアクセスするには、ディレクトリの実行権限が必要です.ディレクトリに対する実行可能な権限を持ち、読み取り権限がなく、ディレクトリ内のファイル名を知っていれば直接アクセスできます.ディレクトリにファイルを追加または削除するには、そのディレクトリに対する実行と書き込みの権限を同時に持つ必要があります.削除されたファイル自体の権限は機能しません.