Ln 명령어

ln 명령어를 살펴 보던 중 …

"심볼릭 링크"와 "하드 링크"라는 말이 있던데…

이 두 가지의 차이가 무엇인지 명확하게 구분이 안돼네요.

좀 더 알아 보기 쉽게 설명해 주실 분 있나요?

제가 어디선가 건지 옛날 리눅스 관련 문서인데…

올려도 되는 건지… 저자가 누구인지도 모르고…

ln 명령어 관련 부분을 오려서 올립니다.


3.13 ln

앞에서 파일에 대해 언급할때에 파일마다 고유의 번호를 가진다고 했죠?
이 번호는 파일마다 전부 다릅니다. 이 번호를 inode라는 용어로 정의하
는데 "ls" 라는 명령어에 "i"라는 옵션을 붙이면 이 번호가 화면에 출력
됐을 겁니다.

ls -i [Enter]

10241 bin 11 home 168 test.txt

보면 알겠지만 파일만 inode를 가진 것이 아니라 디렉토리도 inode를 가지죠?
리눅스에서는 모든 디바이스나 디렉토리를 파일개념으로 인식하기 때문에
전부 inode를 가지게 됩니다.
자 왜 우리가 지금 inode에 대해서 언급을 하냐면 이제부터 배울 "ln" 이라는
명령어가 이 inode와 연관이 있기 때문입니다. 만약에 inode가 같은
파일이 있다면 파일이름이 다르더라도 이 파일은 같은 파일이 됩니다.
짐작이 잘 가지 않죠? 자 그러면 간단한 예를 보도록 합시다.

ls [Enter]

bin home test.txt

cat test.txt [Enter]

This is a test file.

ln test.txt test1.txt [Enter]

ls [Enter]

bin home test.txt test1.txt

보면 알겠지만 "ln"이라는 명령어로 test1.txt 파일을 생성했습니다.
생성할 파일을 마지막 아규먼트로 지정하면 되거든요. 자 그러면 파일의
inode를 확인해 봅시다.

ls -i [Enter]

10241 bin 11 home 168 test.txt 168 test1.txt

자 보면 알겠지만 정말로 두 파일의 inode가 같죠? 이 두 파일은 같은 파일
입니다. 물론 파일의 내용도 당연히 같죠.

cat test1.txt [Enter]

This is a test file.

정말로 같죠? 그러면 한 번 나중에 만든 test1.txt 파일을 필자가 수정해
보도록 하겠습니다. (끝에 -modified 삽입)

cat test1.txt [Enter]

This is a test file. -modified

수정한 다음에 그 내용을 출력하고 있습니다. 그러면 이번에는 수정을 하
지 않은 test.txt 파일의 내용을 확인해 보도록 하겠습니다.

cat test.txt [Enter]

This is a test file. -modified

정말로 수정이 되었죠? 신기하군요. 그러면 이번에는 test1.txt 파일을
삭제해 보겠습니다.

rm test1.txt [Enter]

ls [Enter]

bin home test.txt

cat test.txt [Enter]

This is a test file. -modified

삭제하는 것은 별로 영향을 받지 않는다는 것을 알수 있습니다. 그러면
그 반대의 경우를 보도록 합시다.

ls [Enter]

bin home test.txt test1.txt

rm test.txt [Enter]

cat test1.txt [Enter]

This is a test file. -modified

역시 영향을 받지 않는군요. 일단 "ln"명령어로 같은 파일을 생성하면
수정시 같이 수정되지만 삭제할때에는 아무런 영향이 없다는 것을 알 수
있습니다. 위와같이 "ln"이라는 명령어로 연결된 새로운 파일을 생성하는
것을 파일링크라는 용어로 표현합니다. 특히 같은 inode를 같게 만드는
위와같은 파일링크를 하드링크라고 말합니다. 이 하드 링크로 파일을
생성하면 inode가 같은 동일한 파일과 마찬가지로 되기 때문에 파일의
크기 또한 같습니다.

ls -l test* [Enter]

-rw-r–r-- 2 root root 37 Oct 16 20:43 test.txt
-rw-r–r-- 2 root root 37 Oct 16 20:43 test1.txt

자 그러면 이번에는 파일링크중 또 다른 심볼릭 링크에 대한 것을 알아
보겠습니다. 역시 이것도 같은 파일을 생성하는 것과 같습니다. 그러나
inode는 다릅니다. 그러니 완벽하게 같은 파일은 아니죠. 그러면 왜 같
은 파일이라는 말을 사용할까요? 그것은 간간한 예를 보면 금방 알수 있
습니다.

ls [Enter]

bin home test.txt

ln -s test.txt test1.txt [Enter]

cat test.txt [Enter]

This is a test file.

cat test1.txt [Enter]

This is a test file.

자 한 번 보기 바랍니다. "ln" 이라는 명령어에 "s"라는 옵션을 붙여서
사용했죠? 이 옵션을 붙이게 되면 심볼릭 링크된 파일을 생성하게 되는
것입니다. 역시 파일의 내용은 같군요. 그러면 심볼릭링크된 파일의 내
용을 필자가 한 번 바꿔 보겠습니다.

cat test1.txt [Enter]

This is a test file. -modified

cat test.txt [Enter]

This is a test file. -modified

test1.txt 파일의 내용을 바꾸기만 했는데 test.txt 파일의 내용도 바뀌
었죠? 여기까지는 하드 링크때와 크게 달라진 점을 찾을수 없을 겁니다.
그러면 한 번 파일의 inode를 확인해 보기 바랍니다.

ls -i [Enter]

10241 bin 11 home 168 test.txt 165 test1.txt

앞에서 언급한것과 마찬가지로 inode는 다르군요. 그러면 분명히 서로 다른
파일인데 어떻게 하나의 파일을 수정하면 다른 파일도 같이 수정될까요?
그것은 간단합니다. 우리가 생성한 test1.txt 파일은 단지 test.txt 파일을
가르키는 역할만 하는 것입니다. 즉 우리가 test1.txt 파일을 수정했다는
것은 test1.txt 파일이 가르키는 파일을 수정한것과 마찬가지 라는 것입니다.
어떤 개념인지 이해가 갑니까?

ls -l test* [Enter]

-rw-r–r-- 1 root root 37 Oct 16 21:00 test.txt
lrwxrwxrwx 1 root root 8 Oct 16 20:58 test1.txt -> test.txt

보면 알겠지만 파일의 크기가 다릅니다. 심볼릭 링크된 파일이 훨씬 크기가 작죠?
단지 가르키기만 하고 그것에 대한 정보만 가지고 있기 때문에 파일 크기가 작은 것입니다.

파일과 디렉토리의 내용을 긴 형테로 출력해서 보면 제일 앞에 "-"으로 되어 있는것도
있고 "d"라고 되어 있는 것도 있을 겁니다. "-"으로 되어 있는 것은 파일임을 의미하는
것이고 "d"라고 되어 있는 것은 디렉토리 를 의미한다고 앞에서 약간 언급했죠?
여기 심볼릭 링크된 파일을 보게 되면 "l"로 되어 있을 겁니다.
이것은 바로 심볼릭 링크를 의미하는 것입니다.

자 그러면 이번에는 심볼릭 링크된 파일을 삭제해 보겠습니다.

rm test1.txt [Enter]

cat test.txt [Enter]

This is a test file. -modified

별다른 반응은 없죠? 이번에는 그 반대의 경우를 생각해 봅시다.

rm test.txt [Enter]

cat test1.txt [Enter]

cat: test1.txt: No such file or directory

아마 여러분들도 짐작을 하고 있을 겁니다. 가르키고 있는 파일이 삭제
되어서 존재하지 않은데 그것을 가르키는 파일이 의미가 있겠습니까?
당연히 파일을 찾을수 없다는 메시지가 나오는 겁니다.

이제 하드 링크와 심볼릭 링크의 차이점을 알겠죠?

이론적, 원론적 설명은 구글서 검색하면 많이 나오고

그냥 쉽게 설명 해보자면

소프트링크 : 연결할 진짜 파일 정보만 가진 가짜 파일을 만든다. : 거의 이거를 만든다
( 가짜 지우면 진짜는 존재 , 진짜 지우면 가짜는 깨져 허당됨 , 거의 심볼릭 링크 만드는것은 이거를 만든다 )

하드링크 : 똑같은 파일을 복사한 다음 사본을 생성 서로 연결 함
( 진짜 가짜가 없고 아무거나 수정해도 상대도 서로 바꾸며 하나를 지워도 다른 하나는 온전하게 존재 한다)

[code:25tgnthq]
직접 해보면서 느끼면 좋습니다.
touch 1
ln 1 2
ln -s 1 3
ls -Fial
동일 inode 를 확인 할 수 있을 것입니다.
안에 내용 수정도 서로 해 보십시요[/code:25tgnthq]

[quote="giddyman":25tgnthq]제가 어디선가 건지 옛날 리눅스 관련 문서인데…

올려도 되는 건지… 저자가 누구인지도 모르고…

ln 명령어 관련 부분을 오려서 올립니다.[/quote:25tgnthq] 복사 붙이기 신공 후에도 조금 정리 해주는 센스를 …

[quote="강분도":fjo0cqix]
하드링크 : 똑같은 파일을 복사하여 만들어 서로 연결 함
[/quote:fjo0cqix]

괜히 태클을 걸려고 하는 건 아니고요.

제가 이해하는 거랑 다르게 말씀하셔서요.

하드링크가 파일을 복사한다는 말이 맞는 건가요?

제가 이해하기로는 하나의 저장소(클러스터)에 두 개의 포인터(파일이름)가 있다는 의미로 받아 들여지는 데요.

제가 말하는 용어가 맞는 지는 모르겠지만요.

제가 이해하는 바로는 복사한다는 건 옳지 않은 것 같은데요.

[quote="giddyman":1lhbd823]

제가 이해하는 바로는 복사한다는 건 옳지 않은 것 같은데요.[/quote:1lhbd823]
맞습니다 설명이 틀렸군요 복사가 아니죠 복사한 다음 사본을 생성 연결하는 방식이죠
오히려 복사와 달리 공간을 차지 하지 않는다는 차이가 있고

음 수정을 그럼 어찌 해보나 !

아 그리고 정리하는 센스는 = 줄을 좀 정리 하라는 것입니다.

강분도님. 깔끔하게 정리해 봤습니다. 예문도 좀 간단하도록 손 대보고요.

천하의 강분도님의 실수를 잡아서 기쁜 마음으로…ㅋ

[quote="giddyman":16277pgw]강분도님. 깔끔하게 정리해 봤습니다. 예문도 좀 간단하도록 손 대보고요.

천하의 강분도님의 실수를 잡아서 기쁜 마음으로…ㅋ[/quote:16277pgw]
아이고 글 읽기가 좋군요 !
그리고 음
저는 철학전공이라 컴퓨터 이론 실기 다 엉망입니다.
언젠가 기회가 되면 이 이야기를 해보도록 하지요 :roll:

우왕. 철학 전공! 전 철학이라고는 개똥 철학인 다인데 ㅎㅎㅎ
왠지 있어 보여요.