본문 바로가기

CentOS/Study

[Study20]리눅스 파일 구조 이해하기 - 링크 파일 / 디바이스 파일 / ln

반응형

링크파일

리눅스 운영 체제에서는 하드 링크(Hard link)와 심볼릭 링크(Symbolic link) 두 가지 유형의 링크 파일이 존재합니다.

링크 파일은 다른 파일에 대한 포인터로서, 원본 파일을 가리키고 있습니다.

하드 링크는 같은 파일 시스템 내에서 원본 파일과 완전히 동일한 inode 번호를 가진 새로운 파일을 만드는 것입니다.

하드 링크를 사용하면, 하나의 파일에 대해 여러 개의 이름을 가지게 됩니다.

하드 링크는 원본 파일과 동일한 권한을 갖습니다.

그러므로, 하드 링크 파일을 삭제하면 원본 파일도 함께 삭제됩니다.

심볼릭 링크는 원본 파일을 가리키는 새로운 파일을 만드는 것입니다.

심볼릭 링크 파일은 원본 파일의 경로를 가리키고 있으며, 이 경로는 상대적인 경로 또는 절대적인 경로일 수 있습니다.

심볼릭 링크는 원본 파일의 inode 번호 대신에 원본 파일의 경로를 가리키기 때문에, 원본 파일이 삭제되거나 이동되어도 심볼릭 링크 파일에서는 원본 파일을 찾을 수 없게 됩니다.

심볼릭 링크는 하드 링크와 달리 원본 파일과 다른 권한을 가질 수 있습니다.

심볼릭 링크의 권한은 링크 파일에 대한 권한이므로, 원본 파일의 권한과는 무관합니다.

이러한 링크 파일은 파일 및 디렉토리를 효율적으로 관리하고, 파일에 대한 액세스를 편리하게 할 수 있습니다.

그러나 링크 파일을 사용할 때는 주의해야 합니다.

예를 들어, 심볼릭 링크를 사용하면 원본 파일이 삭제되었을 때 링크 파일이 무용지물이 되는 등의 문제가 발생할 수 있습니다.

또한 링크 파일을 사용할 때 보안 취약점을 유발할 수 있는 위험성도 존재합니다.

따라서, 링크 파일을 사용할 때는 신중하게 고려해야 합니다.

 

링크 파일 종류 설명
하드 링크 파일(Hard Link File) 같은 파일 시스템 내에서 원본 파일과 완전히 동일한 inode 번호를 가진 새로운 파일을 만들어 여러 개의 이름으로 참조 가능
심볼릭 링크 파일(Symbolic Link File), 소프트 링크 파일(Soft Link File) 원본 파일의 경로를 가리키는 새로운 파일을 만들어 원본 파일을 참조할 수 있게 함

 

하드 링크 (Hard link)

원본 파일의 경로를 저장하고 있는 파일이다.

파일을 실제 경로가 아니라 사용하기 편리한 다른 경로로 접근할 수 있도록 지정하는 명령어이다.

링크 파일의 type은 "ls -l" 했을 때 맨 앞의 글자가 "l"로 표시된다.

하드 링크는 원본 파일이 수정될 경우, 하드 링크된 파일도 원본과 동일하게 변경되며 항상 같은 내용을 유지할 수 있다.

이는 하나의 파일을 여러 개의 이름으로 참조하게 하여, 파일을 공유하고자 할 때 유용하게 사용된다.

예를 들어, 하나의 파일을 여러 개의 디렉토리에서 동시에 사용하고자 할 때, 그리고 여러 개의 프로세스가 하나의 파일을 동시에 사용하고자 할 때 하드 링크를 사용할 수 있다. 하드 링크는 디렉토리에는 만들 수 없다.

하드 링크는 파일명이 하나 더 만들어져 동일한 I-node 번호를 가르치게 된다.

I-node는 파일이나 디렉토리의 내부 구조를 나타내는 데이터 구조체로, 파일 시스템에서 파일이나 디렉토리의 메타데이터를 저장한다.

하드 링크는 같은 I-node 번호를 저장하고 있으므로 원본 파일을 지워도 원본파일의 파일명만 지워질 뿐 inode가 지워지는 것이 아니기 때문에 링크로 inode값을 가르키는 링크 파일에 영향을 미치지 않는다.

원본 파일과 링크 파일의 권한은 항상 같다. 그 이유는 I-node에 권한이 저장되어 있기 때문이다.

즉 파일명에 대해서 권한을 부여하는 것이 아니고 inode번호에 대해 권한을 설정하기 때문이다.

이는 각기 다른 이름을 가진 하드 링크의 파일명에 대한 권한을 변경해도 파일명에 권한 설정이 되는 것이 아니기 때문에 서로 다른 이름을 가진 하드 링크 파일의 권한은 동일하게 유지된다.

 

심볼릭 링크, 소프트 링크 (Symbolic link, soft link)

심볼릭 링크는 일반적으로 링크의 종류 중 가장 많이 사용됩니다.

이는 불필요한 파일 복사를 하지 않아도 되기 때문입니다.

보통 여러 디렉토리에서 동일한 라이브러리를 요구할 경우나, 하나의 파일을 여러 사람이 공통으로 사용할 경우에 자주 사용됩니다.

이와 같은 경우에 심볼릭 링크를 사용하면, 파일의 복사 없이도 파일을 공유할 수 있습니다.

소프트 링크는 심볼릭 링크라고도 불립니다.

이 링크 파일에는 원본 파일에 대한 포인팅 정보만 들어 있습니다.

원본 파일의 내용이 변경되면, 링크 파일도 함께 변경됩니다.

소프트 링크의 퍼미션은 모든 사용자에게 모든 권한(rwxrwxrwx=777)을 부여합니다.

심볼릭 링크의 크기는 포인팅 정보만 포함하므로, cat 명령어로 보여지는 정보의 양과 상관없이 동일한 크기를 가집니다. 이로 인해, 윈도우에서 바탕화면에 바로 가기를 만드는 것처럼 많은 리소스를 차지하지 않고, 디스크 공간의 일부만 차지하게 됩니다.

만약 원본 파일이 삭제된다면, 링크 파일에 영향을 미치게 됩니다.

이를 방지하기 위해서는, 원본 파일이 삭제되지 않도록 유지하는 것이 좋습니다.

소프트 링크 파일의 권한은 항상 모든 권한입니다.

 

소프트 링크 파일의 퍼미션은 항상 777인 이유는?

소프트 링크는 자원을 공유하는 데 많이 사용되는 기술입니다.

다른 사용자들이 해당 자원에 접근하고 사용할 수 있도록 링크를 공유하는 것입니다.

하지만 소프트 링크 파일은 원본 파일의 inode 경로를 포함하고 있기 때문에 링크 파일의 퍼미션이 모든 권한으로 설정되어 있더라도 원본 파일의 권한을 따르게 됩니다.

그러므로 소프트 링크 파일의 퍼미션을 변경하면 원본 파일의 퍼미션도 함께 변경되게 됩니다.

그렇다면, 왜 소프트 링크 파일의 퍼미션은 항상 777인 것일까요?

이것은 단순히 모든 사용자가 해당 자원에 접근할 수 있도록 하기 위함입니다.

하지만 이것이 항상 안전한 것은 아닙니다.

따라서, 보안을 강화하기 위해서는 소프트 링크 파일의 퍼미션을 더 제한적으로 설정하는 것이 좋습니다.

이렇게 하면 불필요한 보안 문제를 방지할 수 있습니다.

 

# cd /etc/
# ls -l grub.conf
lrwxrwxrwx 1 root root 22  10월 22 10:11 grub.conf -> ../boot/grub/grub.conf
                                         링크파일     원본파일
# ls -l /boot/grub/grub.conf
-rw------- 1 root root 600  10월 22 10:11 /boot/grub/grub.conf
# su - fedora
$ cat /etc/grub.conf
cat: /etc/grub.conf: 허가 거부됨

이 예시에서는 링크 파일과 권한을 확인하기 위해 다양한 Bash 명령어들이 사용됩니다.

첫번째 명령어인 "cd /etc/"는 현재 디렉터리를 /etc/로 변경하는 명령어입니다.

두번째 명령어인 "ls -l grub.conf"는 grub.conf 파일의 심볼릭 링크 파일과 원본 파일을 나열해줍니다.

세번째 명령어인 "ls -l /boot/grub/grub.conf"는 grub.conf 파일의 권한을 나열합니다.

권한은 "rw-------"로 설정되어 있으며, 이는 root 사용자만 파일을 읽고 쓸 수 있다는 것을 의미합니다.

마지막으로 "su - fedora" 명령어를 통해 fedora 사용자 계정으로 전환합니다.

그리고 "cat /etc/grub.conf" 명령어를 실행하려고 하지만, 해당 사용자는 파일의 읽기 권한이 없어서 허가 거부 메시지가 출력됩니다.

심볼릭 링크는 파일 및 디렉터리에 대한 편리한 단축키를 제공할 수 있지만, 이러한 방식은 보안 관련 위험성을 내포하기도 합니다.

이 예제에서는 grub.conf의 심볼릭 링크가 원본 파일에 대한 대체 경로를 제공하지만, 잠재적인 보안 취약점에 대한 추가적인 진입점을 만들게 됩니다.

시스템 관리자는 심볼릭 링크 및 다른 파일 시스템 구조를 주의 깊게 관리하여 시스템의 안정성과 보안을 보장해야 합니다.

 

디바이스 파일

리눅스에서는 시스템 내의 디바이스와 상호작용하기 위해 디바이스 파일이라는 것을 사용합니다.

디바이스 파일은 블럭 디바이스 파일과 캐릭터 디바이스 파일로 구분됩니다.

블럭 디바이스 파일은 블럭 단위(보통 4K)로 I/O가 발생하며, 디스크 처럼 데이터를 블록 단위로 처리하는 장치에서 사용됩니다.

캐릭터 디바이스 파일은 바이트 단위(보통 512B)로 I/O가 발생하며, 터미널, 마우스, 키보드 등과 같이 데이터를 바이트 단위로 처리하는 장치에서 사용됩니다.

각 디바이스 파일은 Major Device 번호와 Minor Device 번호를 가지고 있습니다.

Major Device 번호는 장치의 종류를 나타내며, Minor Device 번호는 동작 방법이나 개별적인 장치의 종류를 나타냅니다. 예를 들어, /dev 디렉토리에는 블록 디바이스 파일과 캐릭터 디바이스 파일의 목록이 있으며, 블록 장치에는 플로피 디스크와 하드 드라이브를 나타내는 fd0 및 sda와 같은 장치가 포함됩니다.

문자 장치에는 console, kmsg, tty, mem, port, random과 같은 입력/출력 장치와 오디오 장치 등이 포함되어 있습니다.

또한 /dev 디렉토리에는 /dev/full, /dev/null, /dev/zero와 같은 다양한 용도로 사용되는 특수 파일도 있습니다.

예를 들어, /dev/full에 쓰기를 하면 "디스크가 가득 찼습니다" 오류가 발생하고, /dev/null에 쓰기를 하면 데이터가 삭제됩니다.

이러한 장치 파일은 리눅스 운영 체제의 적절한 작동에 필수적이며, 많은 시스템 수준 프로그램 및 유틸리티에서 사용됩니다.

 

종류 I/O 단위 Major Device 번호 Minor Device 번호
블럭 디바이스 파일(Block Device File) 블럭 단위 (4K) 장치의 종류 개별적인 장치의 종류 또는 동작 방법의 차이
캐릭터 디바이스 파일(Character Device File) = Raw Device File 바이트 단위 (512B) 장치의 종류 개별적인 장치의 종류 또는 동작 방법의 차이

 

디바이스 파일(장치 파일, Device File)은 블럭 디바이스 파일(Block Device File)과 캐릭터 디바이스 파일(Character Device File)로 구분됩니다.

블럭 디바이스 파일은 블럭 단위로 I/O가 발생하며, 디스크 디바이스(Disk Device)일 경우 I/O 단위는 4K(4096 Bytes)입니다.

캐릭터 디바이스 파일은 바이트 단위로 I/O가 발생하며, 디스크 디바이스(Disk Device)일 경우 I/O 단위는 512 Bytes(1 Sector = 512 bytes)입니다.

Major Device 번호는 장치의 종류를 의미하며, 장치의 종류가 다르면 Major Device 번호가 다릅니다.

Minor Device 번호는 개별적인 장치의 종류 또는 동작 방법의 차이를 의미하며, 같은 장치라도 동작 방법이 다르면 Minor Device 번호가 다릅니다.

예를 들어, /dev 디렉토리에 있는 블록 디바이스 파일과 캐릭터 디바이스 파일의 목록을 확인할 수 있습니다.

블록 장치에는 플로피 디스크와 하드 드라이브를 나타내는 fd0 및 sda와 같은 장치가 포함됩니다. 문자 장치에는 console, kmsg, tty, mem, port, random과 같은 입력/출력 장치와 오디오 장치 등이 포함되어 있습니다.

또한 /dev 디렉토리에는 /dev/full, /dev/null, /dev/zero와 같은 다양한 용도로 사용되는 특수 파일도 있습니다. 예를 들어, /dev/full에 쓰기를 하면 "디스크가 가득 찼습니다" 오류가 발생하고, /dev/null에 쓰기를 하면 데이터가 삭제됩니다.

이러한 장치는 Linux 운영 체제의 적절한 작동에 필수적이며, 많은 시스템 수준 프로그램 및 유틸리티에서 사용됩니다.

 

블럭 디바이스/캐릭터 디바이스 파일 확인

이 파일 확인 단계에서는 블럭 디바이스와 캐릭터 디바이스를 대상으로 합니다.

이 파일들은 게임의 핵심 요소들이며, 파일이 정확히 작동하는지 확인하는 것이 중요합니다.

블럭 디바이스는 블럭을 생성하거나 파괴하는 것과 관련되어 있습니다.

이 작업을 수행하기 위해서는 파일이 올바르게 작동해야 합니다.

캐릭터 디바이스는 캐릭터를 생성하거나 업그레이드하는 것과 관련되어 있습니다.

이 작업도 블럭 디바이스와 마찬가지로, 파일이 정확히 작동하는지 확인해야 합니다.

그렇지 않으면 게임에 문제가 발생할 수 있습니다.

/dev 디렉토리에 있는 문자 장치와 블록 장치 목록입니다.

 

블록 장치:

# ls -l /dev | grep '^b'
brw-rw---- 1 root floppy   2,    0  6월 11 13:02 fd0
brw-rw---- 1 root floppy   2,   84  6월 11 13:02 fd0u1040
brw-rw---- 1 root floppy   2,   88  6월 11 13:02 fd0u1120
brw-rw---- 1 root floppy   2,   28  6월 11 13:02 fd0u1440
brw-rw---- 1 root floppy   2,   44  6월 11 13:02 fd0u1680
..... (중략) .....
brw-rw---- 1 root floppy   2,   68  6월 11 13:02 fd0u830
brw-rw---- 1 root disk    22,    0  6월 11 13:02 hdc
brw-r----- 1 root disk     7,    0  6월 11 13:02 loop0
brw-r----- 1 root disk     7,    1  6월 11 13:02 loop1
..... (중략) .....
brw-r----- 1 root disk     9,    0  6월 11 13:02 md0
brw-r----- 1 root disk     1,    0  6월 11  2010 ram0
brw-r----- 1 root disk     1,    1  6월 11  2010 ram1
brw-r----- 1 root disk     1,   10  6월 11  2010 ram10
brw-r----- 1 root disk     1,   11  6월 11  2010 ram11
..... (중략) .....
brw------- 1 root root     8,    1  6월 11  2010 root
brw-r----- 1 root disk     8,    0  6월 11  2010 sda
brw-r----- 1 root disk     8,    1  6월 11 13:02 sda1
brw-r----- 1 root disk     8,    2  6월 11  2010 sda2
..... (중략) .....

 

문자 장치:

# ls -l /dev | grep '^c'
crw-rw---- 1 root audio   14,   12  6월 11 13:02 adsp
crw------- 1 root root    10,  175  6월 11 13:02 agpgart
crw-rw---- 1 root audio   14,    4  6월 11 13:02 audio
crw------- 1 root root    10,   61  6월 11 13:02 autofs
crw------- 1 root root     5,    1  6월 11 13:02 console
crw-rw---- 1 root root    14,    9  6월 11 13:02 dmmidi
crw-rw---- 1 root audio   14,    3  6월 11 13:02 dsp
crw-rw-rw- 1 root root     1,    7  6월 11 13:02 full
crw------- 1 root root    10,  228  6월 11 13:02 hpet
crw------- 1 root root     1,   11  6월 11 13:02 kmsg
crw-rw---- 1 root lp       6,    0  6월 11 13:02 lp0
crw-r----- 1 root kmem     1,    1  6월 11 13:02 mem
crw-rw---- 1 root audio   14,    2  6월 11 13:02 midi
crw-rw---- 1 root audio   14,    0  6월 11 13:02 mixer
crw-rw-rw- 1 root root     1,    3  6월 11 13:02 null
crw-rw---- 1 root root    10,  144  6월 11 13:02 nvram
crw------- 1 root root     1,   12  6월 11 13:02 oldmem
crw-rw---- 1 root lp      99,    0  6월 11 13:02 parport0
crw-rw---- 1 root lp      99,    1  6월 11 13:02 parport1
crw-rw---- 1 root lp      99,    2  6월 11 13:02 parport2
crw-rw---- 1 root lp      99,    3  6월 11 13:02 parport3
crw-r----- 1 root kmem     1,    4  6월 11 13:02 port
crw------- 1 root root   108,    0  6월 11 13:02 ppp
crw-rw-rw- 1 root tty      5,    2  6월 11 13:59 ptmx
crw-rw-rw- 1 root root     1,    8  6월 11 13:02 random
crw------- 1 root root   162,    0  6월 11 13:02 rawctl
crw-r--r-- 1 root root    10,  135  6월 11  2010 rtc
crw-rw---- 1 root audio   14,    1  6월 11 13:02 sequencer
crw-rw---- 1 root audio   14,    8  6월 11 13:02 sequencer2
crw------- 1 root root    21,    0  6월 11 13:02 sg0
crw------- 1 root root    10,  231  6월 11 13:02 snapshot
crw------- 1 root root     4,    0  6월 11  2010 systty
crw-rw-rw- 1 root tty      5,    0  6월 11 13:02 tty
crw-rw---- 1 root root     4,    0  6월 11  2010 tty0
crw------- 1 root root     4,    1  6월 11 13:02 tty1
crw-rw---- 1 root tty      4,   10  6월 11  2010 tty10
crw-rw---- 1 root tty      4,   11  6월 11  2010 tty11
..... (중략) .....
cr--r--r-- 1 root root     1,    9  6월 11 13:02 urandom
crw------- 1 root root   442,    0  6월 11 13:02 usbdev1.1_ep00
crw------- 1 root root   442,    0  6월 11 13:02 usbdev1.1_ep81
crw------- 1 root root   442, 2048  6월 11 13:02 usbdev2.1_ep00
crw------- 1 root root   442, 2048  6월 11 13:02 usbdev2.1_ep81

문자 장치에는 console, kmsg, tty, mem, port, random과 같은 입력/출력 장치와 오디오 장치 등이 포함되어 있습니다.

블록 장치에는 플로피 디스크와 하드 드라이브를 나타내는 fd0 및 sda와 같은 장치가 포함됩니다.

또한 /dev 디렉토리에는 /dev/full, /dev/null, /dev/zero와 같은 다양한 용도로 사용되는 특수 파일도 있습니다.

예를 들어, /dev/full에 쓰기를 하면 "디스크가 가득 찼습니다" 오류가 발생하고, /dev/null에 쓰기를 하면 데이터가 삭제됩니다.

이러한 장치는 Linux 운영 체제의 적절한 작동에 필수적이며, 많은 시스템 수준 프로그램 및 유틸리티에서 사용됩니다.

 

ln 명령어

ln 명령어는 파일들 사이에 링크를 생성하는 유용한 도구입니다.

하드 링크와 심볼릭 링크 두 가지 유형의 링크를 생성할 수 있습니다.

하드 링크는 두 파일 간에 단순한 링크를 생성하며, 같은 inode와 동일한 내용을 공유합니다. 반면, 심볼릭 링크는 다른 파일을 가리키는 포인터로 작동하며, 파일 자체가 아닌 파일의 경로를 가리킵니다.

하드 링크를 생성하려면 ln file1 file2 형식을 사용합니다. 이렇게 하면 file2라는 새 링크가 생성되어 file1과 동일한 inode를 가리킵니다. 한 파일을 수정하면 다른 파일에서도 변경 사항이 반영됩니다.

심볼릭 링크를 생성하려면 ln -s file1 file2 형식을 사용합니다.

이렇게 하면 file2라는 새 링크가 생성되어 file1의 경로를 가리킵니다.

심볼릭 링크는 링크되는 파일이 이동하거나 이름이 변경될 수 있는 상황에서 유용합니다.

전반적으로, ln 명령어는 Linux 시스템에서 파일들 간에 링크를 생성하는 강력한 방법을 제공합니다.

 

[명령어 형식]

# ln file1 file2
# ln -s file1 file2

(하드링크)  # ln file1 file2
(심볼릭링크)# ln –s file1 file2

하드링크와 심볼릭링크는 파일을 연결할 때 사용합니다. 하드링크는 두 개 이상의 파일이 같은 inode 번호를 가지고 있으며, 실제로는 같은 파일을 가리키고 있습니다. 하드링크는 원본 파일과 동일한 권한과 소유자를 가지며, 파일 크기가 변경되면 원본 파일 크기도 변경됩니다. 심볼릭링크는 원본 파일을 가리키는 새로운 파일을 만들어 내는 것입니다. 원본 파일이 삭제되면 심볼릭링크는 더 이상 유효하지 않게 됩니다.

 

[명령어 옵션]

옵션 설명
-b, --backup 대상 파일이 있다면 백업파일을 생성한다.
-f, --force 링크를 생성할 대상 파일이 있더라도 강제적으로 새로운 링크를 생성한다.
-i, --interactive 링크를 생성할 대상 파일이 있을 경우, 삭제 유무를 사용자에게 물어 본다.
-n, --no-dereference 링크할 원본이 심볼릭 파일이면, 그 심볼릭 파일의 대상 파일을 추적하여 링크한다.
-s, --symbolic 링크할 원본이 심볼릭 파일이면, 심볼릭 파일을 링크한다.
-S, --suffix backup-suffix 링크를 생성할 대상 파일이 이미 있을 경우, 이전의 대상파일을 백업할 파일의 확장자를 지정한다.
-V, --version-control {numbered, existing,simple} 백업하는 방법을 지정한다. t,numbered : 항상 번호로 된 백업파일을 만든다. nil, existing : 대상파일이 있을 경우에만 백업파일을 만든다. never, simple : 간단한 백업을 만든다.

 

하드링크 실습 준비

# cd /test ; rm –rf /test/*

# echo 1111 > file1
# ls –l file1
-rw-r--r-- 1 root root 5 Feb 13 13:06 file1
# cat file1
1111

위의 코드는 터미널에서 실행할 수 있습니다. 먼저 /test 디렉토리에 이동하여 모든 파일을 삭제합니다.

그리고 file1에 1111이라는 내용을 입력하고, ls -l 명령어를 사용하여 file1 파일의 정보를 출력합니다.

마지막으로 cat 명령어를 사용하여 file1 파일의 내용을 출력합니다.

 

하드링크 실습

# ln file1 file2
# ls -li
5489017 -rw-r--r-- 2 root root 5 Feb 13 13:06 file1
5489017 -rw-r--r-- 2 root root 5 Feb 13 13:06 file2
# echo 2222 >> file2
# cat file2
1111
2222
# cat file1
1111
2222
# rm file1 
# cat file2
1111
2222
# ls –l
-rw-r--r-- 1 root root 10 Feb 13 13:14 file2

이것은 리눅스나 유닉스 시스템에서 두 파일 사이에 하드 링크를 만드는 방법을 보여주는 예입니다.

 

먼저 다음 명령으로 'file1'과 'file2' 사이에 하드 링크를 만듭니다.

ln file1 file2

 

다음으로, 다음 명령을 사용하여 디렉토리에 있는 각 파일의 inode 번호, 권한, 소유자, 그룹, 크기, 생성 날짜 및 파일 이름과 같은 정보를 표시합니다.

ls -li

 

그 다음으로, 다음 명령으로 '2222'를 'file2'에 추가합니다.

echo 2222 >> file2

 

그 후에는 'cat' 명령으로 'file2'의 내용을 표시할 수 있습니다.

cat file2

 

'file1'과 'file2'가 하드 링크이므로, 'cat' 명령과 함께 'file1'의 내용을 표시할 수 있습니다.

cat file1

 

이제 'rm' 명령으로 'file1'를 제거합니다.

rm file1

 

'file2'는 여전히 존재해야하며, 'cat' 명령으로 다시 내용을 표시할 수 있습니다.

cat file2

 

마지막으로, 'ls -l'을 사용하여 'file2'의 파일 권한, 소유자, 그룹, 크기, 생성 날짜 및 파일 이름을 표시합니다.

ls -l

하드 링크는 동일한 inode 번호를 가지며, 디스크 상의 동일한 물리적 파일을 가리킵니다.

하나의 파일을 변경하면 다른 파일도 영향을 받게 됩니다.

 

하드링크 활용 - 하드링크를 이용한 백업파일 만들기

이번에는 하드링크를 이용한 백업파일 만드는 방법에 대해 알아보겠습니다.

먼저, 파일을 백업할 디렉토리로 이동합니다.

그리고 백업할 파일이 있는 디렉토리의 파일 리스트를 보기 위해 ls -l 명령어를 입력합니다.

# ls -l
합계 4
-rw-r--r--. 1 root root 10  3월 13 12:42 file2

 

이제 파일을 백업하기 위해 cp -p file2 .file2 명령어를 입력합니다.

그리고 다시 한 번 파일 리스트를 보기 위해 ls -la 명령어를 입력합니다.

# cp -p file2 .file2
# ls -la
합계 8
drwxrwxrwx.  2 root root  33  3월 13 12:44 .
dr-xr-xr-x. 19 root root 249  3월 11 18:08 ..
-rw-r--r--.  1 root root  10  3월 13 12:42 .file2
-rw-r--r--.  1 root root  10  3월 13 12:42 file2

 

위의 명령어를 실행하면 백업 파일인 .file2가 생성됩니다.

백업파일 이름에 .bak과 같은 특수한 이름을 붙이거나, 백업된 파일이라는 표시를 위해 파일명 앞에 .을 붙이는 것이 좋습니다.

다음으로, cp를 이용한 백업의 단점에 대해 알아보겠습니다.

cp 명령어로 백업 파일을 만들 경우, 현재 시간 이후의 자료에 대해서는 백업이 불가능합니다.

 

예를 들어, file2 파일에 1111, 2222라는 내용이 있고, 이후에 3333을 추가했다면, file2 파일은 다음과 같이 나타납니다.

# cat file2
1111
2222
3333

 

그리고 file2를 삭제한 후, 백업 파일인 .file2로 복원했다면, file2 파일은 다음과 같이 나타납니다.

# rm -rf file2
# cp -p .file2 file2
# cat file2
1111
2222

 

최신 버전의 파일이 아닌 백업 당시의 파일로 저장되어 있습니다.

따라서, 이번에는 하드링크를 이용한 백업 방법에 대해 알아보겠습니다.

ln 명령어를 이용하면, 파일을 복사하지 않고, 동일한 데이터를 이용하는 새로운 파일을 생성할 수 있습니다.

/etc 디렉토리와 같이 설정 파일이 주로 있는 곳에서 사용하면 좋습니다.

 

# ls
file2
# ln file2 .file2
# ls -l
합계 4
-rw-r--r--. 2 root root 10  3월 13 12:42 file2

 

위의 명령어를 실행하면 .file2 파일이 생성됩니다.

file2 파일에 4444라는 내용을 추가한 후, .file2 파일을 확인해보면, 동일한 데이터가 유지되어 있습니다.

# echo 4444 >> file2
# cat .file2
1111
2222
4444

 

그리고 file2 파일을 삭제한 후, ln 명령어를 이용해 .file2 파일을 file2 파일로 만들어보면, 항상 백업 파일이 최신 버전으로 유지되며, 동일한 데이터를 이용하기 때문에 용량 증가의 걱정이 없습니다.

# rm -rf file2
# ln .file2 file2
# cat file2
1111
2222
4444

 

소프트링크 / 심볼릭링크 실습

# ln -s file2 file3
#

# ls –li
5489017 -rw-r--r-- 1 root root 10 Feb 13 13:14 file2
5488913 lrwxrwxrwx 1 root root  5 Feb 13 13:18 file3 -> file2
file3은 file2번을 링크하며 file2번의 INODE가 저장되어있다.

# echo 3333 >> file3 
# cat file3
1111
2222
3333
# cat file2
1111
2222
3333
# rm file2 
#

# cat file3
cat: file3: No such file or directory

파일을 백업하는 방법에는 다양한 방법이 있습니다.

이 중 cp 명령어를 이용한 복사 방법은 간단하고 쉽게 사용할 수 있는 장점이 있지만, 몇 가지 단점이 있습니다.

cp 명령어를 이용해 백업 파일을 만들 경우, 현재 시간 이후의 자료에 대해서는 백업이 불가능합니다.

는 백업 파일을 만들 때, 원본 파일과 백업 파일의 생성 시간이 동일하게 설정되어, 이전 시간에 생성된 내용들은 백업되지 않기 때문입니다.

이와 달리 ln 명령어를 이용하면, 파일을 복사하지 않고, 동일한 데이터를 이용하는 새로운 파일을 생성할 수 있습니다.

하드링크를 이용한 백업 방법은 원본 파일과 백업 파일이 같은 inode를 가지고 있기 때문에, 백업 파일을 삭제한 후 다시 복원하면, 원본 파일의 최신 버전으로 복원됩니다.

이는 용량의 증가를 막아줄 뿐만 아니라, 최신 버전의 파일을 유지하기 위한 수고를 덜어줍니다.

심볼릭 링크, 또는 소프트링크를 이용한 백업 방법은 하드링크와는 달리 원본 파일과 백업 파일 간에 inode가 다르게 설정됩니다.

이는 원본 파일이 삭제되어도, 백업 파일이 남아있는 경우가 있기 때문입니다.

또한, 파일을 복사하는 것이 아니라 링크를 거는 방식이기 때문에, 용량 측면에서 하드링크보다 유리합니다.

이러한 링크 방식의 장점들은 다양한 환경에서 사용됩니다. 예를 들어, 웹서버(WAS 서버)에서 웹소스 디렉토리 마이그레이션 하는 작업, 버전 관리, 관리 디렉토리 통합 등 다양한 경우에서 많이 사용됩니다.

파일을 백업하는 방법을 결정할 때는, 사용 환경과 파일의 용도를 고려하여 적절한 방법을 선택하는 것이 중요합니다.

 

디렉토리 넘어 소프트링크

# mkdir /test1
# mkdir /test2
# touch file1
# ls
file1
# echo 11111 >> file1
# ls
file1
# ln -s file1 file2
# ls -l
합계 4
-rw-r--r--. 1 root root 6  3월 13 12:59 file1
lrwxrwxrwx. 1 root root 5  3월 13 13:00 file2 -> file1
# mv file2 /test2     file2번을 /test2 디렉토리로 이동
# cd /test2
# ls
file2
# cat file2
cat: file2: 그런 파일이나 디렉터리가 없습니다
[이유] -> 링크파일을 만들 당시에 상대경로로 생성을 하였기 때문에 /test2 디렉토리로 이동하고 나서 /test1/file1을 찾을수가 없다.
# ls -l
합계 0
lrwxrwxrwx. 1 root root 5  3월 13 13:00 file2 -> file1

[해결책] -> 절대경로로 파일 링크 생성
# cd /test1
# ls
file1
# ln -s /test1/file1 file2  /* 원본 파일 경로를 절대 경로로 지정 */
# ls -l
합계 4
-rw-r--r--. 1 root root  6  3월 13 12:59 file1
lrwxrwxrwx. 1 root root 12  3월 13 13:05 file2 -> /test1/file1
# mv file2 /test2
# cd /test2
# ls
file2
# ls -l
합계 0
lrwxrwxrwx. 1 root root 12  3월 13 13:05 file2 -> /test1/file1 /* 이동된 파일이지만 원본 경로가 절대경로로 지정되어 있기때문에 파일을 제어하는데 아무런 문제가 없다. */
# cat file2
11111
# echo "test2 file create" >> file2
# cd /test1
# ls
file1
# cat file1
11111
test2 file create

이 문서는 Linux 환경에서 하드 링크와 심볼릭 링크에 대해 설명하고 있습니다. 또한, 상대경로로 링크 파일을 생성할 때 발생할 수 있는 문제점과 해결책, 그리고 링크 파일 생성시 절대경로를 사용하는 방법에 대해서도 다루고 있습니다.

이 문서에서는 하드 링크와 심볼릭 링크의 차이점에 대해 자세히 설명하고 있습니다. 또한, 실무 예를 통해 하드 링크와 심볼릭 링크의 사용 방법에 대해서도 알아보고 있습니다.

이 문서는 초보자들도 쉽게 이해할 수 있도록 구성되어 있으며, Linux 환경에서 링크 파일을 사용할 때 유용한 정보를 제공합니다.

링크 파일은 파일 시스템에서 파일을 연결해 주는 기능을 합니다. 하드 링크와 심볼릭 링크 두 가지 종류가 있습니다.

하드 링크는 원본 파일과 링크 파일이 동일한 inode 번호를 가지며, 두 파일은 서로 같은 파일을 가리키고 있습니다.

따라서, 원본 파일과 링크 파일은 동일한 내용을 갖고 있습니다.

하드 링크는 원본 파일을 삭제해도 링크 파일은 그대로 존재하며, 원본 파일을 수정하면 링크 파일의 내용도 함께 변경됩니다.

심볼릭 링크는 원본 파일을 가리키는 링크 파일입니다.

원본 파일과 링크 파일은 서로 다른 inode 번호를 가지고 있으며, 링크 파일에는 원본 파일의 경로 정보가 저장되어 있습니다.

따라서, 원본 파일을 삭제하면 링크 파일은 더 이상 유효하지 않으며, 원본 파일을 수정하더라도 링크 파일의 내용은 변경되지 않습니다.

링크 파일을 생성할 때 상대경로를 사용하면, 링크 파일이 생성된 디렉토리가 변경될 경우 링크 파일이 원본 파일을 찾지 못하는 문제가 발생할 수 있습니다.

이러한 문제를 해결하기 위해서는 링크 파일 생성시 절대경로를 사용해야 합니다.

이외에도, 링크 파일 사용시 주의할 점과 실무 예를 통해 링크 파일의 사용 방법에 대해서도 다루고 있습니다.

이 문서를 통해 Linux 환경에서 링크 파일을 사용하는 방법에 대해 자세히 알아보세요.

 

하드 링크 (# ln file1 file2)

하드 링크는 원본 파일과 링크 파일이 동일한 inode 번호를 가지며, 두 파일은 서로 같은 파일을 가리키고 있습니다.

즉, 하드 링크를 생성하면 원본 파일과 링크 파일은 동일한 내용을 갖고 있습니다.

하드 링크는 원본 파일을 삭제해도 링크 파일은 그대로 존재하며, 원본 파일을 수정하면 링크 파일의 내용도 함께 변경됩니다.

하드 링크를 생성하면 두 파일 간의 inode 번호가 동일해집니다. inode 번호는 파일이 저장된 위치와 파일의 메타데이터(권한, 소유자, 생성일자 등)를 포함한 파일의 정보를 가지고 있습니다. 두 파일이 동일한 inode 번호를 가지므로, 하드 링크를 통해 생성한 파일은 원본 파일과 동일한 파일로 인식됩니다.

하지만 하드 링크를 생성하는 경우, 링크 파일이 원본 파일과 동일한 파일로 인식되기 때문에 링크 파일의 변경 내용은 모두 원본 파일에 반영됩니다. 따라서 링크 파일을 수정하면 원본 파일의 내용도 변경되며, 반대로 원본 파일을 수정하면 링크 파일의 내용도 함께 변경됩니다.

심볼릭 링크 (# ln -s file1 file2)

심볼릭 링크는 원본 파일을 가리키는 링크 파일입니다. 원본 파일과 링크 파일은 서로 다른 inode 번호를 가지고 있으며, 링크 파일에는 원본 파일의 경로 정보가 저장되어 있습니다. 따라서, 원본 파일을 삭제하면 링크 파일은 더 이상 유효하지 않으며, 원본 파일을 수정하더라도 링크 파일의 내용은 변경되지 않습니다.

심볼릭 링크를 생성하면 링크 파일은 원본 파일의 경로 정보만 가지고 있습니다. 따라서, 원본 파일의 inode 번호와 링크 파일의 inode 번호는 다릅니다. 링크 파일은 원본 파일을 가리키는 포인터 역할을 하기 때문에, 원본 파일의 내용이 변경되지 않습니다.

하지만 심볼릭 링크는 원본 파일의 경로 정보만 가지고 있기 때문에, 원본 파일을 삭제하면 링크 파일은 더 이상 유효하지 않아집니다. 따라서, 링크 파일을 사용할 때는 원본 파일이 삭제되지 않도록 주의해야 합니다.

하드 링크와 심볼릭 링크의 차이점

하드 링크와 심볼릭 링크의 가장 큰 차이점은 파일 시스템을 넘어서 링크를 걸 수 있는가 여부입니다. 하드 링크는 동일한 파일 시스템 내에서만 링크를 걸 수 있습니다. 즉, 같은 디스크 파티션 내에서만 링크를 걸 수 있습니다. 반면에, 심볼릭 링크는 파일 시스템을 넘어서 링크를 걸 수 있습니다. 다른 파일 시스템에 있는 파일에 대해서도 링크를 걸 수 있습니다.

또 다른 차이점은 디렉토리에 링크를 걸 수 있는가 여부입니다. 하드 링크는 디렉토리에 링크를 걸 수 없습니다. 이는 파일 시스템의 안정성을 위해서입니다. 반면에, 심볼릭 링크는 디렉토리에도 링크를 걸 수 있습니다.

[참고]

심볼릭 링크는 상대 경로를 사용할 수 있습니다. 하지만, 웹 서버와 같이 경로가 변경될 가능성이 있는 경우에는 절대 경로를 사용하는 것이 좋습니다.

실무에서는 링크 파일을 사용하는 경우가 많습니다. 웹 서버의 웹 소스 디렉토리 마이그레이션 작업, 관리 디렉토리 통합 작업, 버전 관리 작업 등에서 링크 파일을 사용할 수 있습니다.

[참고]

심볼릭 링크는 윈도우의 바탕화면 아이콘과 같은 것으로, "아이콘".lnk로 표시됩니다. 주의할 점은, 심볼릭 링크는 일반적으로 상대경로를 사용하지 않는다는 것입니다.

다음은 실무 예시입니다. 웹서버(WAS 서버)에서 웹소스 디렉토리 마이그레이션 하는 작업을 수행하려 하였습니다. 이 경우, 다음과 같은 작업이 필요합니다:

/was ---> /zeus로 작업을 수행합니다. 이를 위해 다음과 같은 명령어를 입력합니다:

# ln -s /was /zeus

스토리지의 경우, 다음과 같은 작업이 필요합니다:

# ln -s /newstorage /stage

또 다른 실무 예시는, 관리 디렉토리 통합입니다. FTP, DNS, WEB 서비스 프로그램 디렉토리를 각각 /etc/vsftpd, /var/named, /var/www/html로 지정하여, /test 디렉토리 내에서 다음과 같은 명령어를 입력합니다:

    # cd /test ; rm –rf /test/*
    # ln -s /etc/vsftpd FTP       /* FTP 서비스 프로그램 디렉토리 */
    # ln -s /var/named DNS        /* DNS 서비스 프로그램 디렉토리 */
    # ln -s /var/www/html WEB     /* WEB 서비스 프로그램 디렉토리 */
    # cd /test ; ls
    # cd FTP
    # cd ../DNS
    # cd ../WEB

마지막으로, 버전 관리를 위해 다음과 같은 작업이 필요합니다. 예를 들어, /usr/local/tomcat-4.X, /usr/local/tomcat-5.X, /usr/local/tomcat-6.X에 대한 버전 관리를 할 경우, 다음과 같은 명령어를 입력합니다:

초기 프로그램을 설치하는 경우:

    # cd /usr/local
    # ls
    tomcat-4.X
    # ln -s tomcat-4.x tomcat
    # cd tomcat
    설정 작업(EX: /usr/local/tomcat)

버전 업그레이드 하는 경우:

    # cd /usr/local
    # ls
    tomcat-4.X  tomcat-5.X  tomcat
    # rm tomcat
    # ln -s tomcat-5.x tomcat
    # cd tomcat
    이전설정(/usr/local/tomcat) 복사
반응형