가장 쉬운 리눅스
가장 쉬운 리눅스 관련 기록.
이 글의 목차
This is linux / 가장 쉬운 리눅스 시스템 관리 책 내용 정리
- Written By 우재남 / 웨일 소잉카
리눅스 배포판의 기술적 요약
- 리눅스는 처음에는 해커들의 장난감 취급이었지만 지금은 안정성, 성능, 확장성 모두 뛰어남
- 소프트웨어 모음으로서의 리눅스는 일반적으로 배포판이라고 함. 배포판은 리눅스를 유용하게 만들어줌.
- 리눅스 자체는 커널이라고 볼 수 있음. 커널은 운영되는 서비스의 최고 사령관 개념으로 동작하는 프로그램
- 메모리의 요구사항을 관리하고, 디스크에 접근 혹은 네트워크 연결을 관리.
- 커널 작업 목록도 다뤄야 할 것이 한가득이며 책도 여러개 나왔음
- 커널은 사소한 프로그램이 아님. 수많은 리눅스 배포판 모두에 리눅스 이름을 붙일 수 있게 해주는 것
- 모든 배포판들이 근본적으로 동일한 커널을 사용. 리눅스 배포판들의 기본적인 수행방식은 동일
- 배포판의 예시
- 레드햇 엔터프라이즈 리눅스(RHEL)
- 페도라(Fedora)
- 데비안(Debian)
- 맨드레이크(Mandrake)
- 우분투(Ubuntu)
- CentOS
- …
- 순수 상업용 배포판 / 비상업용 배포판(spin) 으로 나누어짐.
- GNU: GNU is Not Unix. 깔깔깔. GNU 프로젝트
- 유닉스 계열 시스템(당시 핫했음, AT&T가 이 코드로 돈 좀 만짐)을 대중에 공유하고 라이선스 제약을 풀자는 주장 하에 생긴 것.
- GPL 라이선스 라는 것을 사용함
- 소프트웨어가 완벽하게 공개이며 그 누구도 이러한 자유를 없앨 수 없음.
기본 개념과 명령어
명령어 정리
- pwd: print working directory
- whoami: 로그인 계정 출력
- ln <파일명> <파일명> : 하드 링크 만들기 (linux 내부적으로 갖는 완전히 동일한 파일 링크를 만듬 — 완전히 같은 파일인 것처럼 행동함)
- ln -s <파일명> <파일명> : 심볼릭 링크 만들기 (눈에 띄는 링크를 만듬)
- mount -o remount,rw /
- 읽기 전용 파티션으로 마운트된 (mount 명령어로 확인) 폴더를 읽기/쓰기 모드로 붙일 수 있음.
- yes > /dev/null
- 무한 루프를 도는 단순한 프로세스 만들기
- ls -l /etc | more
- 한 페이지 넘어가는 것 편하게 보기
- ps -ef | grep bash
- 프로세스 특정한 것만 보기
- Redirection 명령어들
- ls -l > list.txt (overwrite)
- ls -l >> list.txt (append)
- sort < list.txt (list 내용을 정렬하여 출력)
- sort < list.txt > out.txt (list 내용을 정렬해서 out에 쓰기)
- kill -9 PS_NUM
- 무조건 종료한다는 의미가 -9.
- foreground process를 background process로 전환
- yes > /dev/null
- Ctrl + Z (일시 중지 명령어)
- bg
- 이러면 백그라운드로 이동하여 계속 실행 됨.
- background process를 foreground process로 전환
- jobs (백그라운드 가동 프로세스 확인)
- fg [작업번호] (포그라운드로 전환)
- 세미콜론(;): 명령어를 연속으로 실행할 때 사용
- ls -l [검색할 파일 명]: 하위 폴더까지 재귀적으로 찾아줌..
- ex: ls -l /dev/sd*
- halt -p : 시스템 종료
- which [커맨드 명] : 실행하려는 커맨드 위치가 어디인지 보여줌
readiz@Readiz-NotePC:~$ which bash /usr/bin/bash readiz@Readiz-NotePC:~$ which systemd /usr/bin/systemd
폴더 구조
-
/home- 리눅스 사용자들의 개인 공간
- 보통 일반 사용자는 home 밑에 별도의 설정이 없는 경우 자신의 아이디로 된 디렉토리가 배정됨(로그인 시 처음 작업 디렉토리가)
- /root는 root 의 홈 디렉토리
-
/bin&/bash- sbin 은 시스템 관리를 위한 명령들 => root에게만 허용됨
- echo $PATH 로 확인
-
/lib- 리눅스 상에서 자주 사용되는 라이브러리를 모아놓음
- Shared object file format(.so)
- 윈도우에서의 Dynamic Linked Library(DLL)을 모아놓은 폴더로 생각할 수 있음
-
/etc- 주요 설정 파일들이 위치한다
- 주요 리스트
- motd : 로그인 성공 시 처음에 띄워주는 문구
- passwd : 리눅스 사용자에 대한 정보(예전에는 사용자의 비밀번호(!) 도 있었음)
- shadow : 리눅스 사용자 패스워드 정보 ( root만 볼수 있음)
- sudoers : sudo 권한을 가진 사용자와 권한에 대한 정보
- fstab : 파일 시스템과 마운트 포인터
- hosts : 도메인 네임
- issue : 리눅스 배포반 및 버젂
- skel/ : 새로운 사용자가 추가될 때 홈 디렉토리에 기본적으로 복사해줄 파일들을 포함한 디렉토리
- init.d/ : 컴퓨터가 부팅될 때 실행될 파일들을 넣어둔 디렉토리
-
/proc- RAM 위에 존재하며 커널에 의해 제어됨
- 현재 실행되는 프로세스와 실제로 사용되는 장치, 커널이 수집한 하드웨어 정보가 저장됨
- 사용자가 /proc이나 하위 파일에 접근할 때마다 커널에서 파일내용을 동적으로 만들어냄
- 각 프로세스는 고유의 ID를 가지고 있으며(숫자) 이 아이디를 가진 디렉토리 밑에 각종 정보를 저장함
- cmdline : 프로세스를 시작한 명령행 내용
- status : 프로세스의 내부 상태 정보
- cwd : 프로세스의 현재 작업 디렉토리
- /proc/meminfo : 총 메모리 사용 현황
- /proc/stat : 시스템의 상태에 관한 정보
- /proc/uptime : 시스탬이 부팅된 후 흐른 시간
- /proc/version : 현재 실행되는 커널 버전
-
/dev- 실제로 하드디스크에 존재하지는 않는 정보를 저장함
- 모든 하드웨어( hdd,cdrom, 마우스, 가상 장치,etc…) 를 파일로 인식하며 이를 장치 파일이라 함
- psaux PS/2 마우스 장치
- tty : teletypewritter, 사용자와 시스템 사이를 중계하는 역할
- 사용자와 시스템 사이의 입출력은 모두 여기를 통해 이루어짐
- 서버 시스템에 직접 연결된 장치에서 사용함
- pts: telnet, ssh 등을 이용해 원격으로 접속할 경우 (pseudo TTY slave)
- 유사 장치 : 실제 장치와 곾렦이 없음
- null : 이 장치로 들어갂 데이터는 모두 사라짐
- zero : 이 장치에서는 항상 null을 반환
-
/mnt&/media- 마운트: 한 파일 시스템의 루트 디렉토리를 다른 디렉토리에 붙임으로써 디렉토리를 사용할 수 있게 만들어주며, 모든 파일 시스템들을 마치 그들이 속해있는 파일시스템의 서브 디렉토리인 것처럼 사용 가능하게 만드는 것
- 이제는 많은 저장 매체들이 자동으로 마운트 되기 때문에 주로 /media(특히 우분투) 를 사용하는 경우가 많지만 mnt 를 사용하는 것은 자유
-
/tmp- 실행 중인 프로세스들의 임시 파일들을 저장
- 종료 시 이 위치에 있는 파일들은 모두 삭제됨
-
/boot- 부팅시에 필요한 필수 파일들이 저장됨
- lilo, grub 등의 부트로더와 커널이 위치함
- 부트로더: 컴퓨터를 켰을 때 가장 먼저 실행되는 프로그램
-
/var- 리눅스 상에서 자주 변경되는 데이터들만을 모아 놓음
- /var/lib: 일반적인 시스템 운용시 계속 갱신되는 파일들을 위한 공간
- /var/local: /usr/local 아래에 설치된 프로그램들의 다양한 데이터가 보간
- /var/lock : 잠금 파일(lock file)이 있는 곳이다.
- /var/log : 다양한 프로그램들의 로그 파일
- /var/log/wtmp : 시스템의 모든 로그인, 로그아웃 정보를 기록
- /var/log/messages: 커널과 시스템 프로그램들의 모든 메시지
- /var/run : 시스템의 현재 정보, 부팅 시 리셋
- /var/run/utmp : 현재 로그인한 사용자들에 대한 정보
- /var/spool : 대기 상태에 있는 작업들을 위한 디렉토리
- /var/tmp : /tmp에 있는 임시 파일들보다는 좀 더 오래 유지될 필요가 있는 임시 파일들, 부팅 시 지워지지 않는다.
-
/usr- 리눅스 상에서 가장 큰 공간을 사용하는 디렉토리
- 어플리케이션 수준의 프로그램들이 여기에 있음
- usr 밑의 bin, lib,… 등은 사용자가 자유롭게 다룰 수 있으 며 루트 디렉토리의 같은 이름을 가진 디렉토리와 같은 역할 을 한다. (대신 우선순위가 떨어진다.)
- /usr/bin : 실행 가능한 명령어, 주로 콘솔이나 X에서 사용되는 명령어들
- /usr/sbin : 시스템 곾리를 위한 명령어, 주로 서버 곾리용
- /usr/lib : 프로그램과 하위 시스템을 위한 라이브러리
- /usr/man, /usr/info, /usr/doc :각각 매뉴얼 페이지, GNU Info 문서들, 그리고 기타 다른 문서
- /usr/include : C 를 위한 헤더 파일
- /usr/X11R6 : X window
- /usr/src : 시스템에 빌드하는 프로그램의 소스
- /usr/share : 읽기 전용 자료, 주로 매뉴얼이나 문서 자료
- /usr/local : 리눅스에서 필수적인 파일이나 배포판에서 확장되는 파일들을 제외한 응용 프로그램 파일들을 저장
- /bin : 문서에 명시되어 있는 명령어 및 필수적인 명령어
- /usr/bin : 주로 콘솔과 X에서 사용되는 명령어
- /usr/local/bin : 그 외 어플리케이션에 의해 추가되는 명령어
서비스란
- 서비스 = 데몬 은 서버 프로세스를 말함.
- 클라이언트에 설치되는 웹 서버 데몬, 네임 서버 데몬 등으로 부르기도 함
- 서비스는 눈에 보이지는 않지만 현재 시스템에서 동작 중인 프로세스임. 백그라운드 프로세스의 일종.
- 하지만 위에서 배운 jobs를 쓴다고 해서 나오는 녀석은 아님.
- 기존에는 “init” 이라는 최상위 프로세스가 서비스를 직접 관리하는 방식이었지만, 요즘은 systemd가 대세임.
- 서비스는 평상시에도 늘 가동되는 서버 프로세스
- 소켓은 필요할 때만 가동되는 서버 프로세스. —> 서비스 / 소켓 모두 systemd가 관리.
- 대표적인 놈은 httpd, mysqld, vsftpd -> d는 daemon을 의미하는 것.
- 서비스의 실행 스크립트 파일은 /usr/lib/systemd/system/ 디렉터리에 “서비스이름.service”로 확인 가능.
- Cron 서비스의 경우 crond.service라는 파일로 존재함
- 서비스의 경우 systemd를 사용한다는 가정 하에 systemctl start/stop/restart를 사용할 수 있다.
- systemctl status <서비스 이름>, systemctl enable/disable <서비스 이름>
- 소켓은 서비스와 다르게 항상 가동되는 것은 아님. 외부에서 특정 서비스가 요청할 경우 systemd가 실행하는 구조. 요청이 끝나면 소켓도 종료
- 소켓 위치: /usr/lib/systemd/system/*.socket
- dbus, ssh, log 등등
커널과 모듈들
- 하드웨어 > 커널 > 쉘 > 응용 프로그램
- 커널은 메모리 위에서 동작하며, 커널이 커지면 메모리도 많이 먹게 되므로 당장에 사용하지 않는 드라이버 등은 “모듈”로 빼게 되었다.
- 커널은 하드웨어와 밀접한 관련이 있으며 최신 커널일 수록 지원하는 하드웨어도 많다. 보안 개선도 있고..
- 커널의 실체 역시 파일이다.
- CentOS의 경우 /boot/vmlinuz 아래에 있다.
- 커널 버전 알아보려면 uname -r 쓰면 됨. 그냥 uname은 배포판? 을 출력함.
- 배포는 https://www.kernel.org/
- 현재(2021/1/21) 최신은 5.11
X Window
- 폴더는 GUI / 디렉토리는 TUI에서 사용하는 말
- chown -R root.root /usr/local/firefox/
- Firefox 관련 파일을 모두 root 사용자 소유로 변경
하드디스크
-
하드 자체는 /dev/sda, /dev/sdb, /dev/sdc 순으로 붙게 된다.
-
논리적으로는 /dev/sda1, /dev/sda2, … 요런식으로 분할도 된다.
-
/dev/sda1 같은 녀석들은 바로 쓸 수는 없고 반드시 마운트 시켜야 한다.
-
마운트 과정
- SCSI 0:1 -> /dev/sdb -> /dev/sdb1 -> mkfs.ext4 -> mount -> /mydata -> /etc/fstab에 등록.
- 명령어 실행 순서
- fdisk /dev/sdb => SCSI 0:1 하드디스크 스택
- 파티션 생성 (1개의 파티션만 쓸 지라도)
- 파티션이 생성되면 /dev/sdb1 이 된다.
- mkfs -t [파일시스템] [파티션장치] => 파일 시스템을 지정
- mount /dev/sdb1 /mydata => 마운트 명령
- 이렇게 만든 mount는 재시작 시 유지되지는 않으므로 추가 설정을 할 필요가 있다.
- vi /etc/fstab에 아래를 추가
- /dev/sdb1 /mydata ext4 defaults 0 0
- /etc/fstab는 리눅스가 부팅될 때마다 읽는 매우 중요한 파일. 글자가 틀릴경우 아예 부팅되지 않을 수 있으므로 주의 필요.
-
보통 /dev/sda1은 SWAP에 mount 되고, /dev/sda2는 ’/’ 에 마운트 됨
-
df 명령어를 사용하면 마운트 현황을 알 수 있음
Filesystem 1K-blocks Used Available Use% Mounted on /dev/sdb 263174212 5290692 244445364 3% / tools 249105148 164725580 84379568 67% /init none 6509908 0 6509908 0% /dev tmpfs 6512308 0 6512308 0% /sys/fs/cgroup none 6512308 16 6512292 1% /run C:\ 249105148 164725580 84379568 67% /mnt/c -
WSL의 경우 파일시스템 자체가 C:\ 등으로 나오기도 함.
-
서버에서는 RAID를 많이 사용함
- RAID: Redundant Array of Inexpersive/Independent Disks
- 하드웨어 RAID도 존재는 한다.
- Linear RAID / RAID 0 : 최소 2게 이상의 HDD 필요. 하지만 저장 방식이 차이가 있다.
- Linear 방식은 첫번째 HDD 부터 사용, RAID 0는 N개의 HDD를 동시에 사용.
- 동시에 사용하는 방식을 Stripping 이라고 하며 성능 향상에 도움이 된다.
- 그러나 당연한 이야기이지만 데이터 복구는 불가능함.
- Linear RAID는 그나마 차례로 쓰기 때문에 (성능은 낮지만) 하드 손상 시 다른 데이터들은 멀쩡하지만, RAID 0의 경우 파일 부분부분 모두 손상되기 때문에 사실상 복구의 가능성은 없다고 봐야 한다. 하드가 100개라면 손상 확률은 100배가 된다는 뜻.
- Linear RAID를 제와하고 다른 RAID 들은 동일한 용량의 HDD를 사용하기 마련임.
- RAID 1: 미러링, 2배의 용량 사용
- RAID 0과 1은 장단점이 명백..
- RAID 5: 3개 이상의 HDD가 있어야 사용 가능, 대부분 5개 이상으로 구성함.
- 오류가 있을 시 Parity를 사용하여 복구 가능
- 5개 HDD에서 짝수 Parity를 사용한다고 가정 하면, HDD 1개가 망가져도 100% 복구 가능
- 4개의 HDD는 데이터 저장용, 나머지 1개는 Parity 용.
- 0010 데이터의 경우 1을 저장, 어느 1 bit가 없더라도 나머지 1개의 bit를 알 수 있다.
- 저장 효율 80% (5개의 HDD가 있을 시), 이는 RAID 1의 50%를 훨씬 상회하는 수치임.
- RAID 6: 2개의 Parity를 사용 - 최소 4개 이상의 HDD에서 사용.
- Parity 알고리즘이 RAID 5보다 약간 더 복잡해져서 성능이 약간 더 떨어지게 된다.
- RAID 1+0 / RAID 1+6 처럼 Stripping 도 가능.
- RAID 1+0: 속도 & 신뢰도
- RAID 1+6: 성능과 비용은 많이 들지만 신뢰도가 훨씬 높다.
- RAID 구성에는 mdadm 명령어를 사용. (RAID 장치를 생성/관리하는 명령어.. 물론 SW RAID 이다.)
- mount: RAID 없이 붙임, mdadm: RAID를 사용하여 새 장치를 만듬.. (/dev/md*)
-
LVM: 논리 하드디스크 관리자(Logical Volume Manager)
- 물리 볼륨(/dev/sda1, …)
- 볼륨 그룹: 물리 볼륨을 합침
- 논리 볼륨: 논리적으로 다른 불륨을 나눠서 합칠 수도 있고 그런 개념 (/dev/sda1의 절반 + /dev/sdb1의 절반 등)
Linux Shell **
- Shell이란
- 사용자가 입력한 명령을 해석해 커널로 전달하거나, 커널의 처리 결과를 사용자에게 전달하는 역할을 함.
- bash Shell
- bash: Bourne Again SHell. CentOS 등 다양한 Linux 배포판에서 기본적인 Shell로서 기능한다. 의미는 Bourne Shell을 기반으로 Korn Shell과 C Shell의 좋은 점을 합한 것.
- Alias 기능 (단축어 기능)
- History 기능 (위, 아래 방향키)
- 연산 기능
- Job Control 기능
- 자동 이름 완성 기능 (Tab)
- 프롬포트 제어 기능
- 명령어 편집 기능
- bash: Bourne Again SHell. CentOS 등 다양한 Linux 배포판에서 기본적인 Shell로서 기능한다. 의미는 Bourne Shell을 기반으로 Korn Shell과 C Shell의 좋은 점을 합한 것.
- 환경 변수
- 설정된 환경 변수는
echo [$환경변수이름]하면 볼 수 있음. - 주요 환경 변수는 아래와 같음
- HOME: 사용자의 홈 디렉토리
- PATH: 실행 파일을 찾는 디렉토리 경로
- LANG: 기본 언어
- PWD: 사용자의 현재 작업 디렉토리
- TERM: 로그인 터미널 타입
- DISPLAY: X 디스플레이 이름
- USER: 현재 사용자의 이름
- LINES: 현재 터미널 라인 수
- COLUMNS: 현재 터미널의 컬럼 수
- PS1/PS2: 1차, 2차 명령 프롬포트. 2차는 대개 ”>” 이다.
- BASH: Bash 쉘 경로
- HOSTNAME / USERNAME
- OSTYPE: OS 타입 (ex: linux-gnu)
- 값을 변경하려면
export [환경변수]=[값]을 실행하면 됨. printenv를 실행하면 주요 환경변수 값들이 출력 됨.
- 설정된 환경 변수는
- 리눅스의 Shell Script는 C 언어와 유사한 방법으로 프로그래밍 가능. 왜냐하면 리눅스의 대부분은 C 언어로 작성되었기 때문.
- 변수, 반복문, 제어문 등이 사용되며 컴파일 필요 없이 텍스트 파일 형태로 바로 Shell에서 실행 가능
- 이미 리눅스의 많은 부분이 Shell Script로 작성되어 있다.
- 확장자가 *.sh 일 필요는 없지만 구분을 위해 주로 해당 확장자로 많이 만드는 편임.
- 간단한 예제
#!/bin/sh echo "사용자 이름: " $USER echo "홈 디렉터리: " $HOME exit 0 exit 0에서0은 성공을 의미함
- 스크립트 실행
sh [스크립트 파일명]으로 간단하게 실행 가능chmod +x [스크립트 파일명]으로 속성 변경 후./[스크립트 파일명]으로 실행 가능./을 앞에 붙이는 이유는,$PATH에 현재 디렉터리가 등록되어 있지 않기 때문. 실행은 오로지$PATH에 있는 경로만 찾기 때문에, 강제로 위치를 붙여주는 것.- root 사용자로 작성했을 경우에는 기본적으로 root 사용자만 사용 가능함. 타 사용자도 사용가능하게 하려면
/usr/local/bin으로 스크립트를 복사하고 권한을 755 정도로 주면 된다.
- 스크립트 작성
- 변수
- 변수의 경우 C 처럼 미리 선언할 필요는 없고, JS 처럼 그냥 처음 사용하여 할당하면 생성된다.
- 모든 값은 String 취급이다. 숫자를 넣어도 문자로 생각함.
- 대소문자를 구분함
- 대입시
=좌우에 공백이 없어야 한다. - 값에 공백이 있을 경우
"로 묶어야 한다. - 값을 불러올 때는
$를 앞에 붙인다. $문자가 들어간 글자를 출력하려면\로 escape 시키거나 작은따옴표(')를 사용하여 묶어준다. (안그러면 변수 취급이므로)- 일반적으로 입력된 값에 공백이 들어올 수 있으므로,
"$myvar"와 같이 큰따옴표로 묶는 방식이 선호된다. - 아래는 위 내용을 종합한 예시 코드
#!/bin/sh myvar="Hello World!" echo $myvar echo "$myvar" echo '$myvar' echo \$myvar echo 값 입력 : read myvar echo '$myvar' = $myvar exit 0 - 숫자 계산
- 변수는 기본적으로 문자열 취급이지만,
expr키워드를 사용해서 연산이 가능하다. - 수식과 함께 역따옴표(`)로 묶어줘야 한다.
- 수식에 괄호를 사용하기 위해서는 역슬래시(\)를 붙여줘야 한다.
- 괄호 앞 뒤에는 공백을 넣자. (오동작 방지)
- 기본적으로 expr 사용 시에는 단어마다 띄어쓰기를 사용한다고 생각.
- 곱하기 기호(*)도 예외적으로 앞에 역슬래시를 붙여줘야 한다.
#!/bin/sh num1=100 num2=$num1+200 echo $num2 num3=`expr $num1 + 200` echo $num3 num4=`expr \( $num1 + 200 \) / 10 \* 2` echo $num4 exit 0 - 변수는 기본적으로 문자열 취급이지만,
- 파라미터 변수
- 1, $2와 같은 녀석들임
- 실행하는 명령어의 부분부분을 변수 취급 함
dnf -y install gftp라는 명령어가 있다면- $0: dnf
- $1: -y
- $2: install
- $3: gftp
- if와 case
- 바로 예제를 보자. (
=이 같음을 표시하는 기호임에 유의!)
#!/bin/sh if [ "$1" = "" ] then echo "인수를 입력하지 않았습니다." else echo "인수를 입력하였습니다: " $1 fi exit 0 - 바로 예제를 보자. (
- 변수
리눅스 입문자를 위한 명령어 사전
- by 가와구치 히로시
Chapter 06. 편리한 명령어 사용법
명령어 입출력을 파일로 전환
- ps > pslog
readiz@Readiz-NotePC:/mnt/e/collected/selfdev/git/baekjoon/class/extra/20211127$ ps > pslog
readiz@Readiz-NotePC:/mnt/e/collected/selfdev/git/baekjoon/class/extra/20211127$ cat pslog
PID TTY TIME CMD
1339 pts/2 00:00:00 bash
14658 pts/2 00:00:00 p
date >> datelog:>>를 쓰면 Append 명령어임
이전 사이트에서 옮긴 글입니다. 원래 주소