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",
                                        루트_디렉터리, 루트_statb.st_ino);
        }
        그렇지 않으면 (root_statb.st_ino > 2)
        {
                fprintf(stderr, "경고: %s inode 번호는 %d입니다."
                                "루트 inode가 아닐 수 있습니다.\n",
                                        루트_디렉터리, 루트_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);
}

처음 두 테스트는 기본적으로 온전성 검사입니다. stat("/", …)테스트가 실패하거나 " /"가 디렉터리가 아니면 파일 시스템이 손상된 것입니다. 이 st_ino테스트는 일종의 어둠 속의 테스트와 같습니다. AFAIK, inode 번호는 음수 또는 0이 되어서는 안 됩니다. 역사적으로(30년 전 이야기입니다) 루트 디렉터리의 inode 번호는 항상 1이었습니다. 이것은 일부 *nix("Minix"에 대해 들어본 사람이 있습니까?) 및 /procWindows(FAT) 파일 시스템과 같은 특수 파일 시스템의 경우 여전히 사실일 수 있지만 대부분의 최신 Unix 및 Unix 계열 시스템은 inode 번호 1을 사용하는 것처럼 보입니다. 불량 블록을 추적하고 루트를 inode 번호 2로 푸시합니다.

S_ISBLK/dev/sda1예를 들어 출력이 ls -l" " 로 시작 하는 "블록 장치"의 경우에도 마찬가지입니다 b. S_ISCHR출력이 ls -l"" 로 시작 하는 "문자 장치"에도 동일 하게 적용됩니다 c. (비슷한 디스크 이름이 가끔 표시될 수 있습니다 /dev/rsda1. " r"는 "원시"를 의미합니다. 원시 디스크 장치는 때때로 fsck백업에 사용되지만 설치에는 사용되지 않습니다.) 각 inode에는 st_devinode가 상주하는 파일 시스템을 나타내는 하나의 가 있습니다. 장치의 inode에는 st_rdev해당 장치가 무엇인지 설명하는 필드 도 있습니다.. ( ls -l장치를 사용할 때 파일 크기에 표시되는 쉼표로 구분된 두 개의 숫자는 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장치를 사용하는 장치 매퍼 항목에 대한 기호 링크가 포함된 디렉토리를 통해 볼 수 있습니다.

관련 정보