'이것이 리눅스다' 강의 정리(2장~6장)

‘이것이 리눅스다’ 유투브 강의

이 포스트에 포함된 내용(2장~6장)

  • 시작과종료, 가상콘솔, 런레벨, 자동완성
  • vi 에디터, CDDVD 마운트
  • 리눅스 기본 명령어
  • 사용자 및 그룹 관리
  • 파일의 소유권허가권, 링크
  • RPM 사용법, YUM 기본 사용법
  • YUM 고급 사용법
  • 파일 압축과 묶기, CRON과 AT
  • 네트워크 관련 개념과 명령어, SELinux
  • 파이프필터 , 프로세스, 서비스소켓
  • 응급복구, GRUB, 커널 컴파일
  • X 윈도 테마, GRUB 배경 화면
  • IDE/SCSI 장치 구성, 하드디스크 1개 추가
  • RAID 개념과 종류
  • 디스크 9개 장착, LinearRAID 구현
  • RAID 0, RAID 1, RAID 5 구현
  • RAID 6, RAID 1+0 구현
  • LVM 개념과 구현
  • 사용자별 공간 할당(쿼터)

2장 CentOS 리눅스 소개

리눅스의 개요

  • 리눅스 = 무료 유닉스.
  • 1991년 ‘리누스 토르발스’가 버전 0.01을 최초로 작성.
  • 1992년 0.02 버전을 공개하면서 시작됨.
  • 리누스 토르발스는 커널(Kernel)만 개발함.
  • 배포판의 구성
    • 하드웨어 < 커널 < 쉘 < 응용 프로그램

GNU 프로젝트

  • 1984년에 라차드 스톨만에 의해서 GNU 프로젝트가 시작
  • 목표는 ‘모두가 공유할 수 있는 소프트웨어’를 만드는 것
  • 리차드 스톨만은 1985년에 자유 소프트웨어 재단(FSF, Free Software Foundation)을 설립
  • 목표는 GNU 프로젝트에서 제작한 소프트웨어를 지원함으로써 컴퓨터 프로그램의 복제, 변경, 소스 코드의 사용에 대한 제한을 철폐하는 것.
  • GPL(General Public License)을 따름, 이 라이선스는 자유 소프트웨어(Free Software)의 수정과 공유의 자유를 보장함.
  • 프리웨어(Freeware, 무료 소프트웨어)라는 개념을 뛰어넘어서 진정한 자유에 대한 개념.
  • 자유 소프트웨어는 심지어 무료로 얻은 소프트웨어를 유상으로 판매할 자유도 보장.

커널

  • http://www.kernel.org 에서 최신버전 다운로드 가능
  • 커널 버전의 의미 (예: 3.17.4)
    • 3은 주 버전(Major Version)
    • 17은 부 버전(Minor Version)
    • 4는 패치 버전(Patch Version)
  • 배포판에 포함된 기본 커널을 사용자가 직접 최신 커널로 업그레이드 가능.

레드햇 리눅스와 CentOS 리눅스

  • 전 세계적으로 가장 유명한 배포판 중 하나가 Red Hat사에서 제작한 ‘Red Hat Linux’.
  • 상용으로 판매되는 Red Hat Enterprise Linux(RHEL), 공개된 RHEL의 소스코드를 그대로 가져와서, 로고만 변경한 후에 다시 컴파일(또는 빌드)해서 만든 것이 CentOS.
  • 기업에서는 별도의 비용이 있다면 RHEL을 구매해서 사용하면 되며, 비용을 절감하고 싶다면 동일한 리눅스인 CentOS를 사용하면 된다.

4장 서버를 구축할 때 알아야 할 필수 개념과 명령어

가상 콘솔

  • 각각의 가상 콘솔로 이동하는 단축키는 Ctrl + Alt + F2 ~ F6.
    • Ctrl + Alt + F1은 X윈도우 모드.
  • 터미널에서 chvt 가상콘솔번호를 입력하여 이동 가능.

런 레벨(Runlevel)

  • Runlevel 모드를 확인하려면 /lib/systemd/system 디렉터리의 runlevel?.target 파일을 확인.
Runlevel 영문 모드 설명 비고
0 Power Off 종료 모드
1 Rescue 시스템 복구 모드 단일 사용자 모드
2 Multi-User 사용하지 않음
3 Multi-User 텍스트 모드의 다중 사용자 모드
4 Multi-User 사용하지 않음
5 Graphical 그래픽 모드의 다중 사용자 모드
6 Reboot 재부팅 모드
1
2
3
4
5
6
7
8
[root@localhost ~]# ls -l /lib/systemd/system/runlevel?.target
/lib/systemd/system/runlevel0.target -> poweroff.target
/lib/systemd/system/runlevel1.target -> rescue.target
/lib/systemd/system/runlevel2.target -> multi-user.target
/lib/systemd/system/runlevel3.target -> multi-user.target
/lib/systemd/system/runlevel4.target -> multi-user.target
/lib/systemd/system/runlevel5.target -> graphical.target
/lib/systemd/system/runlevel6.target -> reboot.target

현재 Runlevel 확인

1
2
[root@localhost ~]# ls -l /etc/systemd/system/default.target
/etc/systemd/system/default.target -> /lib/systemd/system/graphical.target

Runlevel 변경(5 → 3)

1
[root@localhost ~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

CD/DVD 마운트

1
2
3
[root@localhost ~]# mkdir /media/cdrom    # 마운트할 디렉터리 생성
[root@localhost ~]# mount /dev/cdrom /media/cdrom # DVD장치를 생성한 디렉터리에 마운트
[root@localhost ~]# umount /dev/cdrom # 마운트 해제

링크

  • 파일의 Link에는 Hard Link와 Symbolic Link(또는 Soft Link) 두 가지가 있다.
  • Hard Link를 생성하면 Hard Link File만 하나 생성되며 같은 inode1을 사용.
    # ln 링크대상파일이름 링크파일이름
  • Symbolic Link를 생성하면 새로운 inode2를 만들고, 데이터는 원본 파일 포인터를 통해 원본 파일에 연결.
    # ln -s 링크대상파일이름 링크파일이

RPM(Redhat Package Manager)

1
2
gedit-3.8.3-6.el7.x86_64.rpm
패키지이름-버전-릴리즈번호.CentOs버전.아키텍처.rpm
  • 패키지이름: gedit → 패키지(프로그램)의 이름.
  • 버전: 3.8.3 → 대개 3자리수로 구성. 주버전, 부버전, 패치버전.
  • 릴리즈번호: 6 → 문제점을 개선할 때마다 붙여지는 번호.
  • CentOS 버전: el7 → CentOs에서 배포할 경우에 붙여짐.
  • 아키텍처:
    • x86_64 → 64비트 CPU.
    • i386_686 → 32비트 CPU.
    • src → 소스.
    • noarch → 모든 CPU.

RPM 명령어

  • 설치: rpm -Uvh 패키지파일이름.rpm
    • U → (대문자) 패키지 설치/업그레이드.
    • v → 설치 과정 확인.
    • h → 설치 과정을 “#” 마크로 화면에 출력.
  • 삭제: rpm -e 패키지이름
  • 이미 설치된 패키지 조회
    • rpm -qa 패키지이름 → 패키지가 설치되었는지 확인.
    • rpm -qf 파일의절대경로 → 파일이 어느 패키지에 포함된 것인지 확인.
  • 아직 설치되지 않은 rpm 파일에 대한 조회
    • rpm -qlp 패키지파일이름.rpm → 패키지 파일에 어떤 파일들이 포함되었는지 확인.
    • rpm -qip 패키지파일이름.rpm → 패키지 파일의 상세정보

YUM(Yellowdog Updater Modified)

  • rpm 명령의 패키지 의존성 문제를 해결.
  • 인터넷을 통하여 필요한 파일을 저장소(Repository)에 자동으로 모두 다운로드해서 설치하는 방식.

YUM 작동 방식

  1. yum install 입력.
  2. /etc/yum.repos.d/ 디렉터리의 repo 파일을 열어서 URL 주소 확인.
  3. CentOS 7 패키지 저장소에서 전체 패키지 목록 파일 요청.
  4. 전체 패키지 목록 파일만 다운로드.
  5. 설치할 패키지와 관련된 패키지의 이름을 화면에 출력.
  6. y를 입력하면 설치에 필요한 패키지 파일을 저장소에 요청함.
  7. 설치할 패키지 파일을 다운로드해서 자동 설치.

YUM 명령어

  • 설치: yum -y install 패키지이름
  • RPM 파일 설치: yum localinstall rpm파일이름.rpm
  • 업데이트 가능한 목록 보기: yum check-update
  • 업데이트: yum update 패키지이름
  • 삭제: yum remove 패키지이름
  • 정보 확인: yum info 패키지이름

YUM 고급 명령어

  • 패키지 그룹 설치: yum groupinstall "패키지그룹이름"
  • 패키지 리스트 확인: yum list 패키지이름
  • 특정 파일이 속한 패키지 이름 확인: yum provides 파일이름
  • GPG 키 검사 생략: yum install --nogpgcheck rpm파일이름.rpm
  • 기존 저장소 목록 지우기: yum clean all

repo 파일 활용

  • 설치 DVD에서 먼저 패키지를 찾고, 없다면 CentOS 패키지 저장소에서 패키지를 찾도록 수정.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ll
합계 24
-rw-r--r--. 1 root root 1669 1월 6 20:04 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 4월 1 2015 CentOS-CR.repo
-rw-r--r--. 1 root root 649 4월 1 2015 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 1331 4월 1 2015 CentOS-Sources.repo
-rw-r--r--. 1 root root 1002 4월 1 2015 CentOS-Vault.repo
-rw-r--r--. 1 root root 290 4월 1 2015 CentOS-fasttrack.repo
[root@localhost yum.repos.d]# mkdir backup
[root@localhost yum.repos.d]# mv *.repo backup/ # 기존 repo 파일 백업
[root@localhost yum.repos.d]# ll
합계 0
drwxr-xr-x 2 root root 156 1월 7 10:13 backup
[root@localhost yum.repos.d]# vi dvd.repo # dvd.repo에 아래 내용 추가

[dvd]
name=CentOS DVD
baseurl=file:///media/cdrom # 마운트 위치
gpgcheck=0

[network]
name=network
baseurl=
http://ftp.daum.net/centos/$releasever/os/$basearch/
http://ftp.kaist.ac.kr/CentOS/$releasever/os/$basearch
gpgcheck=0

파일 위치 검색

  • find [경로] [옵션] [조건] [action]
    • [옵션]: -name, -user, -newer, -perm, -size
    • [action]: -print, -exec
    • find /etc -name "*.conf"
    • find /bin -size +10k -size -100k
    • find /usr/bin -size +95k -size -100k -exec ls -l {} \;
    • find /home -name "*.swp" -exec rm {} \;
  • which 실행파일이름: PATH에 설정된 디렉터리만 검색
  • whereis 실행파일이름: 실행 파일, 소스, man 페이지 파일까지 검색
  • locate 파일이름: 파일 목록 데이터베이스에서 검색

시스템 설정

  • 날짜 및 설정: system-config-date
  • 네트워크 설정: nmtui
  • 방화벽 설정: firewall-config
  • 키보드 설정: system-config-keyboard
  • 언어 설정: system-config-language
  • 프린터 설정: system-config-printer
  • 사용자 설정: syustem-config-users
  • 네임 서버 설정: system-config-kickstart

CRON과 AT

CRON

  • 주기적으로 반복되는 일을 자동적으로 실행될 수 있도록 설정
  • 관련된 데몬은 crond, 관련 파일은 /etc/crontab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
01 3 15 * * root run-parts /etc/cron.monthly

AT

  • cron은 주기적으로 반복되는 작업을 예약하는 것이지만, at은 일회성 작업을 예약
  • 예약: at <시간>
  • 확인: at -l
  • 취소: atrm <작업번호>
1
2
3
4
5
6
7
8
[root@localhost backup]# at 4:00 am tomorrow
at> yum -y update
at> reboot
at> <EOT> # Ctrl+D
job 1 at Fri Jan 8 04:00:00 2016
[root@localhost backup]# at -l
1 Fri Jan 8 04:00:00 2016 a root
[root@localhost backup]# atrm 1

네트워크 관련 필수 개념

  • TCP/IP
    • 컴퓨터끼리 네트워크 상으로 의사소통을 하는 프로토콜 중 가장 널리 사용되는 프로토콜의 한 종류.
  • Hostname과 Domain name
    • Hostname은 각각의 컴퓨터에 저장된 이름.
    • Domain name은 naver.com과 같은 형식.
  • IP 주소
    • 각 컴퓨터의 랜카드에 부여되는 중복되지 않는 유일한 주소.
    • 4바이트로 이루어져 있으며, 각 자리는 0~255까지의 숫자.
  • 네트워크 주소
    • 같은 네트워크에 속해 있는 공통된 주소(192.168.111.0).
  • Broadcast 주소
    • 내부 네트워크의 모든 컴퓨터가 듣게 되는 주소.
    • 현재 주소의 제일 끝자리를 255로 바꾼 주소(C클래스).
  • Gateway, Router
    • Gateway = Router.
    • 네트워크 간에 데이터를 전송하는 컴퓨터 또는 장비.
  • Netmask & Class
    • 네트워크의 규모를 결정(255.255.255.0 - C클래스).
  • DNS(Domain Name System) 서버(= Nameserver) 주소
    • URL을 해당 컴퓨터의 IP 주소로 변환해 주는 서버.
    • 설정 파일은 /etc/resolv.conf

네트워크 관련 명령어

  • nmtui
    • 네트워크와 관련된 대부분의 작업을 이 명령어에서 수행.
      • 자동 IP 주소 또는 고정 IP 주소 사용 결정.
      • IP 주소, Subnet Mask, Gateway 정보 입력.
      • DNS 정보 입력.
      • 네트워크 카드 드라이버 설정.
      • 네트워크 장치의 설정.
    • 텍스트 기반으로 작동함.
  • 네트워크 설정 적용: systemctl <start/stop/restart/status> network
  • 네트워크 장치 On/Off: ifup <장치이름>, ifdown <장치이름>
  • 장치의 IP주소 설정 정보 출력: ifconfig <장치이름>
  • DNS 서버 작동 테스트: nslookup
  • 해당 컴퓨터가 네트워크상에서 응답하는지를 테스트: ping <IP주소 또는 URL>

네트워크 설정 관련 주요 파일

  • 네트워크 기본 정보: /etc/sysconfig/network
  • 해당 장치에 설정된 네트워크 정보: /etc/sysconfig/network-scrips/ifcfg-장치이름
  • DNS 서버의 정보 및 Hostname: /etc/resolv.conf
  • 현재 컴퓨터의 Hostname 및 FQDN: /etc/hosts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777728
TYPE="Ethernet"
BOOTPROTO=none
IPADDR=192.168.111.100
NETMASK=255.255.255.0
GATEWAY=192.168.111.2
DNS1=192.168.111.2
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777728"
UUID="3fa0e59c-d536-4f90-86f9-69b004278436"
DEVICE="eno16777728"
ONBOOT="yes"

네트워크 보안을 위한 SELinux

  • SELinux(Security Enhanced Linux)는 보안에 취약한 리눅스를 보호하기 위해 탄생.
  • 강제(Enforcing), 허용(Permissive), 비활성(Disabled) 세 가지 레벨.
    • Enforcing: 시스템 보안에 영향을 미치는 기능이 감지되면 아예 그 기능이 작동되지 않도록 막음.
    • Permissive: 시스템 보안에 영향을 미치는 기능이 감지되면 허용은 되지만 그 내용이 로그에 남음.
    • Disabled: SELinux를 사용하지 않음.
  • 설정 파일인 /etc/sysconfig/selinux를 편집하거나, system-config-selinux 명령으로 설정.

파이프, 필터, 리다이렉션

  • 파이프(pipe)
    • 두 개의 프로그램을 연결해 주는 연결통로.
    • | 를 사용.
    • # ls -s /etc | more
  • 필터(filter)
    • 필요한 것만 걸러주는 명령어.
    • grep, tail, wc, sort, grep, awk, sed
    • 주로 파이프와 같이 사용.
    • # ps ef | grep bash
  • 리다이렉션(redirection)
    • 표준 입출력의 방향을 바꿔 줌.
    • # ls -l > list.txt
    • # soft < list.txt > out.txt

프로세스, 데몬

  • 정의: 하드디스크에 저장된 실행코드(프로그램)가, 메모리에 로딩되어 활성화된 것.
  • Foreground Process: 실행하면 화면에 나타나서 사용자와 상호작용을 하는 프로세스.
    • fg <작업번호>: Background Process를 Foreground로 불러온다.
  • Background Process: 실행은 되었지만, 화면에는 나타나지 않고 실행되는 프로세스.
    • gedit &: Background로 프로그램을 실행할 수 있다. 터미널 계속 사용 가능.
  • 프로세스 번호: 각각의 프로세스에 할당된 고유번호.
  • 작업 번호: 현재 실행되고 있는 Background Process의 순차번호
  • 부모 프로세스와 자식 프로세스
    • 모든 프로세스는 부모 프로세스를 가지고 있음.
    • 부모 프로세스를 kill 하면, 자식 프로세스도 자동으로 kill 됨.
1
2
3
4
5
6
7
8
9
[root@localhost ~]# yes > /dev/null
^Z
[1]+ Stopped yes > /dev/null
[root@localhost ~]# bg
[1]+ yes > /dev/null &
[root@localhost ~]# fg 1
yes > /dev/null
^C
[root@localhost ~]#

프로세스 관련 명령어

  • ps
    • 현재 프로세스의 상태 확인.
    • # ps -ef | grep <프로세스 이름>
  • kill
    • 프로세스 강제 종료.
    • # kill -9 <프로세스 번호>
  • pstree: 부모 프로세스와 자식 프로세스의 관계를 트리 형태로 보여 줌.

서비스와 소켓

  • 서비스
    • 시스템과 독자적으로 구동되어 제공하는 프로세스를 말한다. 웹 서버(httpd), DB 서버(mysqld), FTP 서버(vsftpd) 등이 있다.
    • 실행 및 종료는 대개 systemctl start/stop/restart 서비스이름으로 사용된다.
    • 서비스의 실행 스크립트 파일은 /usr/lib/systemd/system/ 디렉터리에 서비스이름.service라는 이름으로 확인할 수 있다.
  • 소켓
    • 서비스는 항상 가동되지만, 소켓은 외부에서 특정 서비스를 요청할 경우에 systemd가 구동시킨다. 그리고 요청이 끝나면 소켓도 종료된다.
    • 그래서 소켓으로 설정된 서비스를 요청할 때는 처음 연결되는 시간이 앞에서 설명한 서비스에 비교했을 때 약간 더 걸릴 수 있다. 왜냐하면 systemd가 서비스를 새로 구동하는 데 시간이 소요되기 때문이다. 예로 텔넷 서버가 있다.
    • 소켓과 관련된 스크립트 파일은 /usr/lib/systemd/system/ 디렉터리에 소켓이름.socket라는 이름으로 확인할 수 있다.

응급 복구(root 비밀번호 분식)

rescue01

e를 눌러 edit mode로 들어간다.

rescue02

rescue03

rhgb ~ UTF-8 부분을 지우고, init=/bin/sh를 입력한다.

Ctrl-x 를 눌러 시작.

1
2
sh-4.2# whoami
root

root로 로그인 되었다. passwd로 비밀번호를 변경하면 되지만,
현재 /가 읽기전용이므로, 수정할 수 있도록 변경해야 한다.

1
2
3
4
5
6
7
sh-4.2# mount
/dev/sda2 on / type xfs (ro,relatime,attr2,inode64,noquota)

sh-4.2# mount -o remount,rw /

sh-4.2# mount
/dev/sda2 on / type xfs (rw,relatime,attr2,inode64,noquota)

이제 비밀번호를 변경한다.

1
2
3
4
5
sh-4.2# passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

재부팅 하면, 변경한 비밀번호로 접속할 수 있다.

GRUB 부트로더

  • GRUB 부트로더의 특징
    • 부트 정보를 사용자가 임의로 변경해 부팅할 수가 있다. 즉, 부트 정보가 올바르지 않더라도 수정하여 부팅할 수 있다.
    • 다른 여러 가지 운영체제와 멀티부팅을 할 수 있다.
    • 대화형 설정을 제공해줘서, 커널의 경로와 파일 이름만 알면 부팅이 가능하다.
  • GRUB2의 장점
    • 셸 스크립트를 지원함으로써 조건식과 함수를 사용할 수 있다.
    • 동적 모듈을 로드할 수 있다.
    • 그래픽 부트 메뉴를 지원하며, 부트 스플래시(boot splash) 성능이 개선되었다.
    • ISO 이미지를 이용해서 바로 부팅할 수 있다.
  • GRUB2 설정 방법
    • 설정 파일: /boot/grub2/grub.cfg 직접 변경하면 안 됨.
    • /etc/default/grub 파일과 /etc/grub.d/ 디렉터리의 파일을 수정한 후에, grub2-mkconfig -o /boot/grub2/grub.cfg 명령어를 실행해 설정함.
1
2
3
4
5
6
7
8
[root@localhost ~]# cat /etc/default/grub
GRUB_TIMEOUT=5 # 메뉴 선택 시간.
GRUB_DISTRIBUTOR="This is Lunix" # 메뉴 제목.
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

GRUB 부트로더 변경시 암호 설정

  • GRUB 부트로더에 암호를 설정하지 않으면, 위 응급복구처럼 마음대로 root 비밀번호를 수정할 수 있게된다.
1
2
3
4
5
6
7
8
[root@localhost ~]# vi /etc/grub.d/00_header    # 맨 아래쪽에 아래 내용 추가.

cat << EOF
set superusers="thisuser"
password thisuser 4321
EOF

[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg # 설정 적용.

모듈의 개념과 커널 컴파일의 필요성

  • 모듈: 필요할 때마다 호출하여 사용되는 코드
  • 커널 컴파일 순서
    1. 현 커널 버전 확인: # uname -r
    2. 커널 소스 다운로드: # cd /usr/src에 업로드
    3. 커널 소스 압축 풀기: # tar xvfJ linux-3.17.4.tar.xz, # cd linux-3.17.4
    4. 커널 설정 초기화: # make mrproper
    5. 커널 환경 설정: # make xconfig
    6. 이전 정보 삭제: # make clean
    7. 커널 컴파일 및 설치: # make ; make modules_install ; make install, # ls -l /boot
    8. 부트 로더 확인: # cat /etc/grub2/grub.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost ~]# uname -r
3.10.0-229.el7.x86_64

[root@localhost ~]# wget "https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.17.4.tar.xz"

[root@localhost ~]# mv linux-3.17.4.tar.xz /usr/src
[root@localhost ~]# cd /usr/src/
[root@localhost src]# ll
합계 130624
drwxr-xr-x. 2 root root 6 6월 10 2014 debug
drwxr-xr-x. 2 root root 6 6월 10 2014 kernels
-rw-r--r-- 1 root root 80337920 11월 22 2014 linux-3.17.4.tar.xz

[root@localhost src]# tar xfJ linux-3.17.4.tar.xz
[root@localhost src]# cd linux-3.17.4/
[root@localhost linux-3.17.4]# ls
COPYING Kbuild Makefile arch drivers include kernel net security usr
CREDITS Kconfig README block firmware init lib samples sound virt
Documentation MAINTAINERS REPORTING-BUGS crypto fs ipc mm scripts tools

[root@localhost linux-3.17.4]# yum -y install gcc gcc-c++ qt qt-devel # 컴파일에 필요한 패키지 설치

[root@localhost linux-3.17.4]# make mrproper

[root@localhost linux-3.17.4]# make xconfig

xconfig

xconfig로 커널 설정을 할 수 있다. NTFS를 마운트 하고 싶다면 NTFS 관련 항목에 체크해야 한다.

계속 진행.

1
2
[root@localhost linux-3.17.4]# make clean
[root@localhost linux-3.17.4]# make ; make modules_install ; make install

grub

재부팅 하면 GRUB 메뉴에 3.17.4 커널이 추가된 것을 확인할 수 있다.

6장. 하드디스크 관리와 사용자별 공간 할당

RAID 정의 및 개념

  • RAID 정의
    • RAID(Redundant Array of Inexpensive Disks)는 여러 개의 디스크를 하나의 디스크처럼 사용함.
    • 비용 절감 + 신뢰성 향상 + 성능 향상의 효과를 냄.
  • 하드웨어 RAID
    • 하드웨어 제조업체에서 여러 개의 하드디스크를 가지고 장비를 만들어서 그 자체를 공급.
    • 좀 더 안정적이지만, 상당한 고가임.
  • 소프트웨어 RAID
    • 고가의 하드웨어 RAID의 대안.
    • 운영체제에서 지원하는 방식.
    • 저렴한 비용으로 점 더 안전한 데이터의 저장이 가능.

Linear RAID, RAID 0

  • Linear RAID 개요
    • 최소 2개의 하드디스크가 필요.
    • 2개 이상의 하드디스크를 1개의 볼륨으로 사용.
    • 앞 디스크부터 차례로 저장.
    • 100%의 공간효율성(= 비용 저렴).
  • RAID 0 개용
    • 최소 2개의 하드디스크가 필요.
    • 모든 디스크에 동시에 저장 됨.
    • 100%의 공간효율성(= 비용 저렴).
    • 신뢰성 낮음.
    • 빠른 성능을 요구하되, 혹시 전부 잃어버려도 큰 문제가 되지 않는 자료가 적당함.

RAID 1

  • RAID 1 개요
    • 미러링(Mirroring)이라 부름.
    • 데이터 저장에 두 배의 용량이 필요.
    • 결함 허용(Falut-tolerance)을 제공(= 신뢰성 높음).
    • 두 배의 저장 공간 = 비용이 두 배 = 공간효율 나쁨.
    • 저장속도(성능)는 변함 없음.
    • 중요한 데이터를 저장하기에 적절함.
  • RAID 0와 RAID 1 비교
구분 RAID 0 RAID 1
성능(속도) 뛰어남 변화 없음
데이터 안전성(결함 허용) 보장 못함(결함 허용 X) 보장함(결함 허용 O)
공간 효율성 좋음 나쁨

RAID 5

  • RAID 5 개요
    • RAID1의 데이터 안전성 + RAID 0처럼 공간 효율성.
    • 최소한 3개 이상의 하드디스크.
    • 오류가 발생할 때는 패리티(Parity)를 이용해서 데이터를 복구.
  • RAID 5 특징
    • 어느 정도의 결함 허용을 해 주면서 저장 공간의 효율도 좋음.
    • (디스크의 개수 -1)의 공간을 사용.
    • 디스크 2개가 고장나면 복구 못 함.

RAID 6, RAID 1+0

  • RAID 5보다 신뢰도를 높은 RAID 6.
  • 신뢰도와 속도 두 마리 토끼를 잡기 위한 RAID 1+0.
  • RAID 6은 패리티를 2개 사용하기 떄문에 최소 4개의 디스크가 필요.
  • RAID 1+0도 최소 4개 디스크가 필요.
  • RAID 6의 공간효율은 N-2
  • RAID 1+0의 공간효율은 50%

Linear RAID, RAID 0, RAID 1, RAID 5 구현

장치 이름 용량 비고
SCSI 0:1 2GB Linear RAID
SCSI 0:2 1GB Linear RAID
SCSI 0:3 1GB RAID 0
SCSI 0:4 1GB RAID 0
SCSI 0:5 1GB RAID 1
SCSI 0:6 1GB RAID 1
SCSI 0:7 사용 불가
SCSI 0:8 1GB RAID 5
SCSI 0:9 1GB RAID 5
SCSI 0:10 1GB RAID 5
  • 파티션 타입은 fd, Linux raid autodetect로 설정.
1
2
3
4
5
6
7
8
9
/dev/sdb1            2048     4194303     2096128   fd  Linux raid autodetect
/dev/sdc1 2048 2097151 1047552 fd Linux raid autodetect
/dev/sdd1 2048 2097151 1047552 fd Linux raid autodetect
/dev/sde1 2048 2097151 1047552 fd Linux raid autodetect
/dev/sdf1 2048 2097151 1047552 fd Linux raid autodetect
/dev/sdg1 2048 2097151 1047552 fd Linux raid autodetect
/dev/sdh1 2048 2097151 1047552 fd Linux raid autodetect
/dev/sdi1 2048 2097151 1047552 fd Linux raid autodetect
/dev/sdj1 2048 2097151 1047552 fd Linux raid autodetect
  • Linear RAID
1
2
3
4
5
6
7
8
[root@localhost ~]# mdadm --create /dev/md9 --level=linear --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md9 started.

[root@localhost ~]# mdadm --detail --scan
ARRAY /dev/md9 metadata=1.2 name=localhost.localdomain:9 UUID=f86f440c:96d42e39:9647f3bd:699c394f

[root@localhost ~]# mkfs.ext4 /dev/md9
  • RAID 0
1
2
[root@localhost ~]# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdd1 /dev/sde1
[root@localhost ~]# mkfs.ext4 /dev/md0
  • RAID 1
1
2
[root@localhost ~]# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdf1 /dev/sdg1
[root@localhost ~]# mkfs.ext4 /dev/md1
  • RAID 5
1
2
[root@localhost ~]# mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdh1 /dev/sdi1 /dev/sdj1
[root@localhost ~]# mkfs.ext4 /dev/md5
  • RAID 6
1
2
[root@localhost ~]# mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
[root@localhost ~]# mkfs.ext4 /dev/md6
  • RAID 1+0
1
2
3
4
5
[root@localhost ~]# mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sdf1 /dev/sdg1
[root@localhost ~]# mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sdh1 /dev/sdi1

[root@localhost ~]# mdadm --create /dev/md10 --level=0 --raid-devices=2 /dev/md2 /dev/md3
[root@localhost ~]# mkfs.ext4 /dev/md10

LVM(Logical Volume Manage)

  • LVM 주요 기능: 여러 개의 하드디스크를 합쳐서 한 개의 파일시스템으로 사용하는 것으로 필요에 따라서 다시 나눌 수 있다.
  • 용어
    • Physical Volume(물리 볼륨): /dev/sda1, /dev/sdb1 등의 파티션.
    • Volume Group(볼륨 그룹): 물리 볼륨을 합쳐서 1개의 물리 그룹으로 만드는 것.
    • Logical Volume(논리 볼륨): 볼륨 그룹을 1개 이상으로 나눠서 논리 그룹으로 나눈 것.
  • 파티션 타입은 8e, Linux LVM로 설정.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
[root@localhost ~]# pvcreate /dev/sdc1
Physical volume "/dev/sdb1" successfully created

[root@localhost ~]# vgcreate myVG /dev/sdb1 /deb/sdc1
Volume group "myVG" successfully created

[root@localhost ~]# lvcreate --size 1G --name myLG1 myVG
Logical volume "myLG1" created
[root@localhost ~]# lvcreate --size 3G --name myLG2 myVG
Logical volume "myLG2" created
[root@localhost ~]# lvcreate --extents 100%FREE --name myLG3 myVG
Logical volume "myLG3" created

[root@localhost ~]# mkfs.ext4 /dev/myVG/myLG1
[root@localhost ~]# mkfs.ext4 /dev/myVG/myLG2
[root@localhost ~]# mkfs.ext4 /dev/myVG/myLG3

[root@localhost ~]# mkdir /lvm1 /lvm2 /lvm3
[root@localhost ~]# mount /dev/myVG/myLG1 /lvm1
[root@localhost ~]# mount /dev/myVG/myLG2 /lvm2
[root@localhost ~]# mount /dev/myVG/myLG3 /lvm3

사용자별 공간 할당 - 쿼터(Quota)

  • 파일시스템마다 사용자나 그룹이 생성할 수 있는 파일의 용량 및 개수를 제한하는 것.
  • 파일시스템을 /로 지정하는 것보다는, 별도의 파일시스템을 지정해서 해당 부분을 쓰도록 하는것이 좋음.
  • / 파일 시스템을 많은 사용자가 동시에 사용하게 되면, 서버를 운영하기 위해서 디스크를 읽고 쓰는 작업과 일반 사용자가 디스크를 읽고 쓰는 작업이 동시에 발생하므로 전반적으로 시스템의 성능이 저하 됨.
  • 디스크 추가 후(/dev/sdb), /userHome에 마운트.
1
2
[root@localhost ~]# useradd -d /userHome/john john
[root@localhost ~]# useradd -d /userHome/bann bann
  • /etc/fstabusrjquota=aquota.user,jqfmt=vfsv0 추가.
1
2
3
[root@localhost ~]# vi /etc/fstab
/dev/sdb1 /userHome ext4 defaults,usrjquota=aquota.user,jqfmt=vfsv0 1 2
[root@localhost ~]# mount --options remount /userHome
  • 쿼터 DB 생성
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# cd /userHome
[root@localhost userHome]# quotaoff -avug
/dev/sdb1 [/userHome]: user quotas turned off
[root@localhost userHome]# quotacheck -augmn
[root@localhost userHome]# rm -rf aquota.*
[root@localhost userHome]# quotacheck -augmn
[root@localhost userHome]# touch aquota.user aquota.group
[root@localhost userHome]# chmod 600 aquota.*
[root@localhost userHome]# quotacheck -augmn
[root@localhost userHome]# quotaon -avug
/dev/sdb1 [/userHome]: user quotas turned on
  • 사용자별 쿼터 설정
1
2
3
4
[root@localhost userHome]# edquota -u john
Disk quotas for user john (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 28 10240 15360 7 0 0
  • 쿼터 테스트
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost userHome]# su - john
[john@localhost ~]$ cp /boot/vmlinuz-3.10.0-229.el7.x86_64 test1
[john@localhost ~]$ cp test1 test2
[john@localhost ~]$ cp test1 test3
sdb1: warning, user block quota exceeded. # soft 쿼터 초과.
[john@localhost ~]$ cp test1 test4
sdb1: write failed, user block limit reached.
cp: 'test4'에 쓰는 도중 오류 발생: 디스크 할당량이 초과됨
cp: failed to extend 'test4': 디스크 할당량이 초과됨
[john@localhost ~]$ ll
합계 15312
-rwxr-xr-x. 1 john john 5029136 1월 8 14:23 test1
-rwxr-xr-x. 1 john john 5029136 1월 8 14:24 test2
-rwxr-xr-x. 1 john john 5029136 1월 8 14:24 test3
-rwxr-xr-x. 1 john john 589824 1월 8 14:24 test4 # hard 쿼터 제한

[john@localhost ~]$ quota
Disk quotas for user john (uid 1001):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb1 15360* 10240 15360 6days 16 0 0
  • 쿼터 설정 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost userHome]# repquota /userHome/
*** Report for user quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 20 0 0 3 0 0
john +- 15360 10240 15360 6days 17 0 0
bann -- 28 0 0 7 0 0

[root@localhost userHome]# edquota -p john bann # 쿼터 설정 복사

[root@localhost userHome]# repquota /userHome/
*** Report for user quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 20 0 0 3 0 0
john +- 15360 10240 15360 6days 17 0 0
bann -- 28 10240 15360 7 0 0