디렉토리의 하드 링크(inode)를 심볼릭 링크할 수 있습니까? (이 디렉터리의 최상위에 마운트하면 동일한 물리적 위치를 가리킬까요?)

디렉토리의 하드 링크(inode)를 심볼릭 링크할 수 있습니까? (이 디렉터리의 최상위에 마운트하면 동일한 물리적 위치를 가리킬까요?)

mount얼마 전 나는 나중에 가려진 디렉토리의 파일에 액세스할 수 있기를 원했습니다 . SE에서 몇 가지 QA 답변을 찾은 기억이 나지만, 제가 시도한 답변 중 어느 것도 효과가 없었던 것으로 기억합니다. 어쩌면 그들은 이전 Linux 커널에서 작업하고 있었을지도 모르겠습니다. 이제 최신 커널(현재 5.x) 중 하나가 포함된 배포판을 사용하려고 합니다.

마운트로 인해 가려진 디렉토리 트리 부분에 액세스하기 위해 "표준" 도구를 사용할 수 있는 방법이 실제로 있다면 답변을 작성해 주십시오.

나는 몇 가지 해결책을 생각했습니다.

  1. 디렉토리의 하드 링크(inode)에 대한 소프트 링크를 만들 수 있는 도구가 있을까요? AFAIK 표준은 ln이를 수행할 수 없습니다. ln -s(AFAIK 및 시행착오를 통해) inode가 아닌 파일 트리의 위치에 대한 링크를 만듭니다. 해당 위치가 가리키는 위치가 변경되면(상단 마운트를 통해) 심볼릭 링크는 이전 위치가 아닌 새 위치를 가리킵니다.

@terdon의 의견에 대한 응답으로 추가되었습니다.
사용자 관점(적어도 내 독자 man ln등)에서 심볼릭 링크는 운영 체제(시스템 유틸리티 포함)가 inode(하드 링크)와 구별되는 링크 유형입니다. 이는 find루프에서 통과되지 않는 링크 입니다 .

  1. 물리적 inode 데이터를 반수동으로 읽은 후 dd(마운트 전) 나중에 다른 데이터에 적용합니다(기본적으로 하드 링크). 어떻게 하나요?

  2. 커널의 폴더에 대한 하드 링크를 활성화합니다. (저는 이것을 특별한 작업에 거의 사용하지 않을 계획입니다. 순환적 추론을 알고 있지만 제가 아는 한 많은 Unix가 이를 갖고 있고 작동합니다.) 어떻게 하나요?

추신 : 질문을 여러 개로 나누는 것이 더 나을 수도 있습니다 ...

보충 2. ln -s테스트:

$ echo 123 > 1/1/te.xt
$ ln -s 1/1 2
$ ls 2
te.xt
$ sudo mount -o loop /path/ubuntu-20.04.3-desktop-amd64.iso 1
$ ls 2 # 2 is displayed as broken link in GUI
2

3개를 추가했습니다. mount --bind다음에서 시도해 보세요.기본 마운트 지점 경로의 콘텐츠에 액세스- 실패

$ mount --bind 1 2
$ ls 2
1
$ sudo mount -o loop /path/ubuntu-20.04.3-desktop-amd64.iso 1
$ ls 2
boot  casper  dists  EFI  install  isolinux  md5sum.txt  pool  preseed  ubuntu

추가 4: 이전 레벨에 마운트 바인딩 - 같은 방식으로 실패합니다(그런데 tmpfs 시스템인데 ext4에서도 작동할까요? --bind에서 읽으라고 제안한 내용에 대한 설명을 찾지 못했습니다 man mount).

보충 5: 오버섀도잉 명령 이후에 실행해야 하는
것으로 나타났습니다 .mount --bindmount

답변1

..디렉토리 트리에 순환이 발생할 수 있고 디렉토리 항목이 고유하지 않게 되므로 디렉토리에 대한 하드 링크를 만들 수 없습니다 . 디렉터리에 대한 하드 링크를 생성할 수 없으므로 디렉터리 하드 링크에 대한 소프트 링크를 생성할 수 없습니다.

너가 아니라면파일 시스템 자체에 대한 바이너리 패치, 이 경우 다음과 같이 또는 다른 방법으로 중단할 수 있습니다. 적어도 fsck그것은 당신을 덜거덕거리게 할 것이고, 파일 시스템 드라이버도 토할 것인지 궁금합니다.

에 일부 데이터가 있고 /foo에 다른 것을 마운트하는 동안 해당 데이터를 사용할 수 있도록 유지해야 하는 경우 /foo가장 쉬운 방법은 이름을 /foo로 변경 /bar하고 새 빈 디렉토리를 만든 /foo다음 해당 새 디렉토리에 다른 파일 시스템을 마운트하는 것입니다 /foo.

Linux에서는 바인드 마운트를 사용하여 에 무언가를 마운트한 후 원본 파일이 에 표시 되도록 /foo전체 원본 파일을 바인드 마운트할 수 있습니다 . 하지만 나머지 부분 도 거기에 표시되므로 , 등이 표시 됩니다 .//bar/foo/bar/foo//bar/bin/bar/etc

# mkdir /foo /bar
# touch /foo/file-in-root-fs.txt
# mount -t tmpfs tmpfs /foo
# mount --bind / /bar
# ls -l /bar/foo
total 0
-rw-r--r-- 1 root root 0 Dec  1 14:36 file-in-root-fs.txt

새 설치 아래에 하나의 디렉토리만 바인드 마운트할 수 있는지 확인하려고 했지만 방법을 찾지 못했습니다.

/foo설치를 먼저 바인딩 /bar한 다음 설치 하려는 직접적인 시도 /foo도 새 설치를 두 위치 모두에 복사하는 것으로 보입니다. (이것은 오래된 커널에 있지만)

# mount --bind /foo /bar
# mount -t tmpfs tmpfs /foo
# ls -ldi /foo /bar
46378188 drwxrwxrwt 2 root root 40 Dec  1 14:37 /bar/
46378188 drwxrwxrwt 2 root root 40 Dec  1 14:37 /foo/

관련 정보