다른 inum을 가진 파일을 하드 링크할 수 있나요?

다른 inum을 가진 파일을 하드 링크할 수 있나요?

저는 새로운 Linux 사용자이고 Arch Linux와 최근에는 Linux From Scratch(7.7)를 배우고 있습니다. 새로 설치된 AL을 LFS 호스트로 수동으로 설정했습니다(제공된 호스트도 사용함).배쉬 스크립트) 내 호스트의 필수 구성 요소 패키지를 확인했습니다. 내 경우에는 /usr/bin/yacc를 /usr/bin/bison에 연결하는 것을 제외하고 모든 차이점을 해결했다고 확신합니다.

제공된 스크립트의 결과 yacc is bison (GNU Bison) 3.0.4는 가 아닌 입니다 /usr/bin/yacc -> /usr/bin/bison. 후자가 심볼릭 링크의 출력 형식을 확인하고 있기 때문에 스크립트는 yacc가 준비되었지만 다른 유형의 링크를 사용하고 있음을 알려주고 있다고 가정합니다. 저는 Linux 파일 시스템에 대해 더 많이 조사한 결과 실제 데이터가 inode(메타데이터)로 설명되고, 이는 다시 우리가 상호 작용하는 (추상) 파일이 가리키는 것이라는 대략적인 아이디어를 얻었습니다. 단순히 동일한 inode를 가리키는 파일은 하드 링크로 간주됩니다(그러나 파일은 서로 독립적이라고 생각합니다). 나는 실행하여 sudo ls -il /usr/bin | lessyacc와 bison의 inode 번호가 약간 다르다는 것을 발견했습니다(각각 152077과 152078). 이는 하드링크되지 않았음을 의미합니까, 아니면 스크립트 출력을 잘못 해석하여 수정해야 합니까?

편집: bash 스크립트의 관련 명령:

bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found" 
fi

답변1

이렇게 하면 ls -il /usr/bin파일 이름과 일치하는 inode 번호가 나열됩니다. 이 경우 "inode"에서 "filename"을 분리하고 inode를 파일로 처리하는 것이 좋습니다.

"inode"는 일반적으로 메타데이터(권한, 소유권, 생성 시간, 액세스 시간 등)와 파일 데이터가 포함된 디스크 블록을 포함하는 디스크 데이터 구조입니다. 파일 시스템에 따라 inode는 전략적으로 디스크 주변에 위치하거나 일종의 데이터베이스에 존재할 수 있습니다. 대부분의 경우 inode 번호에서 inode가 있는 디스크 블록으로 이동하는 빠른 알고리즘이 있으므로 조회가 매우 빠릅니다.

이러한 관점에서 보면 각 파일 이름은 단지 "하드 링크"일 뿐입니다. 디렉토리는 단순히 파일 이름과 inode 번호와 일치합니다. "실제 파일 이름"과 "하드 링크" 사이에는 차이가 없습니다. 따라서 파일 이름 /usr/bin/yacc/usr/bin/bison다른 inode 번호와의 일치는 두 이름이 다른 메타데이터와 다른 파일 데이터를 참조한다는 것을 의미합니다. 가볍게 말하면 두 inode 각각과 일치하는 파일 이름이 하나만 있기 때문에 이러한 파일은 하드 링크가 아니지만 기술적으로 두 파일 이름은 모두 하드 링크이며 각각은 inode에 대한 것입니다. 단일 하드 링크입니다.

스크립트와 "거의 동일한 inode 번호"에 관한 한 yacc및 은 bison관련이 있습니다. 내 Arch 노트북에서:

1032 % ls -li /usr/bin/yacc /usr/bin/bison
1215098 -rwxr-xr-x 1 root root 394152 Jan 23  2015 /usr/bin/bison*
1215097 -rwxr-xr-x 1 root root     41 Jan 23  2015 /usr/bin/yacc*
1033 % file /usr/bin/yacc
/usr/bin/yacc: POSIX shell script, ASCII text executable
1034 % cat /usr/bin/yacc
#! /bin/sh
exec '/usr/bin/bison' -y "$@"

파일 이름 yaccbison식별 inode 번호 사이에는 단 하나의 구분만 있습니다. 아마도 차례로 생성되기 때문일 것입니다. 파일 이름은 yacc심볼릭 링크나 하드 링크를 나타내지 않습니다. 심볼릭 링크는 출력에서 ​​다르게 나타납니다 ls -li. 두 하드 링크는 각각 동일한 inode 번호를 나타냅니다.

그러나 yacc관련된 것은 bison호출입니다 bison. 이것이 바로 스크립트가 다음과 같은 출력을 제공하는 이유입니다.

bison (GNU Bison) 3.0.4
yacc is bison (GNU Bison) 3.0.4

귀하의 스크립트 호출은 /usr/bin/yacc실제로 실행됩니다 /usr/bin/bison.

답변2

두 파일의 inode 번호가 서로 다르면 하드 링크되지 않습니다. 이것이 하드 링크의 정의입니다. 파일 시스템의 다른 위치(다른 이름 또는 다른 디렉터리)에 있는 동일한 파일(따라서 inode 번호를 포함한 동일한 메타데이터)입니다.

Bison은 yacc의 구현입니다. 보다 정확하게 bison -y는 POSIX 를 에뮬레이트합니다 yacc. yacc의 다양한 구현을 .으로 사용할 수 있습니다 /usr/bin/yacc. 귀하의 경우 Bison을 .로 한 /usr/bin/yacc번 , /usr/bin/bison. 같은 방식으로 만들어질 수도 있고 그렇지 않을 수도 있습니다. 빌드 스크립트를 확인하세요.

dash, ksh 또는 bash에서는 다음을 사용하여 과 가 동일한 파일인지(즉, 동일한 파일에 대한 하드 링크인 심볼릭 링크 체인(길이 0일 수 있음)인지 여부)를 [ /usr/bin/yacc -ef /usr/bin/bison ]테스트 할 수 있습니다./usr/bin/yacc/usr/bin/bison

관련 정보