Operating System(OS)/Linux

리눅스 고급 - 내용 정리

9rrrr-m 2024. 7. 12. 18:42
더보기

본 국비 교육 시작 전에 리눅스 고급 강의로 예습한 내용입니다. 리눅스 기초를 공부할때 공부 자료 찾기가 은근 어려웠기에 자료를 공유 할 겸, 복기용으로 강의 ppt에 나온 내용을 토대로 간략히 정리했습니다.

 

(4년 전 강의라 바뀐 내용이 있을 수도 있습니다. 저도 예습을 목적으로 공부한 것이라 내용에 이상이 있는 경우 댓글로 적어주시면 감사하겠습니다!)

 

▼ 들은 강의

 


 

리눅스 고급

 

www.youtube.com

 

 

리눅스 고급

< 사용자 관리 >

* 사용자 관리 관련 파일

  • /etc/passwd
[root@localhost test]# tail -1 /etc/passwd
user:x:1000:1000:user:/home/user:/bin/bash
user x 1000 1000 user /home/user /bin/bash
로그인명 사용X UID GID 주석(설명) 사용자 홈 디렉토리 로그인 쉘

       (1) 로그인명

             → 각 사용자는 유일한 이름을 가지고 있어야 함(중복 허용X)

             → 첫 문자는 영문자(. _ - 시스템에 따라 사용 가능)

       (2) 사용x
             → (본 사용 목적: 패스워드 저장 부분) 현재 사용X

             → etc/shadow 파일에 따로 저장
       (3) UID
             → 로그인명은 중복이 X, but UID는 중복이 가능
             → 시스템이 사용자를 식별하는 번호
                  (root의 권한을 가질 수도 있음)
             → 일반 사용자는 1000번 이상의 사용
             → normally 1000보다 작은 UID는 예약 UID
       (4) GID
             → 해당 사용자가 속해있는 주 그룹의 GID
       (5) 주석
             → 일반적으로 사용자의 전체 이름을 써준다. 또는 연락처, 부서 등 로그인명만으로 사용자의 구분이 힘들 때 자세한 설명을 쓰는 부분
       (6) 사용자 홈디렉토리
             → 사용자의 홈디렉토리
             → '~'를 사용했을 때 참조하는 부분
       (7) 로그인 쉘
             → 사용자가 로그인할 때 실행되는 쉘을 지정

       (0) 계정

            ㄱ. root (UID = 0)
                  → 시스템에서 모든 권한을 가지고 있는 최고 권한 사용자
                    시스템 내의 보호되는 파일이나 퍼미션 등의 제한 사항에 대해 대부분 영향을 받지 않는다
             ㄴ. bin: 시스템의 구동중인 바이너리 파일을 관리하기 위한 계정
             ㄷ. daemon: 백그라운드 프로세스에 대한 작업을 제어하기 위한 시스템 계정
             ㄹ. adm: 시스템 로깅이나 특정 작업을 관리하는 시스템 계정
             ㅁ. lp: 프린트를 위한 계정
             ㅂ. gdm: Gnome Display 관리 서비스 계정

  • /etc/shadow
[root@localhost ~]# tail -1 /etc/shadow
user:$6$tNJB8MXIsdlkfjsdlkji324235lkjsfifao9:17556:0:99999:7:::
user $6$tNJB8~ 17556 0 99999 7      
(1) (2) (3) (4) (5) (6) (7) (8) (9)

       (1) 로그인명

             → 사용자의 로그인명

       (2) 패스워드 필드

             → 암호화돼서 저장
             → 대칭키 암호화 알고리즘(DES)을 이용한 Crytp 함수
             → $로 필드를 구분 (패스워드 생성시 사용된 salt 값을 저장)
             → *LK*: 해당 사용자는 로그인 할 수 없는 lock이 걸린 사용자를 의미
             → 공백: 패스워드 입력 없이 로그인 할 수 있음
             → Windows의 암호 저장 파일 경로: C:Windows/System32/config/SAM
       (3) 마지막 변경일
             → 1970/1/1 기준으로 패스워드를 변경한 날짜까지 count
       (4) MIN
             → 패스워드 변경 후 최대 최소 사용 기간 (패스워드 변경 후 설정 MIN이 지날 때까지 재변경 불가)
       (5) MAX
             → 패스워드 변경 후 최대 사용 기간
             → 지정된 MAX 값 이내에 변경 패스워드 사용 가능
       (6) WARN
             → 패스워드 만기일 이전에 사용자에게 경고 메시지를 전달할 날짜 지정
       (7) Inactive
             → 비활성화 사용자
             → 휴면 계정 설정 (설정한 날짜만큼 로그인 활동이 없으면 Lock 계정(휴면계정)으로 변경됨)
       (8) Expire
             → 패스워드 만기일 설정
             → 해당 날짜에 자동으로 계정 locking
                  - 로그인 불가 (관리자에 의해 lock 해제 필요)
       (9) Reserved
             → 예약 필드
             → 현재는 사용 X

 

        ▶ 패스워드 생성
             Password → H() → 암호문1 → crypt(Salt값 추가+암호문1) → 암호문2
              - salt 값: 운영체제에서 random하게 만들어내는 값
              - why? 같은 암호를 사용하는 두 사용자의 암호값 혼란을 막기 위해

 

  • /etc/group
[root@localhost ~]# cat /etc/group
root:x:0:
root x 0  
그룹 이름 패스워드 GID 사용자 목록

       (1) 그룹 이름: 그룹의 이름

       (2) 패스워드: 하위 버전과의 호환성을 위해 제공되는 필드로 현재는 사용하지않지만 사용이 불가능한 것은 아니다

       (3) GID: 해당하는 그룹을 구분하는 번호

       (4) 사용자 목록:  해당 그룹을 보조 그룹으로써 참조하는 사용자들의 로그인명을 작성

 

* 사용자 및 그룹 관리 명령어

  • 사용자 관리 명령어
    → useradd: 사용자 계정 생성
        [옵션] [아규먼트] [사용자 이름]
    -u UID를 지정(normally set unique)
    -g 주 그룹의 GID 설정
    -G 보조 그룹의 GID 설정
    -d 홈 디렉토리
    -m 홈 디렉토리 지정 시 홈 디렉토리가 존재하지 않을 경우 해당 디렉토리를 자동으로 생성하도록 하는 옵션
    -s 로그인 쉘 지정
    -c 주석(사용자에 대한 설명)
    -f 휴면 계정 전환 날짜 지정
    -e 만료일 지정
    → usermod: 사용자 계정 정보 변경
        [옵션] 동일
    → userdel: 사용자 계정 삭제
        [옵션] [사용자 이름]
    -r 해당 사용자가 사용하던 홈 디렉토리도 같이 삭제 
  • 그룹 관리 명령어
    groupadd: 그룹 생성
    -g 그룹의 GID 지정
    -o GID 중복 설정 가능하게 하는 옵션
    groupmod: 그룹 정보 변경
    -g 그룹의 GID 지정
    -o GID 중복 설정 가능하게 하는 옵션
    groupdel: 그룹을 제거할 때 사용하는 명령어
  • 사용자 생성시 기본값 설정
    /etc/skel: 기본값이 저장되어 있는 디렉토리
    [옵션] -D: 사용자가 생성될 때 기본값을 출력해줌

 

* 패스워드 관련 파일 및 명령어

  • 패스워드 정책 (복잡도, 변경 주기, 히스토리 등)
    → 대/소문자, 숫자, 특수문자를 혼용하여 8글자 이상의 패스워드를 사용
         동일 문자를 연속 4회 이상 사용 금지
         패스워드 히스토리를 관리해 2~3개 이상 동일 패스워드 사용 금지
         패스워드 변경 주기를 설정 (패스워드 유효기간을 90일 이하로 설정)
         사전에 나오는 쉬운 단어나 이름은 패스워드로 사용하지 못하도록 설정
         기본 설정된 패스워드는 사용하지 못하도록 설정
         초기 부여된 패스워드는 사용자 최초 접속 시 변경하도록 설정
  • 패스워드 정책 설정 파일: /etc/security/pwquality.conf
    패스워드 기본값 설정 파일: /etc/login.defs
  • passwd 명령어: 패스워드를 변경할 때 사용
    → passwd [사용자명]
         해당 사용자의 패스워드 변경
         사용자명을 입력하지 않으면 현재 사용자의 패스워드 변경
    -n 패스워드 변경 후 최소 사용 기간
    -x 패스워드 변경 후 최대 사용 기간
    -w 패스워드 만기일 이전에 사용자에게 경고 메시지를 전달할 날짜 지정
    -f 최초 로그인시에 강제로 패스워드를 변경하도록 설정
    -d shadow 파일의 패스워드 필드 값을 제거
    passwd 입력 없이 로그인 가능
    -l 해당 사용자의 상태를 locking으로 변경
    -S 해당 사용자의 현재 패스워드 설정 조회

 

 

< 접근 제어 >

* PAM 이론

  • 사용자 로그인 관련 명령어
    → su 명령어: 다른 사용자로 로그인
         su [-] [사용자명]
    - dash의 유무
    있음 (su -root) 입력한 사용자의 사용자 초기화 파일 적용
    없음 (su root) 현재 사용자의 환경을 유지, 사용자 초기화 파일 적용 X
    → who 명령어: 로그인 한 사용자 확인
    who 접속 정보
    who am i 현재 터미널에 대한 접속 정보
    whoami 로그인명
      last 명령어: 로그인 내역 확인
          - /var/log/wtmp 파일을 참조해서 로그인했던 정보를 출력해주는 명령어
          - 자신의 시스템에 접속한 정보를 확인할 수 있다(IP 확인 가능)

 

* PAM 모듈

  • PAM(Pluggable Authentication Modules) 이란?
    → 시스템에 공통적인 인증 방법을 제공
    → 어떤 보안 인증 기능을 추가할 때 모듈로 만들어서 쉽게 보안 설정 내용들을 교체 또는 추가, 제거가 가능
    → 모듈의 종류는 다양하며 각각 모듈의 기능을 정확히 파악하는 것이 중요
    → 프로그램이 사용자 인증이 필요하면 PAM 라이브러리를 호출
    → PAM 라이브러리는 호출되면 호출한 응용프로그램의 설정 파일을 검사, 설정 파일의 내용에 맞는 PAM 모듈을 적용
    → 설정 파일이 없으면, 기본설정 파일 사용(other)
    → 설정 파일은 사용자 인증을 검사하기 위해 필요한 유형(형식)을 가짐

  • PAM 설정 파일
    → /etc/pam.d 디렉토리: 각 프로그램의 설정 파일을 저장
         - pam을 적용한 프로그램이나 서비스의 설정 내용을 저장해둔 파일들이 모여있는 디렉토리
    → 설정 파일 형식(다양하게 설정 가능)
    auth sufficient pam_rootok.so  
    module_type config_flag module_path module_argument
    (1) Module_type: PAM이 어떤 타입의 인증을 사용할 것인지를 지정
         ㄱ. auth: 사용자 인증에 사용하며 올바른 패스워드인지 아닌지 확인
         ㄴ. account: 계정 관리를 수행, 사용자의 위치, 시간, 권한 등을 지정하여 접근을 결정
               ex) 특정 사용자는 콘솔로만 아침 9시부터 6시까지만 root로 접근 가능
         ㄷ. password: 사용자가 패스워드를 변경할 수 있는 모듈 지정
         ㄹ. session: 사용자가 인증 받기 전 후에 수행되어야 할 작업을 지정
               ex) 로그 기록
    (2) Config_flag: PAM에서 사용되는 모듈들이 결과에 따라 어떤 동작을 취할 지 결정
         ㄱ. required: 이 모듈이 성공값을 반환해야 최종 인증에 성공 (실패 시 밑의 다른 설정도 전부 다시 확인)(덜 엄격한 설정)
         ㄴ. requisite: 이 모듈이 성공값을 반환해야 최종 인증에 성공(실패 시 바로 최종 인증 실패)(엄격한 설정)
         ㄷ. sufficient: 이 모듈이 성공값을 반환하면 바로 인증 성공
         ㄹ. optional: 선택사항, 일반적으로 무시, 다른 플래그에 의한 최종 결과가 불분명할 시 optional 값이 적용
         ㅁ. include: 다른 설정 파일을 불러옴
    (3) Module_path: /usr/lib64/security 디렉토리 내의 어떤 모듈을 사용할 지 지정
                                모듈 이름을 지정( → 알아서 모듈 이름 찾음)
    (4) Module_argument: 모듈에 전달되는 매개변수 값을 나타냄
         ㄱ. debug: 시스템 로그 파일에 디버그 정보를 남기게 함
         ㄴ. no_warn: 모듈이 경고 메세지를 보내지 않게 함
  • PAM 모듈의 종류: 다양한 인증 방식 제공
    pam_permit.so, pam_deny.so 항상 성공/실패를 return 접근을 허용/거부 (가장 일반적인 모듈)
    pam_warn 호출한 사용자 및 호스트 정보를 messages 로그에 남김
    pam_access 계정 또는 IP주소를 이용해서 시스템 접근을 허용/거부
    pam_pwcheck /etc/login.defs 파일을 참조하여 암호를 확인하는 명령어
    pam_securetty /etc/securetty 파일을 참조하여 터미널 장치가 root로 접근 할 수 있는지 없는지 판단
    pam_time 시간, 쉘 등을 설정할 수 있는 모듈
    pam_wheel su 서비스에 사용함, su를 이용한 root 접근을 막을 수 있음

 

 

< 리눅스 부팅 과정 >

* 리눅스의 전통적인 부팅 과정

  • 전원 켜기 → POST (Power On Self Test) → BIOS(Basic Input/Output System) 단계 → 부팅 장치 검색 → 부트 로더 실행 (Grub 실행) → 실행 할 커널 선택 → 커널 로드 및 PID 1번 실행 → 기타 필수 프로그램 실행 → 부팅 완료
  • 부팅 메뉴 파일: /boot/grub2/grub.cfg
  • 커널 이미지 파일: vmlinuz
  • 부팅할 때 나오는 메시지: /var/log/boot.log

 

* 런 레벨

  • 시스템의 상태를 나타내는 값
    0 halt(시스템 종료)  :: Run-level을 0으로 변경하면 시스템 종료
    1 Single User Mode  :: 시스템 복원 모드  :: 기본적으로 "관리자 권한"을 획득
    (주로 파일 시스템 점검, 패스워드 분실 했을 때 또는 복구 할 때 사용)
    2 Multi User Mode without NFS(Network File System  :: 공유 파일)
    (네트워크를 사용치 않는 텍스트 유저 모드)
    3 Full multi User Mode
    (거의 모든 자원 사용 가능한 텍스트 유저 모드)
    4 Unused(사용 X)
    5 level 3과 비슷하나 x윈도우가 실행된 그래픽 유저 모드
    6 Reboot(시스템 재부팅)  :: Run-level을 6으로 변경하면 시스템 재부팅
  • 런 레벨은 숫자 또는 문자로 표현된 시스템의 상태
  • 런 레벨은 서비스와 사용자가 사용할 수 있는 자원들에 대해 정의하고 있음

 

* 런 레벨 관련 명령어

  • 런 레벨 확인 명령어
    → who -r 명령어: 현재 및 이전 런 레벨을 확인
  • 런 레벨 변경 명령어
    → init 명령어: 런 레벨 스크립트를 실행

 

 

 

< systemd >

* systemd란? - init의 세대 교체

  • systemd: init뿐만 아니라 다른 기능들도 대체
  • 리눅스를 부팅하면 커널이 가장 먼저 실행시키는 프로세스
  • 기존의 리눅스는 가장 먼저 init 프로세스를 실행하고 init 프로세스가 필요한 다른 프로세스를 실행
  • 기존의 init 프로세스는 단계적으로 런 레벨을 올려가며 해당 런 레벨의 rc 스크립트를 차례대로 실행
  • 하지만 init은 아주 오래전 리눅스로부터 사용하던 아주 오래된 프로세스였고, 이에 계속해서 기능이 추가되면서 프로그램들이 복잡해지다보니 효율 또한 떨어지게 됨
  • 이에 systemd는 init의 단점을 보완하며 기존 리눅스의 의존성을 해치지 않도록 개발
  • systemd는 가능한 한 병렬로 시작 프로그램들을 실행시키는 것으로 부팅 속도를 끌어올리고, 프로그램 실행을 위한 파일로는 쉘 스크립트가 아니라 service라는 systemd만의 unit을 통해 체계적이면서 가독성이 좋도록 개발
  • systemd는 단지 init뿐만아니라 다른 프로그램들의 기능마저 대체
  • 네임서버 주소를 설정하는 resolv.conf의 자리를 systemd-resolved가 대체, DHCP 서버에서 IP를 받아와서 네트워크 인터페이스에 설정하는 dhcpcd의 자리를 systemd-networkd가 대체

 

* systemd 유닛

  • 유닛의 종류
    → systemd는 전체 시스템을 시작하고 관리하는 데 유닛(units)이라 부르는 구성 요소를 사용
    → systemd는 관리 대상의 이름을 '서비스 이름.유닛 종류'의 형태로 관리
    → 유닛은 같은 이름과 종류로 구성된 설정 파일과 동일한 이름을 사용
    유닛 기능
    service 데몬의 시작, 종료, 재시작 담당 atd.service
    socket 소켓을 관리하는 유닛 dbus.socket
    device 리눅스의 여러 장치들을 관리 dev-sda.device
    mount 마운트 포인트 관리 boot.mount
    automount 자동 마운트 포인트 관리 proc-sys-fs-binfmt_misc.automount

 

* systemd 관련 명령어

  • systemctl: systemd를 제어
    systemctl [옵션] [명령] [유닛 이름]
    → 옵션
    -a 상태와 관계없이 유닛 전체를 출력
    -t [유닛의 종류] 지정한 종류의 유닛만 출력
    → 명령
    start 유닛을 시작
    stop 유닛을 정지
    reload 유닛의 설정 파일을 다시 읽어옴
    restart 유닛을 재시작
    status 유닛이 현재 상태를 확인
    enable 부팅 시 유닛이 자동으로 시작되도록 설정
    disable 부팅 시 유닛이 자동으로 시작되지 않도록 설정

 

 

< 디스크 관리 및 파일 시스템 >

* 디스크의 종류

  • IDE: 이제는 대부분 사라짐
  • SATA: 일반적으로 많이 쓰임
  • SCSI: 서버 시스템에 많이 쓰임 (안정적)

 

* 디스크의 구조 및 관리

  • 물리적인 구조: 하드디스크

  • 논리적인 구조: 데이터 저장 공간
    → 섹터 1개 = 512bytes

  • fdisk: 디스크 관리 명령어
    → a b c는 디스크의 순서, 1 2 3은 파티션

 

* 디스크를 추가하는 과정

  • 파티션, 파일시스템: 디스크를 사용하기 위해 필요
    → 물리 디스크 추가 → 부팅 또는 장치 인식 → 파티션 설정 → 파일 시스템 설치(포맷) → 사용 (mount)

 

* 파일 시스템의 종류

  • EXT2
  • EXT3
  • EXT4 (리눅스에서 많이 쓰임)

 

        → Super Block: 파일 시스템의 대부분의 정보를 저장하고 있는 블록. 블록 크기에 상관없이 항상 블록 그룹의 첫번째 블록에 저장된다. 굉장히 중요한 정보를 저장하고 있기 때문에 백업을 해둔다.

             - 정보: 파일시스템 크기, 마운트 정보, inode의 수, 블록 크기, 데이터 블록의 수
             - 슈퍼블록 복구: fsck -b [백업 블록 번호] [복구할 장치]
               ex) fsck -b 8193 -fy /dev/sdf1

        → Innode Table
             - EXT3: 직접 inode: 데이터 블록의 주소를 직접 가리키는 블록.
                          간접 inode: 직접 inode를 가리키는 블록. 하나의 간접 inode가 여러개의 직접 inode를 가리킬 수 있다.
             - EXT4: EXT2, EXT3과는 다르게 inode 블록이 한 개의 데이터 블록만 가리키는 것이 아니라 블록 할당 알고리즘을 이용하여 연관된 블록을 한꺼번에 여러개 할당할 수 있도록 만듬

 

* 파일시스템 관리

  • mkfs: 파일 시스템 생성

 

* 마운트 및 언마운트

  • 마운트: 특정 디렉토리와 특정 장치를 연결

      → mount [옵션] [장치] [마운트 포인트]
           [옵션]
            -t: 특정 파일시스템의 종류를 지정
           [장치]
           마운트 포인트와 연결할 장치를 지정. 일반적으로 파일 시스템을 생성한 파티션이 옴
           [마운트 포인트]
           특정 디렉토리를 지정. 해당 디렉토리로 접근 시 지정한 장치로 이동됨

  • 자동 마운트 설정 파일: /etc/fstab

 

< 디스크 관리와 RAID >

* RAID (Redundant Array of Independent Disks)

                                속도 증가, 안전성 감소                                                             속도 그대로, 안전성 증가

속도 증가, XOR 연산으로 데이터 복구 가능

RAID 1 + 0 > RAID 0 + 1

  • 장애 허용 시스템(Fault tolerance)이 높을수록 안전성 증가
  • madam [옵션]
    → [옵션]
         --create: 생성할 RAID 장치의 이름
          --level: RAID 레벨을 지정
          --raid-devices: RAID에 추가될 실제 장치의 파티션 지정
          --detail: 특정 장치의 상세 내역을 출력
    → RAID 0 구성
         Linear: 디스크를 배열 형태로 단순하게 연결시킨 구조
                      madam --create /dev/md/linear --level linear --raid-devices=2 /dev/sdb1 /dev/sdc1
         Stripe: 데이터의 내용을 분산 저장하여 속도가 빠름. but 안전성 down 
                      madam --create /dev/md/stripe --level stripe --raid-devices=2 /dev/sdd1 /dev/sde1
    → RAID 1 구성
         madam --create /dev/md/mirror --level mirror --raid-devices=2 /dev/sdf1 /dev/sdg1
    → RAID 5 구성
         madam --create /dev/md/raid5 --level=5 --raid-devices=3 /dev/sdh1 /dev/sdi1 /dev/sdj1
    → RAID 구성 삭제
         madam --stop [RAID 장치명]
         madam --zero-superblock [파티션 장치명]

 

 

< LVM(Logical Volume Manager) >

  • 논리 볼륨을 효율적이고 유연하게 관리하기 위한 커널의 한 부분이자 프로그램
  • 기존 방식에서는 파일시스템이 블록 장치에 직접 접근해서 읽고/쓰기를 했음
  • LVM을 사용하면 파일 시스템이 LVM이 만든 가상의 블록 장치에 읽고/쓰기 수행
  • 이를 통하여 다양한 기능 제공
  • 유연한 용량, 크기 조정 가능한 스토리지 풀(Pool), 온라인 데이터 재배치
  • 편의에 따라 장치 이름 지정, 디스크 스트라이핑, 미러 볼륨, 볼륨 스냅샷

- PE: Physical Extend
- PV: Physical Volume
- VG: Volume Group

- LE: Logical Extent
- LV: Logical Volume

 

* LVM 기본

1. LVM 타입의 파티션 생성
    fdisk [장치명] → n → p 주 파티션 → 첫번째 섹터 → 마지막 섹터 → t 타입 변경 → 8e LVM 타입으로 변경 → w 저장
2. PV 생성 및 확인
    pvcreate [파티션명]    ex) pvcreate /dev/sdb1
    pvscan
    pvdisplay [파티션명]
3. VG 생성 및 확인
    vgcreate [볼륨그룹명] [파티션명1] [파티션명2] [파티션명3] ...
        ex) vgcreate vg_test /dev/sdb1 /dev/sdc1
    vgscan
    vgdisplay [볼륨그룹명]
4. LV 생성 및 확인
    lvcreate -L [볼륨크기] -n [볼륨명] [볼륨그룹명]
        ex) lvcreate -L 5G -n lv_test vg_test
    lvscan
    lvdisplay [볼륨명]    ex) lvdisplay /dev/vg_test/lv_test
5. 파일시스템
    mkfs -t [파일시스템 타입] [볼륨명]    ex) mkfs -t xfs /dev/vg_test/lv_test
6. 마운트
    mount [볼륨명] [마운트 포인트]

 

* LVM 삭제

1. LV 삭제
    lvremove [lv명]
2. VG 삭제
    vgremove [vg명]
3. PV 삭제
    pvremove [pv명]

 

* LVM 확장

1. VG 확장
    디스크 추가 → 파티션 생성 → PV 생성 → vgextend [볼륨그룹명] [파티션명]
2. lv 확장
    lvextend -L +[용량] [볼륨명]
    resize2fs [볼륨명]  :: 파일시스템 조정
    xfs_growfs [볼륨명]  :: 마운트 후 실행

 

 

< 작업 스케줄링 >

* at [시간]: 작업 예약

  • at >  실행할 명령어    → Ctrl+D (종료)   
  • atq 또는 at -l (확인)
  • at -r [작업 번호] (삭제)

 

* crontab -e: 반복 작업 예약

  • crontab -e 명령어를 실행하면 편집기가 실행되고, 편집기를 이용하여 내용을 작성함
  • crontab -l (조회)
  • crontab -r (삭제)

 

* 스케줄링 접근 제어

  • 블랙 리스트 방식: 우선 모두를 허용하고, 리스트에 있는 특정 사용자들만 거부하는 방식
    →  at.deny, cron.deny
  • 화이트 리스트 방식: 우선 모두를 거부하고, 리스트에 있는 특정 사용자들만 허용하는 방식
     → at.allow, cron.allow
  • 화이트 리스트 방식의 작업 스케줄링 접근제어 파일은 관리자가 따로 생성해주어야 함
  • 블랙 리스트와 화이트 리스트 방식 모두 사용하는 경우 화이트 리스트 방식이 우선시 됨

 

 

< 백업 및 복구 >

* 데이터 백업

  • 백업과 복구의 개념
  • 언제 발생할 지 모르는 사고를 대비해 반드시 해야 할 것이 '백업'
  • 기존의 폴더 또는 파일을 다른 안전한 장소에 보관하는 것
  • Windows Server에서는 자체적으로 백업 기능을 제공
  • 백업은 별도의 하드디스크나 다른 컴퓨터의 공유 폴더에 하는 것이 필수
  • 최근에는 서버와 멀리 떨어진 원격지에도 백업(클라우드)
  • 복구는 삭제된 일부 폴더만 복구할 수도 있고, 볼륨 전체를 복구할 수도 있다.
전체 백업 - 모든 데이터를 백업하는 것
- 시간이 오래 걸리고 백업할 때마다 중복된 데이터도 백업하기 때문에 디스크 공간이 많이 필요
- 가장 최근에 전체 백업을 복구하면 가장 최근의 데이터로 복구 됨
증분 백업 - 이전에 수행한 백업으로부터 변경된 데이터만을 백업하는 것
- 데이터의 중복이 없고 용량을 많이 차지하지 않음
- 복구할 때는 전체 백업부터 증분 백업한 데이터를 순서대로 복구해야 최신 데이터를 복구할 수 있음
차분 백업 - 이전에 수행한 전체 백업을 기준으로 변경된 데이터만 백업하는 것
- 전체 백업을 복구하고 가장 최근에 차분 백업을 복구하면 가장 최근의 데이터로 복구 됨

 

* tar를 이용한 백업 및 복구

  • tar를 이용한 백업: 전체 백업
    → tar zcvpf [아카이브 이름] --exclude=[예외] /
         exclude 옵션을 이용하여 백업 파일이 저장되는 경로는 제외한 나머지 / 전체를 백업한다.
  • tar를 이용한 백업: 증분 백업
    → tar zcvpf [아카이브 이름] -g [리스트 파일 이름] [경로]
         -g 옵션을 이용하면 리스트를 만들어 백업 정보를 따로 저장해준다.
         -p 옵션을 이용하면 기존의 파일시스템의 권한 정보를 그대로 유지한다.
  • tar를 이용한 복구
    → tar zxvpf [아카이브 이름] -C [복구할 경로] -g [리스트 파일 이름]
         -C 옵션을 이용해서 아카이브 및 압축을 해제하면 특정 경로를 지정해서 해당 경로에 풀 수 있다.

 

* dump와 restore를 이용한 백업 및 복구

  • dump를 이용한 백업
    → dump -[옵션]f [백업 장치] [백업 대상]
         0: 전체 백업
         1~9: 증분, 차분 백업
                 (자신보다 낮은 레벨 중 가장 가까운 레벨의 내용과 비교해서 변한 내용만 백업)
          - 파일 시스템 단위로 백업
  • restore를 이용한 복구
    → restore -rvf [백업 파일 or 장치]
         - 작업 경로를 복구하길 원하는 경로로 이동 후 명령어 실행
         - 복구 명령어를 실행하면 작업 디렉토리에 restoresymtable 파일이 생성
         - 해당 파일은 증분 복구와 복구 상의 진행 정보 등이 저장되어 있음
         - 따라서 증분 백업을 모두 복구하기 전에 삭제 X
         - 복구가 모두 끝나면 삭제
  • dump 설치 실습
    1. 네트워크 설정 (/etc/sysconfig/network-scripts/ifcfg-ens33 파일 마지막 no를 yes로 수정 후 systemctl restart network -> ifconfig ens33으로 IP 설정 확인
    2. dump 명령어 설치 (yum -y install dump)
    3. dump 명령어 실행 확인 (dump 명령어 실행)
  • dump 백업 실습
    1. 전체 백업 (dump -0f /backup/full_bak /origin)
    2. 증분 백업 (dump -3f /backup/incre_bak_1 /origin)
    3. 증분 백업 (dump -4f /backup/incre_bak_2 /origin)
    4. 차분 백업 (dump -1f /backup/diff_bak /origin)
  • restore 복구 실습
    0. 복구할 디렉토리로 이동 후 복구 (cd /origin)
    1. 전체 백업 복구 (restore -rvf /backup/full_bak)
    2. 증분 백업 복구 (restore -rvf /backup/incre_bak)

 

* dd를 이용한 백업 및 복구

  • dd를 이용한 백업
    → dd if=[백업할 장치 (입력장치)] of=[저장할 위치 (출력장치)] [bs=[크기] count=[숫자]]
         - 블록 크기와 카운트를 지정하지 않으면 디스크 장치 단위로 백업 및 복구 (디스크 전체를 백업, 시간 많이 걸림, 비효율적)
         - 블록 크기와 카운트를 지정하면 해당 용량 만큼만 백업 및 복구 또는 복사
  • dd를 이용한 복구
    → dd if=[저장한 위치] of=[복구할 장치] [bs=[크기] count=[숫자]]
         - 백업 명령어에서 if와 of의 위치만 바꿔주면 된다.
  • dd 백업 실습
    1. 백업할 장치 사용 중지 (unmount /3gb)
    2. 백업 수행 (dd if=/dev/sdg of=/backup/3gb.bak)
    3. fdisk /dev/sdg 명령어로 sdg 디스크의 파티션 모두 삭제 후 저장
    4. mount /dev/sdg1 /3gb 정상적으로 마운트 불가능
  • dd 복구 실습
    1. 복구 수행 (dd if=/backup/3gb.bak of=/dev/sdg)
    2. fdisk /dev/sdg 명령어로 파티션 정보가 다시 생긴 것 확인
    3. mount /dev/sdg1  /3gb 정상적으로 마운트 가능

 

 

< 네트워크 설정 >

* 명령어를 사용한 네트워크 설정

  • Ifconfig 명령어
    Ifconfig [장치명] [IP주소] netmask [서브넷 마스크]
  • route 명령어
    route add default gw [GW 주소]

 

* DHCP 서버를 이용한 설정

  • 명령어로 설정
    → dhclient [장치명]
  • 파일로 설정: /etc/sysconfig/network-scripts/ifcfg-ens33
    BOOTPROTO=dhcp
    ONBOOT=yes
    → systemctl restart network 명령어를 통해서 변경 사항 적용

 

* 파일 사용한 수동 설정

  • 파일 설정 내용: /etc/sysconfig/network-scripts/ifcfg-enss33
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=[주소]
    NETMASK=[서브넷]
    GATEWAY=[주소]
    DNS1=[주소]

 

 

< 소프트웨어 패키지 관리 >

* 설치 파일을 이용한 관리

  • rpm 파일: CentOS의 설치 파일 형식
    → rpm (Redhat Package Manager)
    * tip: 레드햇 계열 = rpm 파일, 데비안 = deb 파일
  • rpm 명령어
    확인 -qa( | grep [특정 파일])
    -ql [패키지명]
    (-q: 질의, -a: 모든 패키지)
    설치 -ivh [패키지 파일명]
    (-i: 설치 옵션, -v: 자세한 정보 출력 옵션, -h: 설치 진행과정 도식 옵션)
    제거 -evh [패키지 파일명]
    (-e: erase  :: 삭제 옵션)
    업데이트 -Uvh [패키지 파일명]
    (-U: update 옵션)
    * tip: 인터넷 상에서 파일을 받아올 때는 wget [주소] 명령어를 사용한다.
    의존성 확인 rpm -qR [패키지명]
    (패키지 관련된 의존성 확인 가능)

 

* 소스 코드를 이용한 관리

  • ./configure: 컴퓨터의 환경 설정 파일
  • make: makefile의 내용대로 컴파일 함
  • make install: 컴파일 된 파일을 설치
    1. 패키지 설치: 일반적으로 소스코드 파일은 tar.gz 형식으로 배포
                              tar zxvf 명령어를 이용해서 압축부터 해제
        (1) ./configure: 소스코드로 패키지를 설치하기 위한 여러가지 도구 및 라이브러리들이 다 있는지 확인, make 명령어를 이용해서 컴파일 하기 위한 환경을 만들어주는 스크립트
        (2) make: ./configure로 생성된 Makefile의 내용대로 컴파일을 수행 -> 리눅스용 실행파일 생성
        (3) make install: 생성된 리눅스용 실행파일을 특정 디렉토리에 설치
    2. 패키지 삭제
        make 했던 디렉토리로 돌아와서 make uninstall
          ex) wget https://ftp.gnu.org/gnu/bison/bison-3.1.tar.gz

 

* 인터넷 저장소를 이용한 관리

  • 레포지터리(repository): 다양한 곳에서 운영중
    * tip: 레드햇 계열 = yum 명령어, 데비안 = apt-get
  • yum 명령어: 레포지터리에서 다운 및 설치
    → 설치: yum install [패키지명] (*: 관련 패키지 모두 설치)
                 의존성이 있는 파일 모두 설치를 해줌
                 (의존성: a라는 프로그램이 b라는 프로그램 기반인 경우)
                  -y 옵션 추가시 묻는 문항에 모두 y로 대답
    → 삭제: yum erase [패키지명]
    → 업그레이드: yum upgrade [패키지명]
    * tip: yum list [검색 내용]

 

 

< 리눅스의 로그 > 
* 리눅스의 로그

  • 로깅(logging): 로그를 기록하는 행위
  • 로그:  컴퓨터 또는 프로그램의 사용 기록. 운영 체제나 다른 소프트웨어가 실행 중에 발생하는 이벤트나 각기 다른 사용자의 통신 소프트웨어 간의 메시지를 기록한 파일
    시스템 로그 /var/log/messages 시스템 전반적인 로그
    보안 로그 /var/log/secure Inetd에 의한 로그
    메일 로그 /var/log/maillog 메일 로그
    크론 로그 /var/log/cron 작업 스케줄링 로그
    부팅 로그 /var/log/boot.log 시스템 부팅시의 로그
    Dmesg 로그 /var/log/dmesg 부팅시 기록되는 로그
    Utmp 로그 /var/log/utmp 현재 시스템에 로그인한 각 사용자의 상태를 출력
    Wtmp 로그 /var/log/wtmp 로그인, 로그아웃, 시스템의 재부팅에 대한 정보
    → last 명령어로 확인
    Last 로그 /var/log/lastlog 계정 사용자들이 마지막으로 로그인한 정보
    아나콘다 /var/log/anaconda 리눅스 설치시 installer 과정에 대한 로그
    Su 로그 /var/log/sulog Su 명령어를 통한 로그인시 정보 기록
    Pacct 로그 /var/account/pacct 로그인한 모든 사용자의 실행한 프로그램 정보 기록
    Btmp 로그 /var/log/btmp 실패한 로그인 시도를 기록

 

* syslog (컴퓨터의 환경 설정 파일)

  • Syslog의 구성: /etc/rsyslog.conf (실제 설정 파일의 내용)
    → 형식: [Facility].[Level]    [Action]
  • Facility
    kern 커널이 발생한 메시지
    user 사용자 프로세스
    mail mail 시스템 관련 서비스
    daemon relnetd, ftpd, httpd과 관련된 서비스
    auth 로그인과 같은 인증 관련 서비스
    syslog syslog 관련 서비스
    cron 예약작업 관련 서비스, cron, atd
    * 모든 서비스를 의미
  • Level
    emerge 일반적으로 모든 사용자에게 전달되는 패닉 상황 (블루스크린,  커널 패닉)
    alert 시스템 DB에 손상 등 즉시 수정해야되는 상황
    crit 하드 장치 오류 등 중대한 상황에 대한 경고
    err 하드 장치 이외의 오류
    warning 경고 메세지, 무시해도 됨
    notice 특별한 처리가 필요할 수 있는 비오류 상황
    info 정보 메세지
    debug 프로그램 개발 또는 테스트 할 때 사용
    none 로그로 기록 X
  • tail -f /var/log/test.log: 실시간으로 로그를 보면서 작업 가능

 

 

< NFS >

* NFS(네트워크 파일 시스템): 윈도우의 공유폴더와 비슷

  • 서버에서 공유한 디렉토리를 마치 로컬 시스템의 장치처럼 이용할 수 있도록 개발된 파일 시스템
  • 전통적인 유닉스 환경에서는 오랫동안 네트워크에서 자료를 공유하는 방법으로 사용
  • NFS 서버가 디렉토리를 공유하면 NFS 클라이언트가 공유한 디렉터리를 마운트해서 사용

 

* NFS 서버

  • /etc/exports: 공유할 디렉토리 지정 파일
  • 공유 설정 옵션
    rw 파일 시스템을 읽고 쓰기가 가능하도록 공유
    ro 파일 시스템을 읽기 전용으로 공유
    subtree_check 시스템 보안 유지를 위해 하위 디렉터리를 검사하는 옵션
    no_subtree_check 시스템 성능을 고려하여 하위 디렉터리 검사를 하지 않는 옵션
    root_squash 시스템 보안을 위해 공유 디렉터리에 대한 사용자의 루트 권한을 제한
    no_root_squash 공유 디렉터리에 대한 사용자의 루트 권한을 허용
    all_squash 모든 사용자 권한을 익명 사용자 권한, nobody:nogroup으로 지정
  • /etc/sysconfig/nfs: 포트 설정 파일

 

* NFS 클라이언트

  • 마운트:  원격지의 파일시스템 연결
  • nfsnobody: NFS 클라이언트의 권한

 

 

< 메모리 관리 >

* 리눅스 시스템의 메모리

  • 메모리:  프로세스를 언제, 어디에, 어떻게 적재할 것인지 커널이 관리
  • 리눅스는 하나의 프로세스에 4GB의 가상 메모리 주소 공간을 할당
  • 페이징: 리눅스는 가상 메모리 공간에 있는 페이지 중에서 현재 작업 수행에 필요한 부분만 물리 메모리에 올려 작업을 수행

  • 물리 메모리의 공간이 부족해지면 다시 일정 페이지를 가상 메모리 공간으로 보내는 작업을 반복

 

* 메모리 관련 명령어

  • free: 메모리 공간을 확인할 때 사용
    top: 프로세스 정보와 CPU 정보를 함께 확인

 

* SWAP

  • 메모리의 여유 공간을 디스크에 확보
  • swapon: 현재 swap 공간 구성 확인
  • swapoff: 해제
  • 파티션으로 구성하거나 파일을 만들어서 사용 가능

 

 

< DHCP 서버 >

* DHCP: (같은 네트워크 대역에서) 동적으로 IP를 할당 받도록 도와줌


* DHCP 서버 설정 파일

  • /etc/sysconfig/dhcpd: DHCP를 수행할 인터페이스를 지정 (예전 버전에서만 사용)
  • /etc/dhcp/dhcpd.conf: DHCP에 대한 다양한 설정을 하는 파일

 

* 실습

  • yum dhcp: 설치
  • 파일 수정 후 해당 서비스 재시작

 

 

< Kickstart >
* 무인 원격 설치: 동일한 구성으로 여러 대의 시스템에 원격 설치

  • Kickstart 구성
    - DHCP 서버: 네트워크 부팅 시 네트워크 설정을 해줌
    - tftp 서버: 네트워크 부팅시 부팅 관련 파일을 공유
    - NFS 서버: Kickstart 설정 파일과 이미지 파일을 공유

 

* 무인 원격 설치 실습

1. 설치 파일 준비
    (1) ISO 이미지 준비
          → /run/media/sjb/CentOS 7 x86_64/isolinux에서 initrd.img와 vmlinuz 복사
    (2) yum install syslinux 설치 → /usr/share/syslinux에서 menu.c32와 pxelinux.0를 복사

2. tftp 설정
    (1) vi /etc/xinetd.d/tftp
          → sever_args    = -s /tftpboot
    (2) mkdir /tftboot
          → menu.c32와 pxelinux.0 복사
    (3) mkdir /tftboot/CentOS7
          → initrd.img와 vmlinuz 복사
    (4) mkdir /tftboot/ks
          → cp /root/anaconda-ks.cfg /tftpboot/ks/ks.cfg
    (5) mkdir /tftpboot/pxelinux.cfg
          → vi default

DEFAULT menu.c32
timeout 100

menu title ### OS Installer Boot Menu ###

LABEL CentOS7
        kernel CentOS7/vmlinuz
        append ksdevice=link load_ramdisk=1 initrd=CentOS7/initrd.img unsupported_hardware text network ks=nfs:192.168.240.100:/tftpboot/ks/ks.cfg text

→ systemctl restart xinetd (재부팅)

3. DCHP 설정
     vi /etc/dhcp/dhcp.conf

allow booting;
allow bootp;
default-lease-time 600;
max-lease-time 7200;
option domain-name-servers 8.8.8.8;
option ip-forwarding false;
option mask-supplier false;
ddns-update-style none;
next-server 192.168.240.100;
filename "pxelinux.0";

subnet 192.168.240.0 netmask 255.255.255.0 {
        option routers 192.168.240.2;
        range 192.168.240.101 192.168.240.199;
}

  systemctl restart dhcpd

4. NFS 설정
    mkdir /iso
    cp -r /run/media/sib/CentOs₩ 7₩ x86_64/* /iso

    vi /etc/exports

/tftpboot/ks    192.168.10.* (ro)
/iso    192.168.10.* (ro)
(각 각 공유)

→ systemctl restart nfs.service

5. Kickstart 설정
     vi /tftpboot/ks/ks.cfg

#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
install

# Use graphical install
text

nfs --server=192.168.10.100 --dir="/iso"

# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=kr --xlayouts='kr'
# System language
lang ko_KR.UTF-8

# Network information
network --bootproto=dhcp --device=ens33 --onboot=off --ipv6=auto --no-activate
network --hostname=localhost.localdomain

# Root password
rootpw --iscrypted $~~~~~
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Seoul --isUtc
# X Window System configuration information
xconfig --startxonboot
# System bootloade configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
# Partition clearing information
clearpart --all --initlabel --drives=sda

%packages
@^gnome-desktop-environment
@base
@core
@desktop-debugging
@dial-up
@directory-client
@fonts
@gnome-desktop
@guest-agents
@guest-desktop-agents
@input-methods
@internet-browser
@java-platform
@multimedia
@netwok-file-system-client
@networkmanager-submodules
@print-clilent
@x11
chrony
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end



(6.) 권한 에러
       chmod -R 777 /tftpboot
       타임아웃
       systemctl stop firewalld
       setenforce 0

728x90