Linuxファイルシステムが実行中のシステムに属していることを確認する方法

Linuxファイルシステムが実行中のシステムに属していることを確認する方法

ブロックデバイス(例:/ dev / sda1)を入力として受け取り、内部ファイルシステムが現在実行されているかどうかに応じて一連のタスクを実行するプログラムを作成する必要があります。

入力に常に正しいLinuxディレクトリツリーがあるとしましょう。私が知っておくべき唯一のことは、内部システムが実行されているかどうかを確実に確認できる特定のディレクトリ構造またはファイルがあるかどうかです。私の言葉は、ファイルシステムに起動されたシステムのルートディレクトリが含まれているかどうかです。

すべてのファイルシステムまたはLinuxカーネルバージョンで動作する必要があります。

ありがとうございます!

答え1

1引数がルートデバイスの場合は返し、 0それ以外の場合は負の値を返す関数を作成しました。

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

静的整数
root_check(const char *disk_dev)
{
        static const char root_dir[] = "/";
        構造体統計root_statb;
        構造体stat dev_statb;

        if(stat(root_dir、&root_statb)!= 0)
        {
                エラー(root_dir);
                -1 を返します。
        }
        if (!S_ISDIR(root_statb.st_mode))
        {
                fprintf(stderr, "エラー: %s はディレクトリではありません!\n", root_dir);
                -2 を返します。
        }
        if(root_statb.st_ino<=0)
        {
                fprintf(stderr, "警告: %s inode 番号は %d です。"
                                "動作する可能性が低いです。\n",
                                        root_ディレクトリ、root_statb.st_ino);
        }
        それ以外の場合(root_statb.st_ino> 2)
        {
                fprintf(stderr, "警告: %s inode 番号は %d です。"
                                "ルート inode ではない可能性があります。\n",
                                        root_ディレクトリ、root_statb.st_ino);
        }
        if (stat(disk_dev, &dev_statb) != 0)
        {
                エラー(disk_dev);
                -1 を返します。
        }
        if(S_ISBLK(dev_statb.st_mode))
                /*とても良いです。 */;
        else if(S_ISCHR(dev_statb.st_mode))
        {
                fprintf(stderr, "警告: %s は文字特殊デバイスです。"
                                "おそらくディスクではないでしょう。\ n"、disk_dev);
        }
        その他
        {
                fprintf(stderr, "警告: %s はデバイスではありません。\n", disk_dev);
                戻り(0);
        }
        if(dev_statb.st_rdev == root_statb.st_dev)
        {
                printf("%s がルートファイルシステム (%s) のようです。\n",
                                        disk_dev、ルートディレクトリ);
                リターン(1);
        }
        //その他
        printf("(%s がルートファイルシステムではないようです。)\n", disk_dev);
        戻り(0);
}

最初の2つのテストは基本的に完全性チェックです。stat("/", …)テストが失敗した場合、または" /"がディレクトリではない場合、ファイルシステムは破損しています。このst_inoテストは、ある種の暗闇の中のテストと同じです。 AFAIK、inode 番号は負の数またはゼロにしてはいけません。歴史的に(30年前の話です)、ルートディレクトリのinode番号は常に1でした。これは、一部の* nix(「Minix」について聞いたことがありますか?)や/procWindows(FAT)ファイルシステムなどの特別なファイルシステムではまだ事実かもしれませんが、ほとんどの最新のUnixおよびUnixシリーズシステムはinode番号1を使用します。するようです。不良ブロックを追跡し、ルートをinode番号2にプッシュします。

S_ISBLK/dev/sda1たとえば、出力がls -l「」で始まる「ブロックデバイス」の場合も同様ですbS_ISCHR出力がls -l「」で始まる「文字デバイス」にも同様に適用されますc。 (同様のディスク名が時々表示されることがあります/dev/rsda1。 " r"は「raw」を意味します。rawディスクデバイスは時々fsckバックアップに使用されますが、インストールには使用されません。)各inodeはst_devinodeが存在するファイルシステムを表すがあります。デバイスのinodeには、st_rdevそのデバイスが何であるかを説明するフィールドもあります。はい。 (ls -lデバイスを使用するときにファイルサイズに表示される2つのカンマ区切りの数字は2バイトですst_rdev。)

したがって、キーは、st_rdevディスクデバイスがst_devルートディレクトリと一致することを確認することです。つまり、指定されたデバイスが/" "を持つデバイスですか?

答え2

デバイスが取り付けられているかどうか、および場所は次のとおりです。

awk -v device=/dev/sda1 ' $1 == device {print $2}' /proc/mounts

これは、mdraidやLVMなどのカーネルサブシステムで使用されるデバイスを検出しません。これは/sys/class/block/sda1/holders、デバイスを使用するデバイスマッパーエントリへのシンボリックリンクを含むディレクトリを介して表示できます。

関連情報