원래 문제
하나의 파일 시스템에 파일이 있습니다. /data/src/file
그리고 그것을 열심히 연결하고 싶습니다 : /home/user/proj/src/file
그러나 /home
한 디스크에 있고 /data
다른 디스크 에 있으므로 오류가 발생합니다.
$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
좋아, 그래서 나는 장치간에 하드 링크 할 수 없다는 것을 배웠다. 맞는 말이다.
손에 문제
그래서 파일 시스템 src
에 있는 폴더를 멋지게 바인드 마운트 할 것이라고 생각했습니다 /data
.
$ mkdir -p /data/other/src
$ cd /home/user/proj
$ sudo mount --bind /data/other/src src/
$ cd src
$ # (now we're technically on `/data`'s file system, right?)
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
왜 여전히 작동하지 않습니까?
해결 방법
/data
바인딩 된 디렉토리 대신 “실제” 디렉토리 에있는 한 하드 링크를 만들 수 있기 때문에이 설정이 올바른 것입니다.
$ cd /data/other/src
$ ln /data/src/file .
$ # OK
$ cd /home/user/proj/src
$ ls -lh
total 35M
-rw------- 2 user user 35M Jul 17 22:22 file
$
일부 시스템 정보
$ uname -a
Linux <host> 4.10.0-24-generic #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ findmnt
.
.
.
├─/home /dev/sdb8 ext4 rw,relatime,data=ordered
│ └─/home/usr/proj/src /dev/sda2[/other/src]
│ ext4 rw,relatime,data=ordered
└─/data /dev/sda2 ext4 rw,relatime,data=ordered
$ mountpoint -d /data
8:2
$ mountpoint -d /home/usr/proj/src/
8:2
참고 : 상황을보다 명확하게하기 위해 파일과 디렉토리 이름을 수동으로 변경 했으므로 명령 판독 값에 오타가있을 수 있습니다.
답변
코드 에 실망스러운 주석이 있습니다 . 타임 바인드 마운트가 v2.4에서 구현되었으므로 아무도 유용하다고 생각하지 않습니다. 분명히 당신이해야 할 모든 것은 .mnt->mnt_sb
그것이 말하는 곳에서 대체 하는 것입니다 .mnt
…
하위 트리 주위에 보안 경계를 제공하기 때문입니다.
추신 : 그것은 꽤 많이 논의되었지만 검색을 피하기 위해 : 예를 들어 mount –bind / tmp / tmp; 이제 사용자는 / tmp에 쓰기 가능 권한이 있어도 루트 fs가없는 다른 위치에 대한 링크를 만들 수없는 상황이 발생했습니다. 비슷한 기술이 다른 격리 요구에 적용됩니다. 기본적으로 지정된 하위 트리로 이름 바꾸기 / 링크를 제한 할 수 있습니다. IOW는 고의적 인 기능입니다. 1 년 후 메인 트리에서 물건을 재배치하는 방법에 관계없이 많은 나무를 chroot에 묶고 예측 가능한 제한을 얻을 수 있습니다.
– 알 비로
스레드 아래에 구체적인 예가 있습니다.
mount -r –bind가 제대로 작동 할 때마다 (페이지 캐시 공유를 허용하면서 chroot jails에 필요한 공유 라이브러리 사본을 배치하는 데 사용)이 기능은 보안을 손상시킵니다.
mkdir /usr/lib/libs.jail for i in $LIST_OF_LIBRARIES; do ln /usr/lib/$i /usr/lib/libs.jail/$i done mount -r /usr/lib/libs.jail /jail/lib chown prisoner /usr/log/jail mount /usr/log/jail /jail/usr/log chrootuid /jail prisoner /bin/untrusted &
보호는 충분하지만 포로가 /jail/lib/libfoo.so (쓰기는 EROFS를 반환합니다)를 / jail / usr / log에 링크하여 잠재적으로 쓰기 가능한 곳을 피하는 것이 좋습니다.
답변
교차 장치 연결을 수행 할 수없는 이유는 모호성을 유발하기 때문입니다. 파일의 디렉토리 항목에는 (단순 시스템에서) 관련된 파일의 i- 노드 번호가 포함됩니다. 하드 링크 (다른 디렉토리 항목 만)도 동일한 i- 노드 번호를 포함해야합니다. 이것은 훌륭하지만 i- 노드 번호는 단일 파일 시스템 내에서만 고유합니다 (일반적으로 1에서 시작하는 밀도가 높습니다).
바인드 마운트는 해당 문제를 해결하지 않습니다. 예, 그것은 일종의 구조의 ‘소설’을 구성하지만, 그렇지 않은 것은 하나의 파일 시스템에서 모든 i- 노드의 번호를 다시 매겨서 관련된 두 파일 시스템에서 모두 고유해야합니다! 어리석은 일입니다.
이 제한 사항은 항상 UNIX 시스템에있었습니다. 이 문제를 해결하기 위해 심볼릭 링크가 부분적으로 발명되었습니다. 나는 그들이 기능적으로 완전히 동일하지 않다는 것을 알고 있지만 일반적으로 괜찮습니다.
심볼릭 링크를 사용해보십시오? ( ln -s
)