거의 모든 UNIX 버전이 디렉토리 하드 링크를 허용하지 않는 이유를 이해합니다. 사실 OS X의 HFS+는 제가 아는 유일한 버전이지만 직접 수행하기는 쉽지 않습니다. 그러나 모든 파일 시스템은 이론적으로 하드 링크된 디렉토리를 지원합니다. 모든 디렉토리에는 자체에 대한 추가 하드 링크가 하나 이상 포함되어 있고 상위 디렉토리의 하위 디렉토리에 대한 추가 하드 링크가 포함되어 있기 때문입니다.
이제 나는 하드 링크가 오용될 경우 위험할 수 있다는 것을 깨달았습니다. 하드 링크는 거의 프로그램이 확인할 수 없는 순환 구조를 만들어 무한 루프에 빠질 수 있기 때문입니다. 그러나 하드 링크를 사용하여 모든 UNIX에서 작동하는 Time Machine 스타일 백업을 만들고 싶습니다. 링크는 단순히 이전 백업을 가리키기 때문에 순환 링크의 위험이 없어야 하기 때문에 이 구조는 위험하지 않다고 생각합니다. 내 경우에는 현재 rsync를 사용하여 기존 파일에 대한 하드 링크를 생성하지만 이는 특히 대규모 백업의 경우, 특히 어떤 디렉터리가 변경되지 않았는지 이미 알고 있는 경우 느리고 낭비입니다.
이를 염두에 두고 UNIX 변형에서 디렉토리 하드 링크를 강제로 생성할 수 있는 방법이 있습니까? ln
아마도 이점은 거의 없을 것입니다. 왜냐하면 많은 UNIX 버전이 하드 링크된 디렉토리를 방지하기 위해 제한을 가하고 ln
하드 링크된 디렉토리를 지원하는 버전에서는 이 작업이 실패할 수 있다고 명시하기 때문입니다. 하지만 위험을 알고 자신의 사용 사례가 안전하다는 것을 아는 사람이 실제로 링크를 만들 수 있는 방법이 있습니까? 쉘 스크립트에 적합하지만 이를 수행하기 위해 작은 프로그램을 컴파일해야 한다면 그렇게 할 수 있을 것 같습니다.
답변1
이렇게 하지 마십시오. 공간을 절약하기 위해 하드 링크를 사용하는 백업 시스템을 갖고 싶다면 rsync를 와 함께 사용하는 것이 좋습니다 --link-dest
.문서문제를 일으키지 않고 공간을 적절히 절약하십시오(예: 디렉터리 간의 하드 링크로 인해 파일 시스템이 손상되어 잘못된 inode 수를 보고할 수 있음 + fsck 실패 + 일반적으로 DAG가 아니기 때문에 의미를 알 수 없음).
답변2
대화형으로 사용할 수 없는 경우 파이프로 연결하여 출력에서 프롬프트와 에코 명령을 제거하는 데 debugfs
사용할 수 있습니다 .sed
echo 'link /foo /bar' | debugfs -w [device] | sed '$s/debugfs: $//' | sed '1d'
답변3
이 작업을 수행 하는 데 사용할 수 있습니다 debugfs
. 파일 시스템이 마운트되지 않은 상태에서 를 실행합니다 debugfs -w /dev/device_name
. 그런 다음 debugfs 프롬프트에서 link
일반적으로 디렉토리 하드 링크를 사용하는 것과 같은 방식으로 이 명령을 사용합니다. ln
(예를 들어 link /original_dir /new_link
) link
debugfs의 명령은 시스템 호출 ln
과 달리 link
디렉토리에 대한 하드 링크 생성을 허용합니다. 완료되면 를 입력하면 됩니다 quit
.
그러나 다른 사람들이 언급했듯이,원하지 않는다실제로 이렇게 하세요. 이로 인해 문제가 발생할 수 있습니다. 나는 단지 당신이 디렉토리 하드 링크를 강제로 생성하는 방법을 물었기 때문에 그렇게 말하는 것뿐입니다.
답변4
목차절대로 해서는 안 된다이에 대한 추가 하드 링크가 있습니다. 물론 생성할 수도 있지만 이는심각한파일 시스템 손상.
그 이유는 디렉토리가 항상 트리 구조를 형성해야 하기 때문입니다. 그렇지 않으면 정리를 위해 디렉토리를 건전하게 탐색하는 것이 불가능합니다. 예, 현재는 잘 작동합니다. 그러나 다음에 어떤 이유로든 fsck(8)를 실행해야 할 때 작업을 수행하지 않거나 기껏해야 가짜 링크 중 하나를 제거할 수도 있습니다.
아니요, 이것은 이론이 아닙니다. 오래 전에 Ultrix 시스템에는 일부 결함으로 인해 일부 하드 링크된 디렉토리가 있었습니다. 파일 시스템을 편집하여 정리하는 것은 재미가 없습니다.