리눅스 파일 관리하기 : 파일 허가권, 소유자, 소유 그룹, 시스템 디렉토리
리눅스에서는 모든 것이 파일입니다. 텍스트, 이밎, 영상, 디렉터리 정보, 소켓, 자료의 흐름(스트림), 시스템 장치 까지 모든 것이 파일입니다. desktop이 아닌 cli 환경에서도 OS를 사용할 수 있는 이유입니다.
어쨌거나 모든 것이 파일이기 때문에 파일을 다루는 것은 중요합니다. 해당 파일을 다룰 수 있는 권한을 엄격히 따르며, 파일의 대소문자도 구별합니다.
파일 유형은 디렉토리의 경우 'd', 파일의 경우는 -로 표시됩니다. 이 외에 블록 장치는 b로 표시되는 등 다른 경우도 존재합니다.
파일 허가권(접근 허가권)은 rwx(소유자) rwx(그룹) rwx(그 외 사용자)의 순서로 나열됩니다. 8진수로 표현할 수도 있습니다.
링크는 해당 파일 혹은 디렉토리로 연결되는 링크 수를 말합니다.
그 외 부분은 읽어보면 아는 부분이니 생략하겠습니다.
파일 허가권(chmod, chown)
접근 허가권 이라고도 불리는 파일 허가권을 좀 더 자세히 알아보겠습니다.
r은 read, w는 write, x는 execute를 의미합니다.
아래와 같은 허가권은 8진수로 말하자면 644가 됩니다.
파일의 허가권을 변경하기 위해서는 chmod 명령어를 사용하시면 됩니다. change mod의 약자입니다.
aws를 떠올려보면 다음과 같이 400 파일 허가권을 줬습니다. 이는 사용자가 읽기 권한만을 가지는 것이라고 볼 수 있겠네요.
777의 경우 모든 유저에게 읽고, 쓰고, 실행할 수 있음을 의미합니다.
chmod 400 MyKeyPair.pem
chomd 777 anything.txt
아래와 같은 방법도 있습니다.
u, g, o 를 사용가능합니다. 유저, 그룹, other의 약자입니다. 그런데 저는 위의 8진수가 더 편한 것 같군요.
chmod o+r testing // others에 r 기능 추가
chmoe g-x testing // group에 x 기능 제거
여기서 잘 생각해봅시다. 파일에 대한 권한이 없는 사용자는 chmod를 사용할 수 없습니다.
예를 들어볼까요, 현재 gunsmoke라는 이름의 유저가 ubuntu 사용자가 소유한 image01의 파일 허가권을 변경하려고 하면 권한을 받을수 없다고 에러를 뱉습니다.
실제 환경에서 sudo를 얻을 수 없는 사용자임에도 자신의 권한을 박탈하는 파일 권한으로 변경할 경우 상위 관리자에게 요청을 해야하는 번거로움이 있으므로 주의합시다.
파일의 소유자, 소유 그룹 변경, chown, chgrp
change owner, change group의 약자라는것은 상식적으로 알 수 있습니다.
해당 파일의 소유자를 변경하기 위해서는 chown 명령을 이용하면 됩니다. 그룹 현경은 chgrp을 이용합니다.
chown은 [소유자].[그룹] 꼴로 적어 chgrp 명령 없이 곧바로 소유자와 소유 그룹을 한번에 지정할 수도 있습니다.
해당 파일의 소유자를 변경하기 위해서는 chown 명령을 이용하면 됩니다.
chown은 [소유자].[그룹] 꼴로 적어 chgrp 명령 없이 곧바로 소유자와 소유 그룹을 한번에 지정할 수도 있습니다.
-R을 통해 폴더 내부의 파일도 재귀적으로 설정 가능합니다.
chown user1 testing
chown user1.user1 testing // 소유자는 user1으로, 소유 그룹은 user1으로 동시에 설정 가능
sudo chown -R user1 testing // -R을 통해 폴더 내부의 파일도 재귀적으로 설정 가능합니다.
chgrp을 통해서는 해당 파일을 소유하는 그룹을 지정할 수 있습니다.
chgrp user2 testing
리눅스 시스템 디렉터리
우분투를 설치하면 기본적으로 시스템 디렉토리가 생성된다. 윈도우에서 system32 관련 파일을 함부로 삭제하면 안되듯, 여기에서도 함부로 삭제하거나 변경하면 안되는 것이ㅏ.
리눅스는 파일 시스템 계층 구조 표준 Filesystem Hierachy Standard(FHS)에 의해 디렉토리를 구성해야 한다.
www.howtogeek.com/117435/htg-explains-the-linux-directory-structure-explained/
최상위 디렉토리(/) 에서 무엇이 있나 ls을 찍어보면 무엇이 있나 확인해볼 수 있습니다.
/
루트 디렉토리. 모든 디렉토리의 최상위 경로이다.
/dev
시스템 주변 장치들, 즉, 마우스 모니터 비디오카드 하드디스크 등이 '파일' 로 등록되어 있는 디렉토리이다.
/etc
시스템 설정 파일이 들어 있는 디렉토리이다. 사용자, 그룹 등 시스템의 환경 뿐만 아니라 설치된 외부 패키지들의 설정들도 살필 수 있습니다.
사용자 /etc/passwd
그룹 /etc/group
sudo 권한을 가진 사용자, 그룹 /etc/sudoers
nginx 설치시 관련 설정들 /etc/nginx/
redis 설치기 관려 설정 /etc/redis/
... 무언가 설치하면 여기서 configuration을 진행할 수 있음을 추측할 수 있다.
/bin
사용자가 사용하는 가장 기본적인 명령어들이 위치해 있습니다. 이 부분은 python, go 등 다른 언어 등에서도 공통적인 관습입니다.
/lib
공유 라이브러리 파일이 저장되어 있는 디렉토리입니다. 시스템의 부팅, 응용 프로그램 실행에 필요한 코드들이 있습니다.
/home
가장 자주 쓰는 곳이죠. 사용자를 만들면 /home/[username] 꼴로 사용자 디렉토리가 생성됩니다. 사용자는 각자 파일을 사용자 홈 디렉토리에 저장합니다. 이 부분은 linux계열을 OS로 사용해보신 분이라면 무슨 말인지 아실 겁니다.
/root
루트 계정을 위한 디렉토리입니다. /home/root 는 없습니다. /root는 일반 계정이 접근할 수 없습니다.
소유자만 rwx할 수 있는 것을 확인해볼 수 있습니다.
막상 /root에 들어가보면 별거 없습니다. 그냥 일반 유저 디렉토리랑 같습니다.
/proc
시스템 정보를 제공하는 가상 파일 시스템 디렉토리입니다. 이 디렉토리를 확인해서 cpu 정보, 입출력 주소 목록 등 시스템 상태를 모니터링 할 수 있습니다. process의 준말이라고 이해하면 빠르죠.
/sbin
bin과 같이 명령어가 모여있는 곳이지만 sudo 권한이 필요합니다.
/tmp
임시 파일 생성, 삭제하는 공간입니다. 임시로 필요한 것들을 넣어두면 좋습니다. 언제든지 삭제되어도 무리가 없는 것들을 넣어두는 것이 좋습니다.
/var
시스템을 운영하면서 생기는 임시 파일들(시스템 로그, 스풀, 전자 메일) 등을 저장하는 디렉토리입니다. 크기가 계속해서 변하는 임시 파일을 저장합니다.
/usr
시스템, 응용 프로그램에서 필요한 파일들이 저장되어 있는 디렉토리입니다. 일반적으로 /usr에는 선택적으로 설치되는 응용 프로그램들이 저장됩니다.
유저가 만든 쉘 스크립트는 일반적으로 /usr/local/bin에 저장하여 $PATH에 등록하고 경로 불문 명령어 처럼 사용하는 관습이 있습니다.
링크(ln)
Linux 환경에서 링크는 하드 링크(Hard Link)와 심볼릭 링크(Symbolic Link, Soft Link)가 존재합니다.
하드 링크는 원본 파일의 inode를 그대로 가리키므로 사실상 원본 파일과 같은 것이라고 할 수 있습니다.
반면 심볼릭 링크는 일종의 '바로가기' 역할을 합니다. 원본 파일이 있는 곳을 가리키고 있죠.(포인터!)
ln [링크 대상] [링크 경로] : 하드 링크
ln -s [링크 대상] [링크 경로] : 심볼릭 링크
basefile을 하나 만든 후 ln과 ln -s를 이용해 링크를 만들었습니다.
- 하드 링크, 심볼릭 링크 둘 중 아무거나 수정해도 원본 파일까지 똑같이 수정됩니다.
- 원본 대상의 경로가 바뀌었을 경우 하드 링크는 같은 노드를 가리키므로 아무 이상이 없지만 심볼릭 링크는 경로를 기반으로 원본 대상을 참조하기 때문에 경로가 바뀌면 심볼릭 링크는 작동하지 않습니다.