본문 바로가기
PM으로 성장하기/개발 공부

[컴과] Linux(리눅스): 소개, CLI, 셸, 명령어, 디렉토리와 파일, 운영체제, 사용자관리, vi, 파일시스템, 프로세스 관리, 소프트웨어 관리, 네트워크 관리, 원격제어, 웹서버

by 고양이 고씨 2022. 11. 28.

리눅스 소개

 

리눅스는 유닉스 운영체제 중 하나이다. 유닉스는 1970년대 초반에 개발된 시분할처리 시스템용 운영체제이다. 시분할처리란, 여러 명의 사용자가 사용하는 시스템에서 컴퓨터가 사용자들의 프로그램을 번갈아가며 처리해주어 각 사용자에게 독립된 컴퓨터를 사용하게끔 해준다. 리눅스는 1991년 리눅스 커널을 발표하여 알려지게 된다. 여기서 커널이란, 하드웨어를 제어하고 응용 프로그램과 상호작용하는 운영체제의 핵심부를 말한다. 리눅스는 소스 코드가 공개된 오픈 소스 소프트웨어이며, 수많은 사람들이 오픈 소스 프로젝트에 참여하고 있다. 유명 IT기업이나 도메인에서도 대다수 리눅스를 사용하며, 안드로이드, 웹서버, 클라우드, 모바일기기, 임베디드 기기 등에서도 사용되고 있다.

 

리눅스는 시분할 방식을 지원하고, 뛰어난 이식성과 GUI 및 CLI를 지원한다. CLI(Command Line Interface)란 셸(shell)을 통해 명령어를 입력하여 조작하는 것이다. 또한 리눅스는 여러 종류의 파일 시스템을 지원하고, 효율적으로 하드웨어를 활용하며, 다양한 개발 환경을 제공한다.

 

리눅스는 오픈소스인 만큼 다양한 배포판을 갖고 있다. 모든 소스가 공개되어 있다보니 리눅스 커널을 기준으로 미들웨어~사용자인터페이스에 이르는 여러 프로그램을 하나의 세트로 만든 '배포판'이 다수 탄생했다. (2013년 기준으로 약 450여개의 배포판이 있다고 한다) 대표적으로  Debian, Red Hat, CentOS, SuSE, Slackware, Ubuntu 가 있다. 소프트웨어는 무료면서, 기술 지원은 유료로 제공하는 비즈니스 모델을 갖는 회사들도 있다.


CLI (Command line interface)

명령줄 인터페이스 CLI는 명령어를 입력하여 컴퓨터를 조작하는 것이다. GUI가 이를 대체하고는 있지만, 완벽하게 대체하지 못하는 이유는 CLI의 장점 때문이다. 나무위키에 따르면, CLI는 자원을 적게 잡아먹으면서 안정적이고 빠르다. 특히 서버 쪽에서는 작업 자동화가 필요할데 이 때 압도적으로 효율적이다.


셸(shell) 

셸이란 명령어 해석기 또는 명령 행 인터페이스라고 한다. 사용자는 터미널 화면에서 명령어를 입력하여 컴퓨터를 다룰 수 있는데, 이 명령어를 해석하는 것이 셸이다. 리눅스의 배포판마다 Bourne 셸, C셸, Korn셸 등 여러 종류의 셸이 있는데, 가장 많이 사용되는 셸이 bash(Bourne Again Shell)이다. 셸의 종류에 따라 alias 설정, 초기화파일, 스크립트 작성, 명령행 완성 등 기능의 차이가 있다. 나는 CentOS를 사용하게 되어 bash 셸 기준으로 학습을 하였다. (기본 셸을 변경하고 싶다면 chsh 명령어를 입력하면 된다)

 

bash셸은 Bourne 셸의 개선된 버전으로 C셸과 Korn셸의 유용한 기능을 가져왔다. bash 셸에서 일반 사용자는 $, 루트 사용자는 #를 사용한다.

출처:https://atoz-develop.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%89%98-shell-%EC%9D%98-%EC%9D%B4%ED%95%B4


명령어

셸 명령어는 기본적으로 [명령어] [옵션] [인수] 형태로 되어있다. 명령어는 프로그램의 이름이며, 옵션과 인수는 명령어 종류에 따라 여러 개일 수 있고 혹은 생략할 수도 있다.

 

1. 명령어

명령어의 종류는 아래와 같다.

명령어 설명
에일리어스 특정 명령을 옵션과 함께 별칭으로 정의하는 명령(빠르고 효율적인 단축 명령을 위함)
셸 예약어 셸에서 예악된 단어
함수 셸에서 수행되는 함수를 정의하는 명령
내장 명령 셸 내부에서 존재하는 명령으로 별도로 실행 파일이 존재하지 않는 명령
일반 명령 실행 파일이 존재하는 명령
- 환경변수 PATH에 설정된 경로 중에 실행파일이 있다면 이름만으로 실행 가능함

※ 환경변수 PATH 란, 사용자가 입력한 명령어를 실행하기 위한 실행파일을 찾는 경로이다. 사용자가 정의할 수 있으며, PATH에 설정되어 있지 않다면 절대경로를 모두 입력해야 한다.

 

2. 옵션

대개 옵션은 하이픈 뒤에 문자의 알파벳 또는 숫자를 지정하는 방식으로 이루어진다. 짧은 옵션(-)과 긴 옵션(--)이 있으며, 하이픈을 사용하지 않는 옵션 형태도 있다.

 

3. 인수

인수는 명령의 수행 대상을 지정하는 것이다. 옵션도 인수를 가질 수 있다.

 

4. 셸 변수

셸의 변수는 셸의 환경을 설정하기 위한 값을 저장한다. 현재 셸에서만 사용이 가능한 지역변수이나, 환경변수는 서브 셸로도 전달되는 전역변수이다. 환경변수는 대문자를 사용한다. 자주 사용되는 환경변수는 아래와 같다.

- HISTSIZE: 1개의 셸에서 저장되는 명령 히스토리 목록의 최대 개수

- HOME: 홈 디렉터리

- MAIL: 사용자의 메일박스에 해당하는 파일

- PATH: 명령을 수행할 때 실행 파일을 찾기 위한 디렉터리 목록

- PS1 : 셸 프롬프트를 표현하기 위한 문자열

- SHELL : 사용 중인 기본 셸

- PWD : 현재 작업 디렉토리

- USER : 현재 사용자 계정

 

** 기본 설정 및 도움말 명령어

명령어 형식 설명
help command --help
help command
도움말 보기
chsh chsh [options] [username] 기본 셸 바꾸기
alias alias command='alias' 자주 사용하는 명령의 단축 명령 만들기
alias만 입력하면 현재 설정된 값 출력
type type command
type -a command
명령어가 어떻게 해석되는지 알려주는 명령
which which command 실행 프로그램을 환경변수 PATH를 기초로 찾아 경로 출력
man man [section] 명령의 사용법이나 설정파일에 관한 도움말

** 명령어에 사용되는 특수문자

문자 의미
\ 특수문자의 기능을 제거하는 escape 문자 또는 긴 명령 행을 분리할 때 사용
~ ~ 또는 ~username은 사용자의 홈 디렉터리를 의미함
. 현재 작업 디렉터리를 표시 또는 명령 행의 맨 앞에서 셸 스크립트를 실행하는 source 명령
.. 현재 디렉터리의 부모 디렉터리
# # 문자 뒤에 나타나는 문자를 주석으로 처리
$ $변수 는 변수의 값을 추출
& 명령을 백그라운드로 실행시킴
* 파일 이름에서 사용할 때 0개 이상의 임의 문자열과 대응
? 앞 명령의 출력을 다음 명령의 입력으로 연결
<, > 입출력 리다이렉션에서, 즉 파일로부터 입력받을 때 또는 파일로 출력할 때
명령 > 파일 명령 수행에 필요한 표준 입력 대신에 파일로부터 얻음
명령 > 파일 명령 수행의 결과를 표준 출력으로 보내지 않고 파일에 기록
명령 2> 파일 명령 수행 중 표준 오류 출력을 파일에 덧붙임
>> 표준 출력의 파일의 끝에 덧붙일 때
! 명령 히스토리 기능을 이용
| 앞 명령의 출력 결과를 다음 명령의 입력으로 연결

셸 스크립트

셸 스크립트는 셸 명령어의 집합으로 이루어진 텍스트 파일이다. 셸 스크립트는 프로그래밍 언어 구조를 사용할 수 있고 길거나 반복하는 작업을 작성하여 명령어처럼 사용할 수 있다.

 

1. 주석

#를 사용하여 주석을 달 수 있다.

※ 참고로 첫 행에는 #! /bin/bash를 작성해야 한다. #! 이후의 경로는 스크립트의 명령어를 해석할 프로그램의 위치를 나타내며, 이 문장 이하의 코드들은 bash를 통해서 해석되어야 함을 알려준다.

 

2. 변수

선언 없이 변수를 사용할 수 있으며, 변수의 값은 기본적으로 문자열로 취급된다. 따옴표를 사용하여 공백 문자열을 대입하거나, $()를 이용하여 명령을 실행한 결과를 대입할 수도 있고, $[]를 이용하여 수식을 계산한 결과를 대입할 수도 있다. 변수를 사용할 때는 앞에 $를 붙여준다.

 

3. 함수

함수는 셸 스크립트에서 반복적으로 사용하는 명령의 묶음이다. 함수를 정의할 때는 아래와 같은 형태로 정의할 수 있다.

function name {
	command
    return
}

 

4. 제어구조

1) 선택구조

- if 명령

$ if true; then
> echo "Success"
> else
> echo "Fail"
> fi

- test 명령: 조건을 검사하며 조건이 만족되면 0을 아니면 1을 리턴함

if [ $1 -eq $2 ]; then
	echo "$1 equals to $2."
elif [ $1 -gt $2 ]; then
	echo "$1 is greater than $2."
else
	echo "$1 is less than $2."
fi

- case 명령: 다중 선택을 지원

read -p "True or False" Answer
case $Answer in
	True|t|T)
    	echo "It is True"
		;;
	False|f|F)
    	echo "It is False"
		;;
	*) echo "Invalid answer"
esac

 

2) 반복구조

- for 명령: 모든 데이터를 한 차례씩 처리하는 제어구조

아래 예시에서는 변수 i에 값을 순차적으로 대입하여 do~done 사이의 echo 명령을 수행한다.

$ for i in {A..D}; do echo $i; done

아래 예시는 a=0으로 변수를 초기화하고 a<10 가 참인 동안에 a++을 반복 수행한다.

for ((a=0; a<10; a++)); do
echo "$a"
done

- while 명령: 조건이 참인 동안 명령을 반복 수행함 (-le는 앞의 정수가 뒤의 정수와 작거나 같은가를 의미함)

N=1

while [ $N -le 10 ]; do
	echo -n "$N "
	N=$[$N+1]
done

- until 명령: 조건이 참이 될 때 까지, 즉 거짓일 때까지 반복 수행함(-gt는 앞의 정수가 뒤의 정수보다 크거나 같은가를 의미함)

N=1
until [ $N -gt 10 ]; do
	echo -n "$N "
	let N=$N+1
done
echo

 

** 셸 스크립트 관련 명령어

명령어 형식 설명
bash scriptfile   서브 셸을 새로 생성하여 스크립트를 실행
./scriptfile

서브 셸을 새로 생성하여 스크립트를 실행(권한 필요)
source scriptfile
.scriptfile
  현재 셸에서 스크립트를 실행

디렉토리와 파일

1. 디렉토리

출처:&nbsp;https://inpa.tistory.com/entry/LINUX-%F0%9F%93%9A-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0

리눅스는 시스템과 관련된 정보들을 파일로 관리하고, 이러한 파일을 효율적으로 관리하기 위해 디렉토리를 사용한다. 디렉토리는 컴퓨팅에서 파일을 분류하기 위해 사용하는 공간이며, 파일을 효과적으로 관리하기 위해 트리구조를 사용한다. 리눅스에서는 디렉토리(d)도 하나의 파일로 취급하며, 디렉토리 파일에는 디렉토리에 저장된 파일과 하위 디렉토리의 정보를 저장한다. 세부 디렉토리는 다음과 같다.

디렉토리명 위치 설명
루트 디렉토리 / 파일 시스템의 바탕을 이루는 디렉토리
모든 파일과 디렉토리의 최상위 디렉토리
바이너리 디렉토리 /bin, /sbin 기본적인 명령 및 시스템 관리와 관련된 명령의 실행파일
사용자명령은 /bin, 관리자용 명령은 /sbin
부트 디렉토리 /boot 리눅스 부팅에 대한 정보를 가진 파일의 디렉토리
커널 이미지와 부트 로더의 설정 파일을 포함
디바이스 디렉토리 /dev 장치를 접근하는 데 사용되는 디바이스 파일이 위치
하드디스크(/sda), CD-ROM, 마우스, 키보드 등이 파일화되어 저장
시스템 설정 파일 디렉토리 /etc 시스템의 중요한 환경 설정 파일
사용자 계정 디렉토리 /home 사용자 계정의 홈 디렉토리를 만드는 디렉토리
해당 사용자만 사용할 수 있는 독립적인 공간
사용자를 추가하면 사용자 id와 동일한 디렉토리가 생성됨
공유 라이브러리 디렉토리 /lib 프로그램들이 사용하는 시스템 라이브러리 파일이 위치
/bin, /sbin에 있는 프로그램이 의존하는 라이브러리 파일들
미디어 디렉토리 /media 이동식 저장장치가 마운트될 때 마운트 지점을 제공하는 디렉토리
시스템 정보 디렉토리 /proc 커널이 사용하는 가상의 파일 시스템(메모리 영역)
커널 관련 정보가 저장됨
루트 계정의 디렉토리 /root 루트 계정의 홈 디렉토리 (/와 다름)
시스템 바이너리 /sbin 시스템의 이진파일(실행파일)
사용자 디렉토리 /usr 일반 사용자들이 사용하는 디렉토리
가변 자료 저장 디렉토리 /var 시스템 운영 중에 필요한 가변 자료(로그, 캐싱파일 등)가 저장되는 디렉토리

※ 마운트: 저장장치를 사용하기 위해 장비를 파일 시스템에 부착하는 것으로, 이를 통해 운영체제가 장비를 인식할 수 있게 함

 

2. 파일

리눅스에서는 모든 것이 파일로 취급된다. 데이터를 저장하는 데 주로 사용하는 대부분의 파일을 정규 파일이라고 한다. 바이너리 형태로 저장되어 있는 경우 바이러니 파일이라고 한다. 심볼릭 링크(l)는 원본 파일에 대한 링크로, 윈도우의 바로가기와 비슷하다. 리눅스에서는 각종 장치들도 파일(b c)로 취급되는데 블록 단위로 읽고 쓸 수 있는 블록 디바이스 파일과, 문자단위로 읽고 쓸 수 있는 문자 디바이스 파일로 구분된다.

 

3. 권한

파일과 디렉토리에는 권한이 없는 사용자들의 접근을 막기 위해 권한을 설정할 수 있다. 사용자는 소유자(u), 그룹(g), 그 외(o)로 분류된다. 사용자 분류에 따라 읽기(r), 쓰기(w), 실행(x) 권한을 갖는다.

 

** 디렉터리 및 파일 관련 명령어

명령어 형식 설명
ls ls [options] [names] 파일과 서브 디렉터리의 목록, 정보를 나열
file file [file] 파일의 종류를 알려주는 명령
pwd   절대 경로 방식으로 현재 작업 디렉터리를 알려주는 명령
cd cd [directories)] 작업 디렉토리를 이동하는 명령
mkdir mkdir [options] directories 디렉토리 생성
rmdir rmdir [options] directories 디렉토리 삭제
rm rm [options] files 파일 삭제
cp cp [options] file(혹은 dir) file(혹은 dir) 파일이나 디렉토리 복사
mv mv [options] file(혹은 dir) file(혹은 dir) 파일이나 디렉토리의 이름을 변경하거나 다른 디렉토리로 이동
chmod chmod [options] mode files 파일의 접근권한을 변경
unmask umask [-S] [mask] 접근권한의 기본값을 출력하거나 설정하는 명령
chown chown [options] newowner files 파일이나 디렉터리의 소유자를 변경하는 명령
touch touch file 파일의 접근, 수정 시간을 현재시간으로 변경하며, 파일이 존재하지 않으면 파일을 생성함
ln ln [options] 원본파일명 [대상파일명] 파일을 다른 이름으로 연결하는 명령
more more [options] files 파일의 내용을 화면 단위로 출력
less less [options] files more 명령의 개선된 버전으로 위, 아래로 스크롤할 수 있음
head head [options] [files] 파일의 맨 앞 부분을 출력
tail tail [options] [files] 파일의 마지막 부분을 출력
cat cat [options] [files] 하나의 파일 또는 여러 파일을 연결시켜 화면에 출력
locate locate [options] pattern updated 명령으로 만들어진 데이터베이스에서 문자열이 포함된 파일 출력
find find [pathnames] [expression] 검색 위치에서 조건에 맞는 파일 찾기
grep grep [options] patern [files] 파일에서 지정된 문자열 패턴을 포함한 라인을 찾아 출력

운영체제

 

1. 운영체제의 부팅

운영체제는 시스템의 자원과 동작을 관리하는 소프트웨어이다.

부팅이 되면 제일 먼저 CPU가 켜지고, ROM(비휘발성 메모리)에 있는 BIOS(Basic Input Output System)의 펌웨어가 실행된다. BIOS는 POST(Power on self test)를 통해 하드웨어를 검사한다. 이상이 없다면 MBR(Mast boot record, 첫번째 하드디스크, 첫번째 디스크, 첫번째 섹터)에 있는 부트 로더가 실행된다.

대부분 리눅스 배포판의 부트로더는 GRUB로, 부트로더는 커널을 찾아서 메모리에 적재하고 실행하는 역할을 담당한다. 부트로더는 커널을 RAM에 적재 하고, 부팅과정에서 필요한 임시 파일 시스템인 initramfs를 로드한다. 이후 부트로더는 커널에 제어를 넘기고, 커널이 실행된다. 커널은 하드웨어를 점검하고 초기화하며, /sbin/init 프로그램을 실행시키고 제어를 init에 넘긴다. init은 나머지 초기화 과정을 처리한 후 사용자 명령을 대기한다.

 

2. 초기화 데몬

데몬(demon)이란 사용자가 직접 제어하지 않고, 백그라운드에서 여러 작업을 하는 프로그램을 말한다. 앞서 살펴본 init은 초기화 데몬으로서, 모든 사용자 프로세스의 최상위 조상 프로세스이다. 초기 사용자 환경을 준비한 이후에도 계속 수행되고, 시스템 운영을 관리한다. /etc/init/ 디렉토리에 있는 job 설정 파일(확장자 .conf)을 읽는다.

- /etc/init/rcS.conf : 부팅 시 한번 실행되며, 시스템 초기화와 관련이 있는 내용이 설정되어 있음

- /etc/init/rc.conf : 부팅되거나 런레벨이 바뀔 때 필요한 서비스를 시작하거나 필요 없는 서비스를 중단

- /etc/inittab : 부팅 시 정해지는 초기 런레벨이 정의된 파일

- /etc/rc.d/rc.local : 런레벨 2,3,5에서 가장 마지막에 실행되는 스크립트

※ 런레벨이란, 리눅스 시스템을 부팅할 때 프로그램의 실행 순서를 정의한 것이다. 런레벨 0은 시스템이 종료될 때 사용되는 레벨, 런레벨 1은 단일 사용자 모드(루트 사용자로서 시스템 점검/복구), 런레벨 2는 다중 사용자 모드, 런레벨 3은 모든 네트워킹을 지원하는 다중 사용자 모드, 런레벨 4는 미사용, 런레벨 5는 그래픽 사용자환경을 제공하는 다중 사용자 모드, 런레벨 6은 시스템을 재부팅할 때 사용되는 레벨이다.

 

전통적인 init 데몬은 런레벨에 기초하여 순차적으로 서비스를 실행했다. 이 경우 시간이 오래걸리고 복잡한 스크립트로 효율적인 대처가 어려웠다. 이를 보완하기 위해 Ubuntu에서 Upstart init 데몬을 만들었다. 복잡한 스크립트가 간단한 설정 파일로 대체되었다.

 

3. 운영체제의 종료

init 프로세스를 통해 런레벨을 바꾸어 종료하는 것을 말한다. init 프로세스는 모든 프로세스에게 종료를 알리고, 스스로 종료하도록 TERM 시그널을 보낸다. 종료하지 않는다면 강제 종료를 위한 KILL 시그널을 보낸다. 시스템 파일을 잠그고, 파일 시스템은 언마운트하며, 버퍼에 있는 데이터를 기록하고, 커널에 종료를 요청한다.

 

** 운영체제 부팅, 데몬, 종료 관련 명령어

명령어 형식 내용
initctl initcl command job job의 상태를 확인하거나 수동으로 시작, 중지시키는 명령
telinit telinit runlevel 런레벨을 바꾸는 명령
runlevel   이전 런레벨과 현재 런레벨을 확인하는 명령
chkconfig   부팅 시 런레벨에 따른 시스템 서비스의 활성화 여부를 확인하거나 변경
service   /etc/rc.d/init.d/ 디렉터리에 존재하는 초기화 스크립트를 수동으로 실행 또는 중지시키는 관리자 명령
logout
exit
  로그인 셸에서 사용자의 계정을 마치고 빠져나오는 명령
shutdown shutdown [options] time [message] 시간을 정해 시스템을 안전하게 종료하는 명령
halt   종료
reboot   재부팅

사용자 관리

1. 계정

리눅스는 다중 사용자 환경을 지원하기 때문에 관리자 입장에서 계정 별로 권한을 통제할 수 있다. 계정은 각각의 UID를 갖는다. 계정을이 생성될 때에는 /etc/login.defs 파일과 /etc/default/useradd 파일을 읽어서 사용자 계정 생성과 관련된 기본 값을 확인한다. 이후  /etc/passwd 파일과 /etc/shadow 파일에서 새로운 사용자 계정 항목을 생성한다. /etc/group 파일에는 새로운 그룹이 추가되고, /home/  디렉토리로 사용자 계정의 홈 디렉토리가 생성된다. 또한 /etc/skel/ 디렉토리에 있는 파일을 사용자 계정의 홈 디렉토리에 복사된다. 각 파일을 정리하면 다음과 같다.

- /etc/login.defs : 사용자 계정을 생성할 때 필요한 기본값을 정의한 파일

- /ect/default/useradd : useradd 명령이 참조하는 기본값을 설정한 파일

- /etc/passwd : 사용자 계정에 관한 정보

- /etc/shadow : 사용자 계정의 암호 정보와 패스워드 정보

- /etc/skel: 사용자 홈 디렉토리에 복사되는 파일(.bash_profile, .bashrc, .bash_logout 등)을 갖고 있음

 

2. 그룹

사용자들의 계정을 모아서 하나의 집합으로 만든 것이 그룹이다. 그룹도 계정과 마찬가지로 GID를 갖는다. 사용자는 계정이 생성될 때 주 그룹을 갖게 되고, 0개 이상의 부 그룹에 속할 수 있다. 만약 사용자가 파일이나 디렉토리를 생성하면 소유 그룹은 사용자의 주 그룹으로 지정된다. 

- etc/group : 그룹 계정의 정보를 가진 파일

- etc/gshadow: 그룹의 비밀번호 저장group

 

** 사용자 관리 관련 명령어

명령어 형식 내용
su   지정된 사용자의 로그인 셸을 시작 혹은 계정 전환
sudo   루트 권한을 이용하여 명령어를 실행
useradd
useradd [options] username 게정 생성 및 설정 명령
chage chage [options] username 사용자의 비밀번호 만료에 관한 정보를 변경
usermod usermod [options] username 사용자 계정 수정
userdel userdel [options] username 사용자 계정 삭제
id username
group username
  자신의 그룹을 확인
groupadd groupadd [options] group 그룹 계정 생성
gpasswd gpasswd [options] group 구성원 추가, 삭제, 설정, 비밀번호, 관리자지정 등 그룹 관리
groupmod groupmod [options] group 기존 그룹의 정보(GID, 그룹명)를 수정
groupdel groupdel group 그룹 삭제

텍스트 편집기: vi

출처:https://withcoding.com/112

리눅스에서는 설정정보와 셸 스크립트 등이 텍스트 중심으로 존재한다. 리눅스에서는 gedit, emacs, vi 등의 편집기를 제공하는데, vi는 가장 보편적인 화면 편집기이다. 현재는 오리지날 vi 보다는 기능을 모방하여 만들어진 클론을 사용한다. 리눅스 배포판에서는 vim을 사용하는데, vim(vi improved)는 파일구조를 표시하기 위해 컬러를 사용하거나, 마우스 지원, 다중 undo, 다중 탭, 비주얼모드 등을 지원한다.

 

vi는 세 가지 모드로 동작을 한다.

- 명령모드: 커서 이동, 삭제, 복사, 붙여넣기 등

- 라인모드: 저장, 검색, 대치 등

- 입력모드: 입력

설명 명령
시작 셸 프롬프트에서 vi [options] [filename]
종료 명령모드에서 shift + zz, 라인모드에서 :q, :q!, :wq:, :x, :x! 등 입력
텍스트 삽입 명령 입력모드에서 a, A, i, l, o, O 등 입력
커서 이동 명령 명령모드에서 h, j, k, i, w, b, 0, $ 등 입력
텍스트 삭제 명령 명령모드에서 x, dw, d0, dd, 5dd, dG 등 입력
텍스트 변경(치환) 명령 R, s, cl, cb, cw, c) 등의 명령을 수행하면 입력모드로 전환되기도 함
텍스트 복사 삭제 혹은 변경 시 텍스트가 복사되거나 커서를 이동한 후 y 명령으로 복사
텍스트 붙여넣기 yy, yw, y0, yG, y) 등
블록 지정 v, V 등
작업 취소 u, Ctrl+r 등
검색 명령모드에서 f 사용
검색 후 대치 [g] [address] s/pattern/replacement[/option]

파일 시스템

1. 마운트와 언마운트

마운트란 파일 시스템을 특정 디렉토리에 연결하는 것이다. /etc/fstab 파일에는 부팅 시 자동 마운트되는 파일 시스템의 목록이 있는데, 디바이스, 마운트지점(디렉토리), 파일시스템 유형, 옵션, 덤프 여부, 파일 시스템 검사 여부가 기록된다. 마운트 혹은 언마운트 시 /etc/mtab 파일에 기록된다.

 

2. 파티션

파티션이란 물리적인 저장 장치를 논리적으로 분할한 것이다. 하나의 하드 디스크 안에는 여러 개의 파티션을 만들 수 있으며, 하나의 파티션을 독립된 저장장치로 활용할 수 있다. 파티션을 나누어 사용하는 이유는 여러 운영체제를 사용하고 싶은 경우, 파일이 손성될 경우를 대비하거나, 별도의 파티션으로 운영하여 빠르게 부팅하거나 뒤에서 설명되는 스왑 옵션을 사용하는 경우 등이 있다.

저장 장치를 사용하기 위해서는 파티션을 만들고 파일 시스템을 만들어야 한다. 이러한 파티션을 관리할 수 있는 도구들이 있는데 fdisk, parted, gdisk, gparted가 있다. 또한 파티션의 스타일로는 MBR과 GTP가 있다. 전통적인 MBR은 최대 파티션을 4개까지 생성할 수 있는데, GPT는 주 파티션을 128개까지 생성할 수 있다. 각각의 관리 도구들마다 지원하는 MBR과 GPT가 다르다.

 

3. 볼륨

볼륨이란 크기가 다시 조정될 수 있는 파티션을 말한다. 여러 저장 장치에서 각각의 물리 볼륨을 만들고, 이를 합쳐 볼륨 그룹을 구축한다. 볼륨 그룹을 또다시 여러 논리 볼륨으로 나누어 사용한다.

- 물리 볼륨: 하나의 물리적 디스크

- 볼륨 그룹: 여러 물리 볼륨을 하나로 묶은 것

- 논리 볼륨: 볼륨 그룹에서 가용한 공간을 분할한 것

 

4. 파일 시스템

파일 시스템이란 정보의 저장과 검색을 위해 저장장치를 어떻게 구성하고 관리할지에 대한 체계이다. 파일 시스템의 종류에 따라 파티션의 크기, 수, 파일 크기, 성능, 보안 등에 차이가 있다. 파일 시스템의 종류로는 ext4, iso9660, yfat, HFS+, Btrfs, XFS 등이 있다. 리눅스는 기본 파일 시스템으로 ext4를 주로 채택한다.

유닉스 계열에서 사용하는 파일 시스템은 하드디스크의 파티션의 블록그룹에서 슈퍼 블록, inode 테이블, 데이터블록 등으로 구성된다. 

출처:https://lilo.tistory.com/17

- 슈퍼블록: 파일 시스템 구성에 대한 정보(블록의 크기, 전체 블록 개수, 디스크 블록 맵)을 기록한 블록

- inode: 파일 또는 디렉토리가 기술된 데이터 구조(inode 번호, 파일의 형태, 소유자, 접근권한, 수정시간, 링크 수, 블록 위치 등)

- 데이터 블록: 실제 데이터가 저장되는 블록

그 외에 스왑(SWAP) 파티션이 있는데, 스왑 파티션은 컴퓨터 메모리가 가득차게 되면 스왑 파티션에서 실행될 수 있도록 한다. 메모리가 가득 차서 부족한 경우, 실행 가능한 예비 공간의 역할이다.

 

** 파일 시스템 관련 명령어

명령어 형식 내용
mount mount [options] device | directory 파일 시스템을 지정된 디렉터리(마운트지점)에 붙여 파일 시스템을 사용할 수 있게 함
unmount unmount [options] device | directory 디렉터리에 마운트 되어 있는 저장장치를 해당 디렉터리로부터 분리
parted
fdisk
  파티션 만들기
mkfs mkfs [-t fs-type] device 파일 시스템 만들기
pvcreate   파티션을 초기화하여 물리 볼륨으로 만듦
pvdispaly   물리 볼륨의 속성을 출력
vgcreate   pvcreate로 만든 블록 디바이스로부터 새로운 볼륨 그룹을 생성
vgextend   기존 볼륨 그룹의 크기를 늘리기 위해 물리 볼륨을 추가
vgdisplay   볼륨 그룹의 속성을 출력
lvcreate   볼륨 그룹에서 새로운 논리 볼륨을 생성
lvdisplay   논리 볼륨의 속성을 출력
fsck fsck [options] device 파일 시스템의 무결성을 검사하고 손상된 파일을 고치는 명령
df df [options] [names] 마운트 되어 있는 파일 시스템의 공간 사용 정보
du du [options] [directories] 디렉터리나 특정 파일의 디스크 사용량을 표시

프로세스 관리

1. 프로세스의 의미

프로세스란 현재 실행중인 프로그램을 말한다. 각 프로세스는 고유한 PID(Process ID)를 갖고 있으며, 커널은 프로세스에 대한 정보를 프로세스 관리 블록(PCB)저장하고, 프로세스는 시스템 자원을 사용하여 여러가지 상태 변화를 겪는다. 프로세스 관리 블록에는 프로세스에 대한 정보(PID, UID, 현재 준비상태, 우선순위, 자원정보 등)가 저장된다.

 

2. 명령의 실행

셸에서 명령을 실행하면 새로운 프로세스가 만들어진다. 만약 특정 명령을 실행했다면 시스템 호출 fork()를 호출하여 자신의 복사본인 프로세스(자식 프로세스)가 생성된다. 자식 프로세스는 시스템 호출 exec 를 호출하여 명령을 실행한다. 시스템 호출이란 커널에 접근하기 위한 인터페이스를 말한다.

 

3. 포어그라운드, 백그라운드 프로세스

프로세스는 포어그라운드 프로세스와 백그라운드 프로세스로 나뉜다. 포어그라운드 프로세느는 터미널에 대한 제어권을 갖기 때문에 프로세스가 끝나기 전에는 다른 명령을 수행할 수 없다. 백그라운드 프로세스는 출력은 가능한 상태이지만 키보드 입력을 받을 수 없도록 되어있으며, 입력 없이 장시간 실행되어야 하는 경우 주로 사용된다. 명령어 끝에 &을 붙이면 백그라운드 프로세스로 실행된다.

 

4. 시그널

리눅스에서는 프로세스끼리 서로 통신할 수 있는 '시그널'이라는 것이 있다. HUP는 터미널이 종료될 때 연결된 모든 프로세스에게 보내지는 시그널이다. KILL은 프로세스를 강제로 즉시 종료시키는 것이며, CONT는 stop 시그널로 중단된 프로세스를 재개하는 것, STOP은 프로세스를 잠시 중단시키는 것 등이 있다.

 

5. cron 서비스

cron 서비스란 지정된 시간에 주기적으로 자동으로 작업이 수행되는 것을 말한다. /etc/crontab 파일과 /etc/corn.d/ 디렉터리에 존재하는 파일을 검사하여 주기적으로 수행될 작업을 찾고 설정된 내용으로 작업을 수행한다. crontab 파일에는 시간, 실행해야하는 명령 등을 포함하고 있다.

 

** 프로세스 관리 관련 명령어

명령어 형식 내용
jobs jobs -l 프로세스 상태 확인
ps ps [options] [users, format, PIDs] 현재 프로세스의 상태를 확인하는 명령
top top [options] 현재 실행 프로세스의 모니터링과 관리를 위한 대화식 도구
kill kill [-signal] pids 다른 프로세스에게 시그널을 보내도록 커널에게 요청
killall killall [options ] [-s signal ] [-u user] name 특정 프로세스에 한꺼번에 시그널을 보내는 명령
nice
renice
nice [option] [command]
renice priority [options]
nice 우선순위(NI) 값을 조정하는 명령
nohup   명령이 스스로 종료될 때까지 계속 수행시키는 명령
cron crontab [options] 자신의 crontab 파일에 등록할 때 사용하는 명령

소프트웨어 관리

1. 패키지 파일

리눅스에서는 소프트웨어를 설치하고 업데이트를 할 수 있다. 컴파일 되어 있는 패키지를 다루고 관리하는 것이 효율적인 방법이다. 패키지 파일의 표준 형식은 리눅스 배포판에 따라 상이한데 데비안 계열은 DEB를, 레드햇 계열은 RPM을 사용한다. 패키지 파일은 바이너리 프로그램과 메타 데이터, 스크립트 파일이 담겨져 있다. 메타데이터는 패키지 관련 정보를 담고 있으며, 스크립트 파일은 환경 설정을 위한 파일이다.

 

2. 패키지 관리자

1) RPM

RPM은 레드햇 계열 리눅스의 패키지 파일의 표준 형식이다. RPM은 RPM Package Manager를 의미하기도 한다. 만약 패키지를 설치할 때 선행 패키지가 설치되어 있지 않다면 설치가 실패할 수 있다. 따라서 RPM을 이용할 때는 선행 패키지를 미리 찾아 설치해야 한다.

 

2) YUM(Yellowdog Updater Modified)

RPM 방법에 기초한 패키지 관리자로 앞서 언급된 의존성 문제를 해결한다. 즉, 선행 패키지를 검색하여 자동으로 설치해준다. 또한 저장소 설정 파일에 저장소 정보를 저장하고, 설치 혹은 업데이트 시 저장소로부터 다른 패키지를 찾아서 설치한다. 아래는 YUM의 설정 파일이다.

- /etc/yum.conf : 파일을 저장하는 캐시 디렉토리, 설치 후 캐시 보관여부, 디버그 메시지, 로그 파일 등의 설정 옵션

- /etc/yum.repos.d/ 디렉터리의 *.repo 파일 : 저장소 아이디, 이름, 베이스 url 등 저장소 설정 파일

yum은 설정파일을 읽고 저장소에 있는 메타데이터가 로컬 캐시 디렉토리에 저장되어 의존성을 확인한 후 필요한 패키지를 다운로드 받는다. 패키지에 포함된 파일을 디렉토리에 복사하여 설치하하고, 설치된 패키지 정보를 저장한다.

 

3. 파일 압축

리눅스에서는 gzip, bzip2, xz, zip 등의 압축 기술을 이용하여 파일을 압축한다. gzip의 경우 .gz 확장자를 갖는 파일이 만들어지는데, 가장 널리 사용되는 리눅스 압축 프로그램이다. bzip2는 gzip 보다 압축 효율이 좋으나 압축 속도가 느리다.

 

** 소프트웨어 관리 관련 명령어

명령어 형식 내용
rpm rpm [options] [packages] 패키지를 설치, 업데이트, 삭제하거나 정보를 확인하는 명령
yum yum [options] command 패키지를 설치, 업데이트, 삭제하거나 정보를 확인하는 명령
gzip
gunzip
gzip [options] files
gunzip [options] files
압축 파일의 형식이자 파일의 압축과 해제를 위한 프로그램
bzip2 bzip [options] files 블록 정렬 압축 알고리즘을 사용한 파일 압축 프로그램
tar tar mode [options] [tarfile] [pathnames] 여러 파일을 하나의 아카이브 파일로 묶거나 아카이브 파일에서 파일을 추출하는 명령

네트워크 관리

네트워크 인터페이스란 컴퓨터와 네트워크 간의 연결을 제공하는 장치를 말한다. 네트워크 인터페이스 카드(랜카드 또는 이더넷카드)에 위치하며, 이 카드는 고정된 이더넷주소(MAC주소)를 갖고 있고 IP주소를 할당받는다.

 

네트워크와 관련하여 리눅스의 스크립트를 정리하면 아래와 같다.

- /etc/rc.d/init.d/network: 부팅 시 실행되며 네트워크 카드의 활성/비활성을 담당한다.

- /etc/rc.d/init.d/NetworkManager : 부팅 시 실행되어 네트워크를 자동으로 연결하거나 변경된 설정을 즉시 처리해준다. 

- /etc/sysconfig/network : 네트워킹의 활성화 여부, 호스트명, 기본 게이트웨이 등 네트워크 설정을 포함한다.

- /etc/resolv.conf  : DNS 서버를 지정하며 사용할 도메인명과 도메인 검색 경로 등도 지정한다.

- /etc/hosts : 호스트명과 IP 주소 및 별명을 설정한 파일이다.

- /etc/hosts.allow : TCP/IP 서비스를 이용할 수 있는 호스트들을 설정한다.

- /etc/hosts.deny : TCP/IP 서비스를 이용할 수 없는 호스트들을 설정한다.

 

** 네트워크 관리 관련 명령어

명령어 형식 내용
ifconfig   네트워크 인터페이스 정보를 확인하거나 설정
ping ping [options] destination 원격 호스트와의 연결 여부와 네트워크의 상태 정보(송신 패킷수, 수신 패킷수, 유실된 패킷수 등)를 점검
arp arp [hostname]
arp -a [hostname]
같은 네트워크에 있는 호스트들의 MAC 주소, IP 주소, 인터페이스이름 등을 확인
traceroute traceroute [options] hostname 현재 호스트에서 특정 호스트까지 통신이 이루어지는 경로 확인
route route [add|del] [-net|-host] [target] [netmask ...] [gw ..] … IP 라우팅 테이블을 설정하거나 확인
netstat netstat [options] 네트워크 상태에 관한 정보(네트워크 연결상태, 인터페이스 정보, 시스템 라우팅 테이블, 네트워크 통계 등)를 확인
nslookup nslookup [hostname] DNS 서버를 이용하여 호스트의 IP 주소를 확인

원격 제어

이전 원격 관리 시스템은 암호화가 되어 있지 않아 위변조에 취약했다. 반면 SSH(Secure Shell)은 패킷을 암호화하여 전송하는 프로토콜이다. 전자 서명을 이용하여 서버-클라이언트 간의 연결을 인증하고, 이후 메시지들을 모두 암호화 한다. SSH를 사용하기 위해서는 서버 측에서는 sshd가 데몬의 형태로 동작해야하며, 클라이언트는 ssh, sftp, scp 등이 필요하다. SSH 클라이언트가 SSH 서버를 제어하고, SSH 서버는 서버를 동작시킨다. 만약 방화벽을 사용하고 있다면 사용하려는 서비스의 포트와 프로토콜을 모두 열어두어야 한다. 방화벽 설정파일은 /etc/sysconfig/iptables 이다.

 

OpenSSH 패키지란 SSH 프로토콜을 사용하는 패키지로서 네트워크 연결 도구의 집합이다. 앞서 언급한 sshd, ssh, sftp, scp 등이 포함되어 있고, 현재 대부분의 리눅스 배포판은 OpenSSH가 포함되어 있다. 앞서 배운 명령어인 yum을 사용하여 OpenSSH를 설치할 수 있다.

 

** 원격 제어 관련 명령어

명령어 형식 설명
telnet telnet [-l user] host
telnet user@host
원격의 컴퓨터에 telnet 프로토콜로 접속
ftp   원격 파일 전송
rcp rcp [-r] source_file target_file 원격의 컴퓨터와 서로 파일을 복사
ssh ssh [-l user ] host
ssh user@host
SSH 서버에 원격으로 접속하기 위한 클라이언트 프로그램
sftp sftp [user @]host 서버에 원격 접속하여 파일을 업로드하거나 다운로드할 수 있는 프로그램
scp scp [-r] source_file target_file 원격의 컴퓨터와 서로 파일을 복사

웹서버

웹서버란 클라이언트의 요청을 받고 처리한 결과를 클라이언트에 제공하는 서버 프로그램이다. 주로 사용되는 웹서버는 Apache, IIS, Nginx 등이 있다. 앞서 배운 명령어인 yum을 사용하여 Apache를 설치할 수 있다. Apache의 웹 서버 설정파일은 /etc/httpd/conf/httpd.conf에  담겨져 있다. 해당 설정 파일의 설정 요소들은 다음과 같다.

 

- ServerTokens : 서버의 응답 헤더를 설정하여 클라이언트에게 노출되는 서버의 정보 설정

- ServerRoot : Apache 서버가 설치된 디렉터리

- Timeout : 클라이언트로부터 수신을 기다리는 최대 대기 시간

- PidFile : 주 서버 프로세스로 httpd의 PID가 기록되는 파일을 설정

- KeepAlive : 클라이언트가 한 번의 연결로 서버와 여러 번의 요청과 응답을 주고 받을수 있도록 지속적인 연결을 허용할지 여부를 On 또는 Off로 설정

- MaxKeepAliveRequests : KeepAlive가 On으로 설정된 경우, 클라이언트가 지속적인 연결을 유지하며 보낼 수 있는 최대 요청의 수를 설정

- KeepAliveTimeout : 연결을 끊지 않고 다음 요청을 대기하는 최대 시간

- StartServers : 초기에 생성하는 자식 서버 프로세스의 수를 설정

- MinSpareServers와 MaxSpareServers : 유휴 자식 서버 프로세스 수의 최솟값, 최댓값을 설정

- MaxClients : 동시에 접속 가능한 클라이언트의 수의 최댓값 설정

- MaxRequestsPerChild :1개 자식 서버 프로세스가 종료 전까지 처리할 수 있는 최대 요청 수

- Listen : 서버가 사용할 TCP 포트 번호를 설정

- LoadModule : 웹 서버의 기능을 확장시키는 DSO(Dynamic Shared Object) 모듈을 설정

- User과 Group : Apache 서버의 실행에 사용되는 사용자와 그룹

- ServerAdmin : 서버에 오류가 발생했을 때, 클라이언트로 전송하는 오류메시지에 들어갈 웹 서버 관리자의 이메일 주소를 설정

- DocumentRoot : 웹 서버가 웹 콘텐츠를 저장하는 루트 디렉터리

- UserDir : 클라이언트 요청에서 ~userid 가 있는 경우의 처리 여부를 설정

- DirectoryIndex : 클라이언트가 디렉터리를 요청한 경우, 기본으로 사용할 웹 페이지의 파일 이름을 설정

- ErrorLog : 웹 서버의 에러 로그가 기록될 파일을 설정

- AddLanguage : 웹 서버가 다국어 페이지를 제공하는 경우 웹서버를 통해 서비스되는 웹 문서의 지원 언어를 설정

- AddDefaultCharset : 웹 서버에서 제공하는 응답 문서의 Content-Type이 text/plain 또는 text/html인 경우의 기본 문자 집합을 설정

 

자세한 사항은 공식 홈페이지에 게시된 글을 참조하면 된다: https://httpd.apache.org/docs/2.4/mod/core.html

 

core - Apache HTTP Server Version 2.4

This directive enables operating system specific optimizations for a listening socket by the Protocol type. The basic premise is for the kernel to not send a socket to the server process until either data is received or an entire HTTP Request is buffered.

httpd.apache.org

 


후기

기획을 하면서 늘 궁금했던 것이 백 단에서 이루어지는 일이었다. 학교 강의를 듣다보면 알게 될 것이라는 생각에 강의를 신청했는데, 리눅스는 지금까지 배웠던 것과는 또 다른 세계였다. GUI가 아닌 CLI로 컨트롤을 해야하고, 지금까지 본 프로그래밍 언어와는 많이 다른 명령어들 입력하고, 파일과 디렉토리로 모든 것을 처리하는 것도 낯설었다. 그래도 리눅스는 유명한 도메인 중 95%가 사용하고, 안드로이드도 리눅스 기반이며, 슈퍼컴퓨터의 95%도 리눅스에서 운영되고, IoT에서도 사용된다니 언젠가는 꼭 알아야 하는 내용이라고 생각했다. 이번 학기에 경험해보게 된 것이 좋은 기회였던 것 같다.

출처: 인스타툰(@waterglasstoon)

번외로 예전에 데브경수님의 인스타툰을 보다가 sudo rm -rf 가 무엇일까 궁금했던 적이 있다. 프로그래밍 언어도 아니고 너무 낯선 문장이었다. 리눅스를 공부하다 보니 알게 되었는데, 저 문장은 명령어이고 뜻은 슈퍼유저의 권한으로 묻지도 따지지도 말고 다 삭제하는 것이었다. 저 말을 이해할 수 있다는 것만으로도 놀라운 발전이다!

 

도움 받은 글

1. 방송통신대학교 컴퓨터과학과 강의
2. 생활코딩 리눅스 강의, https://opentutorials.org/course/2598</
3. 1. 운영체제(OS)&부팅과정, https://justzino.tistory.com/2
4. [OS] 운영체제 부팅순서, https://honeywater97.tistory.com/156
5. 위키백과, 유닉스, https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%89%EC%8A%A4#cite_note-1
6. 위키백과, 시분할 운영체제, ko.wikipedia.org
7. 나무위키, 리눅스, https://namu.wiki/w/Linux
8. Linux - 리눅스 디렉터리 종류와 특징, dev-mystory.tistory.com
9. [Linux] 리눅스 데릭토리 구조 - 한눈에 정리, https://inpa.tistory.com/entry/LINUX-%F0%9F%93%9A-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0
10. 리눅스 쉘(shell)의 이해, https://atoz-develop.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%89%98-shell-%EC%9D%98-%EC%9D%B4%ED%95%B4
11. 리눅스 vi 에디터 사용법(vim 단축키 정리), https://withcoding.com/112
12. 리눅스(Linux) 환경변수 PATH? 환경변수 설정 방법, https://tigercoin.tistory.com/39
13. 데몬(daemon) 프로세스란 무엇인가? https://blogger.pe.kr/770
14. MBR GPT 파티션의 차이점, https://texit.tistory.com/55
15. Linux) 파일 시스템은 무엇일까?, https://lilo.tistory.com/17
16. [bash 쉘 스크립트] 스크립트 실행하기, https://gracefulprograming.tistory.com/109
17. Bash Shell - Case 조건문, https://codechacha.com/ko/shell-script-case/

 

728x90

댓글