← 블로그 / TIL

가장 쉬운 리눅스

가장 쉬운 리눅스 관련 기록.

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)
      • 프롬포트 제어 기능
      • 명령어 편집 기능
  • 환경 변수
    • 설정된 환경 변수는 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
    • 파라미터 변수
      • 0,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 명령어임