Linux 설치 후 작업
Table of contents
- Key word
- Command completion
- 국제화 규격
- File 관련 명령어
- stdio (Standard Input/Output)
- PIPE
- Redirection (방향재지정)
- 파일 압축(compress)과 보관(archive)
- Link
- kill
- Process control
Key word
- CLI command: Command Line Interface command
Command completion
명령행 완성 기능 또는 auto-completion이라고 한다. 명령어의 일부분을 가지고 명령어를 완성시켜주거나 가능한 명령들을 알려주는 역할을 수행한다.
국제화 규격
internationalization ⇒ i18n은 i~n 사이의 alphabet 개수에 기인한다. 또한 UTF8이 기본문자 세트로 사용하는 시스템들을 의미한다. Linux/UNIX command는 i18n에 맞춰서 만들어져 있다. 때문에 LANG 환경변수에 영향을 받는다.
File 관련 명령어
- file mode
- 눈에 보이는 9bit와 눈에 보이지 않는 3bit를 포함해서 총 12bit로 구성된다. 9bit는 파일의 owner, group, others의 접근 권한을 의미하며, 나머지 3bit는 SetUID, SetGID, Sticky bit는 깊은 허가와 같이 보안과 관련된 요소들을 의미한다.
- Symbolic mode: “rwx”로 표기
-
Octal mode: bit로 표기
- 파일 생성시 mode의 기본값은 umask를 뺀 나머지가 된다.
- e.g. 디렉터리는 777 - 022 = 755, 파일은 666 - 022 = 644가 된다.
- pwd(Print Working Directory): 현재 디렉토리의 위치를 알려준다.
- cd(Change Directory): 작업 디렉토리를 변경한다.
- / : 루트 디렉토리
- ~ : 홈 디렉토리
-
- : 이전 디렉토리
경로에는 absolute path(절대 경로)와 relative path(상대 경로)가 있음
- ls (list): 디렉토리에 존재하는 파일들의 정보를 표시한다.
- -a(all), -l(long), -t(sort), -r(reverse)
- -: regular file, d: directory, l: symbolic link
- mkdir [-p]
디렉터리를 생성하는 명령어이다. - rmdir [-p]
의 경우 디렉터리 안이 비워져 있어야 실행되기 때문에 - rm -rf
을 주로 사용한다. - -r(recursively), -f(force)
- rm -rf
- chmod
<file/directory name> - u+x, g=rx, o=: user에 실행권한 추가, group에 읽기, 실행권한만 추가, other은 모든 권한 제거
-
디렉터리의 경우 파일들의 정보를 담고 있는 파일과 같다. 때문에 읽기 권한만 있는 경우에 안에있는 파일들의 목록은 볼 수 있지만, 디렉터리 안에있는 파일에는 접근하지 못한다.
-
반대로, 실행 권한만 있는 경우에 디렉터리 안의 파일들의 목록을 확인할 순 없지만, 디렉터리 안에있는 파일의 내용을 확인할 수 있다.
- cp(copy)
- mv(move, rename)
- rm(remove)
- chown(change owner): root 권한이 필요하다.
- chgrp(change group): root 권한이 필요하다.
terminal 앞에 $는 일반유저, #는 root 권한을 가진 계정을 의미한다.
- file
: 파일의 타입을 확인 - 파일은 고유 표식을 가지고 있고 이를 통해 파일의 종류를 분류할 수 있다.
- 이런 이유에서 UNIX 계열에서 파일의 확장자는 중요하진 않다.
- magic 데이터는 /usr/share/file/magic에 존재한다.
- stat(status) [option]
: file의 meta data를 출력한다. - meta data: 파일의 이름을 비롯한 생성 시간, 권한 등등
- touch
: 파일의 메타 정보를 업데이트하는 명령어이다. 주로 시간과 관련된 정보를 업데이트 한다. 만약 file이 없다면, 새로운 파일을 생성한다. - file directory [expression]
- n: 조건히 n 인 경우를 검색
- +n: n보다 큰 경우를 검색(n 포함)
- -n: 보다 작은 경우를 검색(n 포함)
alt + . ⇒ 마지막에 입력된 parameter를 의미하며, !$도 같은 의미이다.
$ find . -name ‘[89]*k.dat’
⇒ [89] 괄호 안에는 옵션을 의미한다. 8또는 9가 존재하는 데이터를 찾는다는 의미이다.
$ find -name ‘*.dat’ -a -size 1M
⇒ -a(and), -o(or)
$ find -name ‘*.dat’ -size 1M
⇒ and는 생략이 가능하다.
-size 옵션은 +와 -를 통해서 이상, 이하에 관한 설정이 가능하다.
-mtime -1 은 24시간 이전에 변경된 파일들을 검색한다. size와 마찬가지로 +, - 지정이 가능하다.
-maxdepth <number>: 최대 파일의 깊이를 설정하는 옵션으로 옵션들 중에 가장 처음에 와야한다.
- 검색 후 작업지시
- find …. -exec 명령어 \;
- find …. -exec 명령어 +
$ find . -name “*.tmp” -exec rm {} \;
⇒ rm 명령이 검색된 파일 개수만큼 수행된다. {}에는 find의 결과가 들어온다.
$ find . -name “*.tmp” -exec rm {} \+
⇒ rm 명령이 한번만 수행된다.
stdio (Standard Input/Output)
- file channel:
- 파일을 입출력하기 위한 통로를 의미한다. 하드웨어에 직접 접근하지 않고, 표준화된 입출력 방식을 통하도록 하는 가상화 레이어의 일종이다. 때문에 하드웨어를 몰라도 접근이 가능하다. C언어의 I/O 인터페이스의 심플함을 가능하게 한다. 파일 입출력을 위한 메타 정보를 가지를 객체로 프로세스가 끝나면 사라진다.
- file descriptor(파일서술자):
- 파일 채널에게 붙여지는 유일한 식별자(idenrifier), 숫자로 명명하며 숫자 0부터 시작한다. 예약된 파일서술자 3가지가 존재한다. 0: stdin (standard input, 표준입력), 1: stdout(standard output, 표준출력), 2: stderr(standard error, 표준에러)
- fd는 하나의 프로세스 안에서만 존재하기 때문에 번호가 같더라도 다른 파일을 가르키고 있을 수 있다.
- fd는 가장 작은를 우선적으로 배정한다.
PIPE
- 프로세스 사이의 통신을 지원
- IPC(Inter Process Communication)의 일종
- shell에서도 많이 사용하는 기능
- pipe는 이름의 유무에 따라서 두 종류로 구분된다.
- named pipe ⇒ temporary
- anonymous pipe ⇒ persistency
-
프로세스들을 직렬 연결하며, 명령행에서 Vertical bar( )로 사용한다. -
A B C ⇒ A의 출력이 B의 입력으로 들어가고 B의 출력이 C의 입렬으로 들어간다.
-
- pipe를 이용한 명령 수행, find 명령의 출력이 fd1 이라면, wc의 입력은 fd0이 될 수 있다.
$ find ~ | wc -l
pipe를 사용하지 않고 위 명령을 수행하는 경우
$ find ~ > tmp.txt; wc -l < tmp.txt; rm tmp.txt
Redirection (방향재지정)
- 채널의 방향을 다른 곳으로 연결
# ls 명령의 출력 filelist.txt 파일로 저정한다. $ ls > filelist.txt # 예약 파일 서술자인 stderr을 통해서 파일로 저장하라는 의미이다. >은 1>과 같다. $ strace ls 2> strace.txt
파일 압축(compress)과 보관(archive)
- 아카이브 유틸:
- tar(tape archive) [ctxv] [f archive-file] filese
- c(create), t(test), x(extract), v(verbose): 디버깅이나 확인 용도로만 권장
$ tar c *.c > arc_c.tar # f 옵션을 통해 방향재지정 없이 명령을 수행할 수 있다. $ tar cf arc_c.tar *.c
- c(create), t(test), x(extract), v(verbose): 디버깅이나 확인 용도로만 권장
- cpio
- tar(tape archive) [ctxv] [f archive-file] filese
- 압축 유틸: xa(텍스트 압축률 우수), zstd(멀티 스레드 지원으로 속도가 빠름),
- gzip [-cdflrv]
- -d: 압축해제, -c: 표준 출력(stdout)으로 결과를 출력, -1 ~ 9 (fase, better): 압축 레벨 지정
- bzip [-cdfv]
- gzip과 옵션은 비슷하며 멀티스레스 사용에 관한 옵션이 추가적으로 사용된다(-T0은 자동판단 , 개수를 입력하면 개수만큼 스레드 사용).
-
zstd [options] [- input-file] [-o output-file] - xz와 옵션은 비슷
- -#: 압축 레벨을 지정(기본 압축률이 높음)
- gzip [-cdflrv]
Link
- i-node:
- 파일당 하나있 존재하며, 실제 물리 데이터에 접근할 수 있도록 도와주는 역할을 수행한다. i-node number를 통해 관리되며, disk partition(or volume) 내에서 유일한 식별자이기 때문에 식별자가 같더라도 디스크가 다르면 다른 파일을 가르킨다. 그 외 시간 관련 정보, 사이즈, 소유권, 권한 등의 meta 정보를 가지고 있다.
- Hard link:
- 동일 파티션 내에서만 생서잉 가능하다.
- i-node에 접근하는 통로 역할을 수행하며, 실제 파일이라고 볼 수 있다.
- regular file에 대해서만 생성이 가능하기 때문에 directory나 device file 등은 생성할 수 없다.
# hard link 만들기 $ ln <target file> <link file> # i-node 번호 확인 $ ls -li
- Symbolic link(symlink):
- 어떤 파일의 특정 경로명을 가르키는 역할을 수행, 원본 파일이 삭제되었다 다시 만들어져도 잘 동작하는 특징이 있다.
- 위치만 가르키기 때문에 다른 파티션, 모든 종류의 file에 대한 파일 생성이 가능하다.
- 가르기는 대상의 mod를 따라가며, symlink의 mod는 항상 777로 나타난다.
# symbolic link 만들기 $ ln -s <target file> <link file> # i-node 번호 확인 $ ls -li
# symbolic 링크를 만드는 경우 상대 경로로 지정하면 링크가 깨질 수 있다. $ ln -s testfile.txt ../symbolic.txt # 따라서 다음과 같이 r 옵션을 붙여주면 자동으로 상대 경로를 계산해준다. $ ln -sr testfile.txt ../symbolic.txt # 가장 좋은 방법은 링크를 만들 디렉토리로 이동해서 링크를 생성하는것이 좋다.
- readlink
- Symlink가 여러 단계에 걸쳐 링크가 링크를 가르키고 있는 경우에 마지막 링크의 이전 혹은 마지막 링크까지 모두 정상적으로 연결되어 있는지를 확인하는 명령이다. 이렇게 연결된 것을 canonical path 라고 한다.
- readlink -f
- readlink -e
- e.g. A→B→C→D→E 와 같이 여러 링크를 걸쳐 링크가 연결된 경우, -f 옵션의 경우 D까지 존재하는 경우 확인, -e 옵션의 경우 모든 링크가 존재하는지를 확인한다.
canonicalization이란? 옆집 주소와 같은 상대적인 개념은 ~의 옆집 이라는 ~가 정의되지 않으면 어디를 가르키고 있는지 정확하게 알 수 없다. symlink 또한 실체를 가르키고 있는 개념이 아니기 때문에 실제로 링크를 따라가면서 실체를 확인해야 한다. 이때 여러 링크에 걸쳐 연결된 경우 이를 확인하는 과정을 canonicalize 라고 한다.
kill
- 시그널은 전달하는 명령, 프로세스 중단 외에도 다양한 기능을 포함하고 있다.
- SIGHUP: Hang up ⇒ 중단
- SIGINT: Intertupt
- SIGQUIT: Quit <CTRL-> ⇒ 메모리를 덤프하기 때문에 디버깅 과정에서 사용될 수 있다.
- SIGKILL: kill ⇒ 프로세스를 강제로 종료
- SIGTERM: Terminate ⇒ 프로세스 종료 요청
- SIGSEGV: Segment violation ⇒ 메모리 침범에 의한 종료
- SIGTSTP: Temporary stop
⇒ 일시 중지
$ kill <PID>
$ kill -QUIT <PID>
$ kill -9 <PID>
Process control
- fore-ground process: 현재 session에서 제어 터미널(controlling terminal)을 가진 프로세스
- back-ground process: 현재 session에서 제어 터미널(controlling terminal)을 잃어버린 프로세스
Session
- 세션은 멀티유저 시스템에서 통신 객체(seat or remote)를 구별하기 위해 사용된다. 세션은 제어 터미널을 가질 수 도 있다.
- SID(Session ID)와 PID(Process ID)가 같은 경우에는 Session learder라고 하며, 동시에 Process Gruop Leader가 된다. Leader는 시그널 전파 기능을 갖는다. kill 명령에서 PID에 -를 붙이면 프로세스 그룹에 시스널을 전파하는 것이다.
- 세션 Leader로 파생된 자식 프로세스는 모두 같은 세션을 갖는다. 이는 Session에 속한 제어 터미널을 소유할 수 있다는 의미로, logout하는 경우 세션에 속한 모든 프로세스들은 종료된다.
Controlling terminal
- 사용자의 제어(키보드 입력과 같은)를 받는 터미널 장치를 의미한다. 제어 터미널을 소유한 프로세스는 키보드 입력을 받을 수 있다. 이런 프로세스를 fore-ground process라고 한다.
deamon이란?
Orphan process 혹은 Session leader로써 stdio를 모두 /dev/null로서 출력이 없으며, 제어 터미널을 소유하지 않는 프로세스를 의미한다. 주로 back-ground에서 동작하는 프로세스의 형태를 갖는다.
Commands
- jobs
- stoped, back-ground process의 리스트 출력
- fg %#
- 지정한 프로세스를 fore-ground로 전환
- %는 생략 가능하며, #은 작업 번호
- bg %#
- 정지된 백그라운드 프로세스를 running 상태로 변경
- command &
- command를 back-ground에서 running 상태로 실행