뇌 마음 반반저장소

[42_pipex] 탐구4. inode, 파일권한(chmod), 링크파일(하드, 심볼릭) 쉽게 알아보기 본문

42/pipex

[42_pipex] 탐구4. inode, 파일권한(chmod), 링크파일(하드, 심볼릭) 쉽게 알아보기

맹진저 2023. 1. 7. 02:33
728x90

파일 간의 링크란?

1. inode 

inode는 파일이나 디렉터리의 고유번호와 정보를 담고 있다. Index의 색인이란 단어와 node의 데이터의 지점이라는 단어가 붙어서 inode는 데이터 색인? 정도로 해석할 수 있겠다.

 

터미널에 명령어로 ls -l이라고 쳐보자.

$ ls -l
total 0
drwxrwxrwx 1 myID myID 512 Jan  6 16:24 A
drwxrwxrwx 1 myID myID 512 Jan  6 16:24 B
drwxrwxrwx 1 myID myID 512 Jan  6 16:24 C
-rwxrwxrwx 1 myID myID   0 Jan  6 16:24 a.c
-rwxrwxrwx 1 myID myID   0 Jan  6 16:24 b.h
-rwxrwxrwx 1 myID myID   0 Jan  6 16:24 c.txt

ls -l 명령어는 아래와 같은 inode의 정보를 나타낸다.

파일의 권한을 알아보아요~

디렉터리(폴더) 'd' 말고도 앞자리가 다른 특수파일들이 있다. /dev 폴더에 들어가 보자.

 

b : 블록 장치 특수 파일, 대부분 저장소이다.

brw------- 1 root root   1,   0 Jan  6 16:23 ram0
brw------- 1 root root   8,   0 Jan  6 16:23 sda

c : 문자 장치 특수 파일, 터미널 같이 입출력을 할 수 있다.

crw-rw-rw- 1 root root   5,   0 Jan  6 16:23 tty

p : 파이프 특수 파일, FIFO Special Files이라고 부른다. 파이프 역할을 해준다.

$ mknod pipe_file p #파이프 파일 만드는 방법
$ ls -l | grep pipe_file
prw-r--r-- 1 root root        0 Jan  6 17:28 pipe_file

s : 소켓 특수 파일, 소켓은 전기 콘센트 소켓(돼지코)처럼 다른 세상과의 네크워킹을 제공한다. 서버 간의 파이프라고 생각할 수 있다. (소켓 파일을 만드는 게 너무 어려웠다 😓)

 

l : 심볼릭 링크 파일, 아래에서 더 자세히 알아보자!


위에서  inode는 각각 번호가 있다고 했다. 터미널에 명령어로 ls -i를 입력해 보자.

$ ls -i
 8725724278095939 A  37154696925881602 C    29836347531409986 b.h
 9851624184938813 B  17169973579429858 a.c  17732923532852109 c.txt

이렇게 파일의 고유번호가 나온다. 사실 이 번호는 리눅스가 이해하는 파일의 이름이다!  (워매 긴 거) 이것이 바로 inode 넘버이다!

 

찾아보다가 굉장히 재미있는 사실을 알아냈는데, 이 파일의 정보들은 함수로 들어가서 검색이 된다. inode 정보는 stat라는 구조체에 저장이 된다. 아래는 stat구조체이다.

#include <sys/stat.h>
int	stat(const char *restrict pathname, struct stat *restrict statbuf);

 struct stat {
               dev_t     st_dev;         /* ID of device containing file */
               ino_t     st_ino;         /* Inode number 아이노드 번호 */
               mode_t    st_mode;        /* File type and mode 파일 유형 및 모드 */
               nlink_t   st_nlink;       /* Number of hard links 하드 링크의 수 */
               uid_t     st_uid;         /* User ID of owner 소유자 소유자 ID */
               gid_t     st_gid;         /* Group ID of owner 소유자 그룹 ID */
               dev_t     st_rdev;        /* Device ID (if special file) 장치 ID */
               off_t     st_size;        /* Total size, in bytes 바이트 단위의 총 크기 */
               blksize_t st_blksize;     /* Block size for filesystem I/O 파일 시스템을 위한 블록크기 */
               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated 할당된 512b 블록의 수 */

               struct timespec st_atim;  /* Time of last access 마지막 액세스 시간 */
               struct timespec st_mtim;  /* Time of last modification 마시막 수정시간 */
               struct timespec st_ctim;  /* Time of last status change 마지막 상태변경 시간 */

           #define st_atime st_atim.tv_sec      /* Backward compatibility 하위 호환성 */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };

알면 알수록 컴퓨터의 세계는 정확하고.. 계산되어 있고.. 정말 환상적이다 ✨


2. 링크파일

기본적으로 링크 파일은 말 그대로 연결된 파일이라는 뜻이다.

1. 하드링크

실습을 하면서 이해를 해보자.

 

일단 c.txt의 파일을 만들고 안에 내용을 넣어준다.

$ cat c.txt
easy peasy link file

그리고 파일을 연결해 보자. ln(link) 명령어로 c.txt와 새로운 파일을 생성하면서 d.txt를 연결해 준다.

$ ln c.txt d.txt #ln 명령어로 두 파일을 연결해 주는데 d.txt파일을 생성하며 연결한다.
$ ls
A  B  C  a.c  b.h  c.txt  d.txt
$ cat d.txt #파일이 링크되면서 내용도 같이 들어갔다.
easy peasy link file
$ ls -il
total 0
32088147345025272 -rwxrwxrwx 2 myyou myyou  21 Jan  6 17:56 c.txt
32088147345025272 -rwxrwxrwx 2 myyou myyou  21 Jan  6 17:56 d.txt

마지막에 ls -il로 둘의 inode 내용을 보면 inode 아이디도 같고 2개로 링크되어 있는 것을 볼 수가 있다. 

 

c.txt 의 내용을 한번 바꿔보자.

$ echo this is hard link > c.
txt
$ cat c.txt 
this is hard link
$ cat d.txt
this is hard link

c.txt의 내용을 바꾸니 함께 링크되어있는 d.txt도 내용이 바뀐다! 

이게 복사랑 뭐가 다른가 싶겠지만 하드링크를 사용하면 같이 연결된 파일이 실시간으로 링크가 끊길 때까지 바뀐다. 


2. 소프트, 심볼릭 링크

이 두 개의 이름은 같은 의미이다. 소프트 링크, 심볼릭링크 같은 뜻이다! 그럼 예제로 살펴보자.

$ ln -s d.txt syb_link

ln 명령어에 -s를 붙이고 원하는 이름을 마지막에 붙여주면! 심볼릭 링크가 만들어진다. 

$ ls -il
total 0
32088147345025272 -rwxrwxrwx 2 myyou myyou  18 Jan  6 18:10 c.txt
32088147345025272 -rwxrwxrwx 2 myyou myyou  18 Jan  6 18:10 d.txt
12666373952030307 lrwxrwxrwx 1 myyou myyou   5 Jan  6 18:21 syb_link -> d.txt

심볼릭 링크는 inode가 다르다! 그리고 뒤에 -> 이런 이상한 표시가 생겼다.

이 표시는 말 그대로 syb_link를 실행하면 d.txt로 가라포인터 같은 녀석이다! 다른 블로거님이 든 예를 참고하면 바로 "바탕화면에 있는 바로가기 같은 아이콘"인 것이다. 

 

그렇다면 syb_link를 실행하면 무엇이 나올까?

$ echo symbolic link is created > d.txt #d.txt의 내용을 바꿔 보았다. 하드 링크로 c.txt와 연결되어 있기 때문에 둘 다 바뀔 것이다.
$ cat syb_link
symbolic link is created

바로 c.txt의 내용이 나온다! 

 

연결된 링크를 삭제할 때는 rm 명령어를 사용해서 파일 전체를 삭제해줘야 한다!


이 링크 개념은 허용함수인 unlink함수를 위해서 알아보았다!

 

읽어보면 좋은 자료

명령어 함수들의 원형을 설명해 놓음 https://jihooyim1.gitbooks.io/unixbasic/content/contents/03.html

 

참고자료 :

https://web.eecs.utk.edu/~huangj/cs360/360/notes/Links/lecture.html

https://man7.org/linux/man-pages/man2/lstat.2.html

728x90
Comments