링크, ln 명령어
System/OS - Linux

링크, ln 명령어

728x90

링크(Link)

= 하드 링크(hard link) + 심볼릭 링크(symbolic link / soft link)


하드 링크

원본 파일에 대한 directory entry를 하나 더 만드는 개념

 

원본 파일이 inode1을 사용한다고 하면, 하드 링크를 생성했을 때 하드링크파일만 하나 생성되고 같은 inode1을 공유한다.

다만, 같은 system 내에서만 사용이 가능하다. 윈도우에는 없는 개념이지만 윈도우로 예를 들면 같은 드라이브 내에 원본파일과 하드링크파일이 존재해야 사용할 수 있는것이다.

 

# ln 링크대상파일이름 링크파일이름


심볼릭 링크

Windows의 바로가기 역할을 하는 링크

 

심볼릭 링크 파일의 내용은 실제 원본 파일의 경로(원본 파일 포인터)다. 

하드 링크와 달리 원본파일의 inode1과 다른 inode2를 생성하고 데이터는 원본 파일과 연결되게 한다.

 

# ln -s 링크대상파일이름 링크파일이름


inode

linux/unix 운영체제의 파일 시스템에서 사용하는 자료구조

모든 파일, 디렉터리에는 각자 1개씩의 inode를 가지게 되고, 각 inode에는 해당 파일의 소유권, 허가권, 파일 종류 등의 정보와 해당 파일의 실제 데이터 주소가 저장되어 있다.

이러한 inode들이 모여 inode 블록을 형성하고 전체 디스크 공간의 1% 정도 차지하게 된다.

+) data 블록은 실제 데이터가 저장된 디스크 공간으로 전체 디스크의 대부분을 차지한다.


ln 명령어

파일들 간의 링크를 만드는 명령어

 

사용법

# ln [옵션] 링크대상파일(기존에 존재했던 원본파일) 링크파일(새로생성할링크파일)

1. TARGET 원본 파일으로의 링크파일 LINK_NAME을 생성한다.

2. 현재 디렉터리에 동일한 이름의 링크(?)파일 생성한다. (원본 파일의 디렉터리와 다른 디렉터리에서 실행해야 한다)

3. 4. 지정한 디렉터리(TARGET 파일이 없는 디렉터리)에 TARGET과 같은 이름의 링크파일을 생성한다.

 

옵션

man ln 했을 때 나오는 옵션들

-b --backup 과 같지만 argument는 받아들이지 않음(?..) --backup 동일명의 링크파일이 있을 때 백업파일을 만들고 링크파일 생성
-f, --force 동일 링크파일이 있을 때 기존 파일을 지우고 링크파일을 생성 -i, --interactive 동일 링크파일이 있을 때 기존 파일을 지울 것인지 확인
-s, --symbolic 심볼릭 링크파일 생성 -S 백업 파일을 생성할 때 '~'말고 원하는 단어를 지정
-d, -F root 사용자가 디렉터리에 대한 하드 링크 파일을 생성 (시스템 권한제어로 root 사용자도 실패 가능) -L TARGET 파일로 심볼릭 링크를 지정했을 때 그 심볼릭 링크파일이 가리키는 원본 파일에대한 하드링크파일을 생성
-t 4번째 ln 사용법에서 적용되며, 디렉터리를 지정해 해당 디렉터리에 원본 파일(TARGET)과 같은 이름의 링크파일을 생성
(링크파일을 생성할 디렉터리 지정)
-v 링크파일이 생성되는 과정을 보여줌
( =>: 하드링크파일생성 / ->: 심볼릭 링크파일 생성)
-P 심볼릭 링크에 직접 하드링크 생성
(예시 확인..)
-r 심볼릭링크를 생성할 때 상대경로명으로 링크
(s 옵션과 반드시 함께 써야함)

실습

디렉터리 및 파일 생성

링크 파일 만들기

# ln basefile hardlink  // basefile에 연결된 하드 링크 파일 hardlink파일 생성

# ln -s basefile softlink  // basefile로 연결되는 심볼릭 링크 파일 softlinkn 파일 생성

 

# ls -il  // inode까지 확인할 수 있도록 리스트를 출력

basefile 과 hardlink의 inode는 "202407756"으로 같은 것을 알 수 있다. 그리고 두 파일은 data 블록에 같은 원본 파일 데이터를 사용하기 때문에 61byte로 그 크기가 동일하다.

softfile의 inode는 "202407754"로 원본파일과 하드링크 파일과 다른 것을 알 수 있다. 심볼릭 링크파일은 data 블록에 별도의 원본 파일 포인터를 갖기 때문에 8byte로 크기도 다르다.

 

원본파일의 이동

# mv basefile ../   // basefile(원본파일)을 현재 디렉터리의 상위 디렉터리로 옮김

 

# ls -il

하드링크는 디렉터리에서 원본파일이 없어져도 아무 이상이 없다. 같은 system내에서는 원본파일과 inode를 공유하고 있기 때문이다.

심볼릭 링크는 반면, 디렉터리에서 원본 파일이 없어지면 연결이 끊어진다. 초기에 설정해줬던 원본파일의 포인터(주소)를 저장하고 있기 때문에 원본파일의 경로가 바뀌는 것을 반영하지 못하고 문제가 발생하게 된다.

 

심볼릭 링크 복구

# mv ../basefile .    //상위 디렉터리에 있는 basefile을 현재 디렉터리(.)로 옮김

# ls -il

# cat softlink

심볼릭 링크가 원상태로 복구되었음을 확인할 수 있다.

 

ln 명령어 2번 사용법 (하드링크)

basefile이 없던 디렉터리에서 # ln linktest/basefile 으로 경로명과 함께 TARGET 파일을 지정해주면 현재 디렉터리에 TARGET 파일과 동일한 이름으로 링크파일이 생성된다.

 

ln 명령어 2번 사용법 (심볼릭 링크)

심볼릭 링크도 생성된다. 다만, basefile의 이름으로 링크가 생성되기 때문에 앞에 생성했던 하드링크는 삭제해야했다.

 

옵션 [-b]

동일한 이름의 링크파일에 '~'를 붙인 백업 파일을 생성한다. 이 파일도 링크로 인정되기 때문에 원본파일로 통하는 entry 개수(하드 링크의 수)가 3이 된다. (홈 디렉터리의 링크파일은 삭제했다)

 

옵션 [-S]

hardlink파일의 새로운 백업파일을 생성하는데 -S 옵션으로 b로 끝나게끔 지정해 '~'이 아닌 'b'가 백업파일의 뒤에 붙는다.

 

옵션 [-t]

# ln -t 디렉터리 원본파일

지정한 디렉터리에 원본파일에 링크된 링크파일이 생성된다.

위의 예시에서는 ~/linktest2를 디렉터리로 지정해줬고 해당 디렉터리에 basefile을 링크시켜 linktest2디렉터리에 basefile이라는 이름의 하드링크파일이 생성됐다.

 

옵션 [-v]

링크파일이 생성되고 연결되는 것을 보여준다.

다른 디렉터리에 링크파일을 생성할 때 -v 옵션을 붙이면 경로명까지 확인할 수 있다.

 

옵션 [-P]

# ln -P TARGET LINK 로 사용한다 했을 때 TARGET파일이 심볼릭 링크파일일 때, TARGET(심볼릭링크)파일에 대한 하드링크파일로 LINK 파일을 생성하는 것이다.

따라서, # ln -P softlink plink를 실행하기 전후 softlink파일에 연결된 링크의 수를 보면 1 → 2 로 증가한다. plink가 softlink에 대한 하드링크파일이 되면서 심볼릭 링크파일로 따로 지정해주지 않아도 softlink파일의 것을 그대로 공유하면서 basefile에 대한 symbolic link 파일이 된다.

 

옵션 [-n]

 

 

 

옵션 [-L]

# ln -L softlink Llink 로 실행을 했을 때 softlink에 대한 하드링크파일 Llink가 생성된다고 알려주고 

inode를 확인해보면 Llink파일은 basefile의 하드링크파일로 생성되었음을 알 수 있다.

 

옵션 [-r]

r 옵션은 반드시 s 옵션과 함께 써야한다. (심볼릭링크를 생성하는 옵션이지만 직접 생성하지는 못한다.)

rlink는 상대경로명으로 ../linktest/basefile을 따르도록 되어있다.동일한 원본 파일에 링크된 그냥 심볼릭 링크 옵션만 붙인 경우와 비교를 해보면

일반 심볼릭 링크 파일은 절대경로명으로 기록되어 있다.

 

원본 파일 삭제

대부분의 원본 파일인 /root/linktest/basefile을 우선 다른 폴더로 옮겨본다. (위에서도 해봤지만..)

하드링크된 파일의 경우는 inode자체를 공유하고 있기 때문에 별다른 오류가 생기지 않는다.

반면, 심볼릭 링크 파일들은 경로명으로 저장되어 있기 때문에 원본파일이 처음 저장된 경로를 따르지 않아 문제가 발생한다.

원본파일 (basefile)을 삭제하고 난 후, 심볼릭 링크 파일들은 당연히 오류가 생긴다.

그러나 하드링크파일들은 원본파일을 삭제하더라도 그대로 유지된다. 해당 텍스트와 연결된 inode를 공유하면서 링크의 개수(entry의 개수)는 5→4로 줄어들었지만 파일은 그대로 출력된다.

 

 

 

 

참고도서: 이것이 리눅스다 with RedHat CentOS 8 (개정판) _우재남 (한빛미디어)

SMALL