[리눅스마스터] 1. 리눅스 실무의 이해 / 2. 리눅스 시스템 관리
클라우드 컴퓨팅
클라우드 컴퓨팅 정의
- 사용자가 필요한 작업을 제시하면, 여기에 필요한 컴퓨팅 자원이 할당되어 작업하고 결과를 얻도록 해주는 것
- 기존의 그리드 컴퓨팅, 분산 컴퓨팅, 유틸리티 컴퓨팅, 웹 서비스, 서버 및 스토리지 가상화 기술과 소프트웨어 등 기존의 기반 기술들을 융합하여 하나의 커다란 구름과 같은 컴퓨팅 환경을 만드는 기술
- on-premiss 방식 대신 클라우드 서비스를 많이 사용
클라우드 컴퓨팅에서 제공하는 서비스
- IasS(Infrastructure as a Service) : 서버, 네트워크, 스토리지, 메모리, CPU 등 가상 인프라를 빌려주는 서비스. OS, 미들웨어 등은 사용자가 직접 설치하고 관리하기 때문에 클라우드 서비스 중 가장 덜 의존적.
- PaaS(Pltform as a Service) : 업무에 필요한 소프트웨어를 개발할 수 있는 환경을 클라우드에서 제공
- SasS(Sortware as a Service) : 기업에서 사용하는 소프트웨어를 통째로 클라우드 서비스 사업자에게 빌려쓰는 개념
- FaaS(Function as a Service) : 마이크로서비스의 일환으로 애플리에키션 개발 환경을 제공. 컴퓨팅을 수요에 따라 동적으로 제공. 서버의 존재에 대해 신경쓰지 않아도됨(serverless)
리눅스의 기술적 특징
스와핑(Swapping)
- 프로그램 실행 시 메모리의 공간이 부족하면 가상 메모리를 설정하여 메모리와 하드디스크 사이의 데이터 교환을 통해 새로운 프로그램을 실행시킬 수 있게 한다.
파이프(Pipe)
- 프로세스의 표준 출력을 다른 프로세스의 표준 입력으로 받을 수 있는 프로세스간 통신 방식
리다이렉션(Redirection)
- 프로세스의 표준 입출력을 파일, 화면, 장치 등에서 입출력으로 받을 수 있도록 재 지정할 수 있는 매커니즘
가상콘솔(Virtual Console)
- 하나의 화면에서 여러개의 콘솔을 사용할 수 있는 기능
라이브러리
- 운영체제 관련 기술 중 하드디스크 공간의 효율성을 높여준 기술
동적 라이브러리
- 메모리에 한 번 적재하고 나면 여러 프로세스가 공용으로 사용 가능
- 실행 프로그램 크기가 작고 메모리를 효율적으로 사용 가능
- 실행 속도가 느리고 배포에 제약이 존재
정적 라이브러리
- 실행 프로그램이 컴파일 될 때 링크되어 프로세스가 실행될 때 함께 메모리에 로드
- 실행 속도가 빠르고 배포에 제약이 없음
- 실행 프로그램 크기가 크고 프로세스마다 메모리 적재되어 메모리를 비효율적으로 사용
오픈소스 라이선스(license)
GPL(General Public License)
- 소스코드를 용도에 따라 변경할 수 있음
- 실행 복사본은 소스코드와 함께 판매하거나 소스코드를 무료로 배포해야 한다.
- 변경된 프로그램 역시 소스 코드를 반드시 공개 배포해야 한다.
- 변경된 프로그램 역시 똑같은 라이선스인 GPL 라이선스를 적용해야 한다.
- GPLv1 : 소스 코드를 공개하지 않은 채 바이너리 파일만 배포하는 것을 막기 위해 사람이 이해하기 쉬운 코드를 같이 배포해야한다는 조건이 삽입
- GPLv2 : 특허로 인하여 추가적으로 돈을 지불해야 하거나 소스 코드의 공개가 불가능하여 실행 바이너리 프로그램만 배포할 경우에 소스 코드 뿐 아니라 실행 바이너리 프로그램까지 배포할 수 없도록 보완하였다
- GPLv3 : 소프트웨어 특허 대처법, 다른 라이선스와의 호환성, 원시 코드 구성 부분, 디지털 제한 권리 관련 내용 추가
LGPL(Lesser GPL)
- 자유 소프트웨어 뿐 아니라 독점 소프트웨어에서도 사용 가능
- 소스코드 수정 시 라이브러리의 소스코드 제공해야 함
- GPL 라이선스의 강력한 카피레프트 조건과 단순한 사용 허가를 위한 절충안
- 자유 소프트웨어 뿐 아니라 독점 소프트웨어도 사용 가능하다.
BSD(Berkeley Software Distribution)
- 공개 소프트웨어 라이선스
- 누구나 개작할 수 있고 수정한 것을 제한 없이 배포할 수 있다.
- 수정본의 재배포는 의무사항이 아님. 2차적 파생물에 대한 원시 소스 코드의 비공개 허용
- 소스코드를 공개하지 않는 상용 소프트웨어에서도 사용 가능
- 수정된 소스 코드에 대한 공개나 어떠한 표시도 하지 않아도 된다
MPL(Mozilla Public License)
- BSD + GPL
- 오픈 소스와 자유 소프트웨어 라이선스이다.
- 수정한 소스코드에 대해 공개 의무가 있다.
- MPL 소스 코드와 다른 코드를 결합해서 만들면 MPL 코드를 제외한 다른 소스 코드는 공개하지 않아도 된다
- Firefox, mozilla application suite, mozilla thunderbird
Apache
- 누구든 자유롭게 아파치 소프트웨어를 다운 받아 부분 혹은 전체를 개인적 또는 상업적 목적으로 이용할 수 있다.
- 재배포 시에도 소스 코드나 수정한 소스 코드를 포함하여 공개할 필요가 없다
- 재배포 경우 아파치 라이선스 2.0 포함시키고 아파치에서 개발된 소프트웨어임을 밝혀야 한다
- Apache HTTP Server, Hadoop, Hbase, Tomcat 등
MIT (Massachusetts Institute of Technology)
- 라이선스와 저작권 관련 명시만 지켜주면 됨
- 소프트웨어를 누구나 개작할 수 있고, 수정본의 재배포 시 소스코드 비공개 가능
- X window system, jquery, node.js, rudy on rails
리눅스 배포판
SLS
- 최초 리눅스 배포판
슬랙웨어(Slackware)
- SuSE, Porteus, Vector Linux, Salix OS
데비안(Debian)
- dpkg 및 apt 라는 독자적인 패키지 관리 도구를 사용함
- Knoppix, Corel, Lindows, Ubuntu, Linux Mint, Elementary OS , Kali Linux, BackTrack
레드햇(Red Hat)
- RPM 및 YUM 패키지 관리 도구를 제공함
- RHEL(Red Hat Enterprise Linux), CentOS, Fedora, Oracle Linux, Scientific Linux, Asianux, Mandriva Linux, Mandrake 등이 있다.
시그널(signal)
특정 키가 들어왔을 때 인터럽트가 발생하여 운영체제가 프로그램을 제지한다.https://jhnyang.tistory.com/143
시그널 이름 | 발생 및 용도 |
SIGHUP(HUP) | hangup 시그널; 전화선 끊어짐 접속이 끊겼을 때 보내지는 시그널 데몬 관련 환경 설정 파일을 변경시키고, 변화된 내용을 적용하기 위해 재 시작할 때 사용됨 |
SIGINT(INT) | interrupt 시그널; Ctrl + C; 실행을 중지 키보드로 부터 오는 인터럽트 시그널로 실행을 중지시킴 |
SIGQUIT(QUIT) | quit 시그널; Ctrl + \ 사용자가 터미널에서 종료키를 누를 때 |
SIGKILL(KILL) | 무조건 즉시 중지 |
SIGTREAM(TREAM) | KILL 시그널이 전송되기 전에 전송 잡히는 시그널이기 때문에 종료되는 것을 트랙할 수 있음 |
SIGTSTP(TSTP) | Ctrl + z 실행 정지 후 다시 실행하기 위해 대기시키는 시그널 SIGCONT로 재 실행 가능 |
SIGSTOP(STOP) | 터미널에서 입력된 정지 시그널 SIGCONT로 재 실행 가능 |
SIGCONT(CONT) | Continue 의 약자 SIGSTOP 에 의해 정지된 프로세스를 다시 실행시킬 때 사용 |
X 윈도
X윈도란
- 네트워크 프로토콜에 기반한 그래픽 사용자 인터페이스 환경
- 원격지의 X클라이언트를 다른 시스템의 X 서버에서 실행시킬 수 있다.
- 디스플레이 장치에 의존적이지 않고 서로 다른 기종을 함께 사용할 수 있다.
- 현재 리눅스를 비롯하여 유닉스 대부분이 X.org 기반의 X윈도 시스템을 사용하고 있다.
구조
- 클라이언트/서버 구조로 되어 있고, 서로간의 통신을 위해 X Protocol 을 사용한다.
- X 서버는 그래픽하게 보여주는 하나의 시스템이다.
- X 클라이언트는 X 서버 위에 동작하는 일종의 응용 프로그램이다.
- X 윈도는 기본 구조가 네트워크 기반이기 때문에 로컬의 사용자가 키보드나 마우스로 입력하면 TCP 포트 6000번을 통해 전달되고, 관련 X 클라이언트 프로그램이 실행된다.
- /tmp/.X11-unix/X0 라는 Unix Domain Socket을 이용하여 X서버와 X클라이언트가 통신한다.
- 로컬 시스템뿐 아니라 원격의 호스트 간에도 응용 프로그램을 주고받을 수 있다.
설치
- 관련 패키지 그룹 검색
# yum group list
- 설치 가능한 데스크톱 목록 확인 후 설치
# yum group install 'GNOME Desktop' 'KDE Plasma Workspaces' 'Server with GUI'
실행
- 부팅 시 X 윈도를 실행하는 방법 (graphical.target)
- 텍스트 모드에서 실행하는 방법 (multi-user.target)
#systemctl get-default
#systemctl set-default TARGET_NAME
startx
- X 윈도를 실행시키는 스크립트. 최종적으로 xinit을 호출한다.
# startx -- -depth 8 → 256 color 모드로 X 윈도를 실행시킨다.
# startx -- -depth 16 → 하이컬러(16비트) 모드로 X 윈도를 실행시킨다.
# startx -- :1 → 두 번째 X 윈도를 실행시킨다. CentOS 7 버전에서는 특별한 옵션 없이 startx 라고 입력해도 된다.
설정변경
- xrandr : 명령행에서 화면 크기 및 방향 등을 확인 및 변경하는 명령
# xrandr → 현재 화면의 크기 정보를 출력한다.
# xrandr -s 1024*768 → 화면의 크기(해상도)를 1024*768 로 변경한다.
i-node (index-node)
i-node란
-리눅스 전용 특수 index
- 전통적인 유닉스 계열 파일시스템에서 사용하는 일종의 자료 구조로 각각의 파일은 하나의 i-node를 할당받아 관리된다.
fsck (filesystem check)
fsck란
- 파일을 검사하거나 수리해주는 명령어
저널링 파일 시스템 (Journaling File System)
저널링 파일 시스템이란
- 백업 및 복구 능력이 있는 FS(File System)
- 기존 fsck 에 걸리는 시간을 단축하기 위해 데이터를 디스크에 쓰기 전에 로그에 데이터를 남겨 시스템의 비정상적인 종료에도 로그를 사용해 fsck 보다 빠르고 안정적인 복구기능을 제공한다.
RAID 종류
RAID 0(Stripe)
- 두개 이상 디스크로 구성
- 데이터를 나누어 저장하지만 중복 저장하지 않아 복구될 수 없음
RAID 1(Mirroring)
- 여러 디스크에 데이터를 완전히 복사하여 저장하는 방식
- 디스크 장애 발생 시 복구가 가능하지만 비용이 많이 든다.
RAID 2(Hamming Code ECC)
- Hamming Code 를 이용하여 오류를 복구한다
- 별도의 디스크에 복구를 위한 ECC(Error Correction Code) 를 저장한다
RAID 3(Parity ECC)
- Parity 정보를 별도 디스크에 저장한다
- 1개의 디스크에 장애 발생 시 Parity 를 통해 복구가 가능하다
- Parity 계산을 해야하며, 별도 디스크에 Parity 를 저장해야하기 때문에 Write 성능이 저하된다
RAID 4(Parity ECC)
- Parity 정보를 별도 디스크에 저장한다
- 데이터는 데이터 디스크에 분산하여 저장한다
- 한 개의 디스크에 장애 발생 시 Parity 를 통해 복구 가능하다
- RAID 3과 동일하나 Parity 를 Block 단위로 관리하는 부분에 차이가 있다
- 10GB 용량의 하드디스크 4개를 이용해서 RAID-5 를 구성했을 경우 실제 사용 가능한 용량은 30GB 이다
RAID 5
- Parity 를 분산하여 데이터 디스크에 저장한다
- 안정성이 크게 향상된 버전이다
- 최소 3개 이상의 디스크로 구성해야 한다
- Parity 는 중복 저장하지 않는다
- 쓰기 작업이 많지 않은 다중 사용자 시스템에 적합하다
- RAID-0 의 단점인 결합 허용을 지원하지 않는 점과 RAID-1 의 저장 공간의 비효율성을 보완한 레벨로 디스크의 개수를 늘릴수록 저장공간의 효율성이 좋아진다
RAID 6
- 분산 Parity 가 적용된 RAID 5 의 안전성 향상을 위해 Parity 를 여러개로 나누어 저장한다
- 장애가 여러 디스크에 발생되더라도 정상동작된다
- 두개의 패리티를 사용하여 두개의 디스크 오류에도 데이터를 읽을 수 있고 최소 네개의 디스크로 구성해야 한다
- 200GB 하드디스크 8개를 RAID-6 로 구성할 경우 가용 공간은 1.2TB 이다
RAID 10(1+0)
- 하드디스크 4개를 이용해서 디스크 2개를 먼저 미러링(mirroring)으로 구성하고 다시 스트라이핑(striping)하는 방식으로 구성하는 형태
서브넷마스크
개요
- 네트워크를 분할하여 새로운 하위의 네트워크를 구성할 때 사용
- 서브넷마스크 주소값을 255.255.255.0(==192.168.3.12/24) 로 설정하면 256개의 주소에서 2개는 네트워크 주소와 브로드캐스트 주소로 할당되어 실제 사용할 수 있는 주소는 254 개가 된다
- Q. C 클래스에 속한 한개의 네트워크를 할당 받은 상태이다. 이 네트워크 대역을 사용하는 부서가 4 곳이라 4개의 서브넷을 구성하려고 한다
A. 255.255.255.192
httpd.conf
개념
- 아파치 웹 서버의 기본적인 설정을 담당하는 파일
설정 파일 내부에서의 문법
- ServerRoot "/etc/httpd" : 웹 서버가 설치된 디렉터리를 나타낸다.
- ServerAdmin "root@mail.com"
- ServerName "www.httpd.com:80"
- DocumentRoot "/etc/httpd" : 웹 문서가 위치하는 디렉터리를 나타낸다.
userdir
-userdir의 주 환경 설정 파일을 설정해줘야한다.
- 아파치 웹 서버의 환경 설정 파일에서 일반 사용자의 웹 문서가 위치하는 디렉터리를 변경할 때 사용하는 항목
- 아파치 서버 사용자들이 외부에 공개하고자 하는 html 문서들을 저장하기 위한 용도
-/etc/httpd/conf.d/userdir.conf (환경설정파일)
- userdir.conf 파일을 이용하여 특정 사용자의 userdir 디렉토리 사용여부를 허용 및 거부 가능
- Q. 아파치 2.2 버전을 소스 파일로 설치하여 웹 서버를 운영 중이다. ihduser 사용자가 개인 홈페이지를 운영할 수 있도록 관련 디렉터리 명을 알려달라고 요청했다. -> 이 설명에 해당하는 관련 파일명과 항목은? httpd-userdir.conf / UserDir
AddType
- httpd.conf 파일에 php 확장자를 가진 파일을 해석할 수 있도록 설정하는 과정
- 예) AddType application/x-httpd-php .php .html .htm .php5
- 예) AddType application/x-httpd-php-source .phps
프로세스
정의
- CPU 와 메모리를 할당받아 실행 중인 프로그램
- 프로세스들마다 고유의 프로세스 ID, 즉 PID 를 할당받는다.
포어그라운드 프로세스 (Foreground Process)
- 사용자와 상호작용하는 프로세스
- 터미널에 직접 연결되어 입출력을 주고 받는 프로세스
- 명령 입력 후 수행 종료까지 기다려야 함
- 화면에서 실행되는 것이 보임
- fg %작업번호
백그라운드 프로세스(Background Process)
- 사용자와 직접적인 대화를 하지 않고 뒤에서 실행되는 프로세스
- 최상위 프로세스 init (PID : 1)
- 사용자의 입력에 관계없이 실행되는 프로세스
- 실행은 되지만 화면에 나타나지 않고 실행됨
- bg %작업번호&
데몬 (Demon)
- 리눅스 시스템 부팅 시 자동으로 실행되는 백그라운드 프로세스
- 대기하다가 사용자의 요청이 오면 즉시 실행
- 사용자들은 이 프로세스들을 볼 수 없음
- standalone : 데몬이 백그라운드에서 상시 대기하여 바로 요청처리, 요청 시 바로 고속처리, 시스템 자원 많이 사용
보통 부팅 시 실행되어 해당 프로세스가 메모리에 계속 상주하면서 클라이언트의 요청을 처리하는 방식. 웹, 메일 등과 같이 빈번한 요청이 들어오는 서비스인 경우 이 방식으로 작동
/etc/init.d 의 스크립트 파일로 관리
sendmail, apache, mysql, name server, nfs 등의 서비스가 사용
- ineted : inetd 의 확장 데몬인 xinetd 의 요청이 있을 때만 작동, 외부의 요청 시에만 저속으로 동작, 리소스 소모가 적음
- fork : 새로운 프로세스를 만들 때 기존 프로세스를 복제, 새로운 프로세스를 위한 메모리 할당, 원본=부모, 복제=자식
- exec : 호출하는 프로세스가 새로운 프로세스로 변경, 새로운 프로세스를 위한 메모리 할당 없음, 호출한 프로세스의 메모리에 새로운 프로세스의 코드 덮어씌움
데몬 관련 유틸리티
1. ntsysv : 텍스트 환경에서 커서를 이용하여 부팅 중 자동으로 실행되는 서비스를 설정할 수 있는 유틸리티
2. chkconfig : 텍스트 기반의 명령형 프로그램. 실행 레벨에 따른 서비스의 on/off 설정 리스트를 출력하거나 설정한다
3. 기타 유틸리티 : X 윈도를 사용하는 경우 명령행에서 system-config-services 라고 입력하면 GUI 기반의 유틸리티 이용하여 설정 가능
부팅 관련 설정 파일
개요
- 리눅스 시스템 부팅 시 가장 먼저 실행되는 프로세스는 init 프로세스이다
- init 프로세스가 /etc/init 안에 있는 설정 파일들을 참조하여 부팅을 관정한다
관련 설정 파일 (실행 순서대로)
1. /etc/inittab : 부팅과 관련된 run level 이 정의되어 있다
2. /etc/init/rcS.conf : 시스템 초기화(system initialization) 과 관련된 설정이 있다. 주요 내용으로는 /etc/rc.d/rc.sysinit 스크립트를 실행하는데 호스트명 설정, 시스템 점검, RAID 및 LVM 장치 활성화, 쿼터 설정 활성화 등을 한다
3. /etc/init/rc.conf : 부팅 시 각 레벨별로 진행되는 내용이 설정된 파일. 주요 내용으로는 /etc/rc.d/rc 스크립트 실행. 이 rc 스크립트는 런 레벨이 3이면 /etc/rc.d/rc3.d 디렉터리 안에 들어있는 실행 데몬스크립트들 중에서 S 로 시작되는 스크립트를 찾아서 부팅 시 실행되도록 한다
4. /etc/rc.d/rc.local : 실행 레벨 2,3,5 에서 가장 마지막에 실행되는 파일. 사용자가 부팅 시 필요한 서비스를 구동할 때 이 파일 안에 등록하여 사용한다
프로세스 관련 명령어
top
- 동작중인 프로세스의 상태를 실시간으로 화면에 출력해주는 명령
- 프로세스의 상태뿐만 아니라 CPU, 메모리, 부하 상태 등도 확인 가능
# top -d 2 -p 1222 → PID 값이 1222인 프로세스를 2초 간격으로 관련 정보를 출력
# top -bn 3 > top.log → top 명령을 배치 모드로 3회 실행하여 top.log 파일에 저장
kill
- 프로세스에 특정한 시그널을 보내는 명령
- 옵션 없이 실행하면 프로세스에 종료 신호 (15, TERM , SIGTERM ) 를 보냄
- PID 사용
# kill -l → 시그널 종류 출력
# kill 724 # kill -15 724 # kill -TERM 724 # kill -s -SIGTERM 724
# kill -HUB 10118 # kill -1 10118 → pid 가 10118 인 프로세스를 재시작
# kill %2 → 작업 번호가 2인 프로세스를 종료시킴
killall
- 같은 데몬의 여러 프로세스를 한 번에 종료시킬 때 사용하는 명령
- 프로세스 명 사용
- 시그널을 지정하지 않으면 종료 시그널 ( TERM , SIGTERM ) 이 전송됨
# killall httpd → Apache 웹 서버 데몬인 httpd 를 모두 종료
# killall -HUP httpd → httpd 데몬을 다시 실행시킴. 주 데몬이 아닌 웹 서비스 요청 시 연결을 담당하는 httpd 의 프로세스들이 재시작 됨
# killall -v -9 httpd → httpd 데몬에 9번 시그널(SIGKILL, KILL)을 전송하고, 전송 결과 출력
# killall -9 -u posein → posein 사용자의 모든 프로세스를 강제로 종료
pkill
- 프로세스 명 사용
jobs
- 백그라운드 실행중인 프로세스나 현재 중지된 프로세스의 목록을 출력해주는 명령
# jobs → 백그라운드 프로세스 출력
# jobs -l → 프로세스 번호를 추가하여 출력
fg
- 백그라운드 프로세스를 포어그라운드 프로세스로 전환하는 명령
# fg → 백그라운드로 수행중인 작업을 포어그라운드로 전환. 만약 여러 개인 경우 가장 최근에 수행한 작업 (보통 + 기호가 붙어있는 작업)을 포어그라운드로 전환
# fg %2 # fg 2 → 작업 번호가 2번인 프로세스를 포어그라운드로 전환.
nice
- 프로세스 명 사용
사용자 정보 관리, 그룹 관리 파일
/etc/passwd 필드 구성
- 사용자 이름 : 암호 : 사용자 ID : 사용자가 속한 그룹 ID : 전체이름(default:사용자 이름) : 사용자의 홈 디렉터리 : 기본 셀
/etc/group 필드 구성
- 그룹 이름 : 비밀번호 : 그룹 ID : 그룹에 속한 사용자 이름
/etc/skel 디렉토리
- 리눅스 운영체제에서 새로운 사용자를 생성하였을 경우, 새 사용자를 위한 기본 폴더를 참고하는 디렉토리
시스템 정보 확인
uname 명령어
- 시스템의 이름, 사용 중인 운영체제와 버전, 호스트명, 하드웨어 정보 등을 확인할 수 있다.
- -a : 모든 옵션에 대한 정보 출력
- -i : 시스템의 하드웨어 플랫폼정보 출력 (hardware-platform)
- -m : 시스템의 하드웨어타입정보 출력 (machine)
- -n : 네트웍노드 호스트 이름에 대한 정보 출력 (nodename)
- -o : 운영체제정보 출력 (operation-system)
- -p : 프로세스 정보 출력 (processor)
- -r : 운영체제 배포버전 출력 (kernel-release)
- -s : 커널이름 출력 (kernel-name)
- -v : 커널 버전정보 출력 (kernel-version)
모듈
커널에 탑재되는 모듈 관련 디렉토리 경로
- /lib/modules/kernel-version/kernel
- uname -r 명령어를 사용하여 현재 사용하고 있는 커널 모듈 확인 가능
lsmod | 시스템에 설치된 모듈 리스트 확인 |
modprobe | 모듈을 관리하는 명령어 /etc/modprobe.conf, /etc/modprove.d : 부팅 시 특정 모듈을 자동으로 적재할 때 사용 -l : 모든 모듈 목록 출력, -r : 모듈 제거, -c : 모듈 관련 환경설정 파일 내용 출력 |
modinfo | 모듈 정보 조회 |
insmod | 모듈 설치 |
rmmod | 모듈 삭제 |
depmod | 모듈 간 의존성이 기록된 파일의 정보를 갱신 의존성이 변경되면 modules.dep 파일의 내용 변경 |
make modules | 커널 컴파일 과정에서 선택한 모듈을 생성 |
make modules_install | 커널 컴파일 과정에서 생성한 모듈을 설치 |
make mrproper | 이전 컴파일 시 설정되었던 설정 정보 제거 및 초기화 |
make distclean | mrproper 명령 수행 후, 추가로 커널 컴파일 후 생성된 모든 오브젝트 파일, 백업 파일 등 삭제 제거 명령어 중 가장 강력한 명령어 |
make menuconfig | 텍스트 메뉴 기반에서 커서를 이용하여 커널 컴파일 관련 옵션 설정 작업 |
프린터
LPRng
- BSD 계열 유닉스에서 사용
- 프린터 스풀링과 네트워크 프린터 지원
- 설정 파일 : /etc/printcap
CUPS
- 애플이 개발한 오픈 소스 프린팅 시스템
- 유닉스 계열에서 사용하기 위해 개발
- IPP (internet printing protocol) 를 사용하여 웹 기반으로 제어
- 환경설정 디렉토리 : /etc/cups
프린터 관련 명령어
BSD 계열
- lpr : 프린터 출력
- lprm : local printer remove, 프린터 큐에 대기 중인 작업 삭제, 취소할 프린트 작업 번호를 명시하지만 생략되었다면 가장 마지막 작업 취소
- lpq : 큐에 있는 작업 목록 출력
- lpc : 프린터 제어
System V 계열
- lp : 프린터 출력
- cancel : 취소, 무조건 작업 번호 붙여줘야 함
- lpstat : 작업 번호 확인, 프린트 직업의 Request-ID 확인
프린터를 지원해주는 인쇄 시스템
- LPRng : 프린터 스풀링과 네트워크 프린터서버를 지원하며 프린터에 관련된 명령어로는 BSD, system V 계열 모두 지원한다.
- CUPS : 애플이 오픈 소스 프린팅 시스템으로 개발한 CUPS 는 다양한 기능을 가지고 있고, BSD 계열과 system V 계열 모두사용가능하고, 사용자 및 호스트 기반의 인증을 제공한다. 로컬에 직접 연결한 프린터를 네트워크 프린터처럼 설정 가능하다.
사운드 카드
OSS (Open Sound System)
- 유닉스 계열 운영체제에서 사운드 카드를 제어하는 인터페이스 - 현재 'ALSA' 로 대체 - 표준 유닉스 장치(POSIX) 에 기반한 인터페이스
ALSA (Advanced Linux Sound Architecture)
- GPL 및 LGPL 라이선스 기반으로 배포 - 사운드 카드를 자동으로 구성 - 환경 설정 파일 : /etc/asound.state
스캐너
SANE (Scanner Access Now Easy)
- GPL, 유닉스, OS2, Window 운영체제 지원
XSANE (X based inerface for the SANE)
- X-Windows 기반의 스캐너 프로그램
- GTK+ 라이브러리로 만들어짐
- xsane 명령어로 실행
- GPS, 유닉스, OS2, Windows 운영체제 지원
스캐너 명령어
- sane-find-scanner : SANE 백엔드 건색
- scanimage : 이미지 스캔 제어
- scanadf : 자동용지지급장치가 장작된 스캐너에서 스캔할 때 사용하는 명령어
명령어
edquota
- 사용자나 그룹에 쿼터를 설정할 때 사용하는 명령
- 실행시키면 vi 편집기가 실행됨
- 기본 단위 : KB
/etc/fstab
/etc/fstab 에 들어가면 필드가 6가지 주어진다.
<file system> <mount pint> <type> <options> <dump> <pass>
/dev/fd0 /media/floppy0 auto0 rw,user,noauto,exec,utf8 0 0
<options>
- usrquota : 사용자 할당량 사용
셸
개요
- 커널과 사용자간의 다리역할을 함
- 사용자로부터 명령을 받아 해석하고 프로그램 실행
- 사용자가 시스템에 로그인을 하게 되면 각 사용자에게 설정된 셸이 부여되면서 다양한 명령을 할 수 있다. 즉, 사용자에게 셸을 부여하지 않으면 로그인하더라도 명령을 수행할 수 없다
- bash, ksh, tcsh, zsc. bash 가 표준
주요 셸 특징
- Bourne Shell
- bash : GNU 프로젝트 위해 개잘. 현재 리눅스 표준 셸. bash 의 명령어 문법은 sh 와 호환되고, ksh 와 csh 의 유용한 기능을 참고하여 명령 히스토리, 명령어 완성 기능, 히스토리 치환, 명령행 편집 등 지원. POSIX 와 호환
- C 셸 : C 언어 기반. 강력한 프로그램 작성 기능. 히스토리 기능, 별명 기능, 작업 제어 등. 명령행 편집 기능은 지원하지 않음
- tcsh : TENEX 라는 운영체제에 명령행 완성 기능을 반영. C 셸과 통합하여 생김. csh 의 기본 기능에 명령어 완성 기능, 명령행 편집 기능 등.
- ksh : 본 셸 확장. C 셸의 많은 기능 추가. 작업 제어, 앨리어스, 히스토리, Vi 및 Emacs 스타일의 명령행 편집 기능, 명령행 완성 기능 제공
- dash : POSIX 와 호환되는 /bin/sh 를 가능한 작게 구현. 빠른 작업 수행이 특징. 현재 데이반 및 우분투 계열 리눅스의 기본 셸. 소스 크기 작고 처리 속도 빠름. history 명령 지원하지 않음
셸 확인과 변경
셸 확인
- 명령 프롬프트 상에서 'echo $SHELL' 라고 실행
- 다른 셸을 사용하기 위해 변경 가능한 셸의 확인은 'chsh -l' 또는 'cat /etc/shells' 명령어로 확인
셸의 변경
- 시스템에 로그인 한 뒤 'chsh' 명령 입력하면 사용자 암호 물어봄.
- 암호를 입력한 후 변경하려는 셸을 절대 경로로 입력하여 변경
- 변경한 셸의 적용은 다음 로그인부터 유효
- 명령행에서 /bin/csh 와 같이 실행하여 셸을 변경할 수 있음
- 기본 bash 셸에서 fork 되어 추가로 프로세스 발생. 이 경우 변경된 셸 확인은 ps 명령으로 가능하고, exit 입력하면 기본 셸인 bash 로 돌아간다.
사용자 로그인 셸 정보 확인
- /etc/passwd 7번째 필드에 기록
관련 명령어 : chsh
- 사용자 로그인 변경하는 명령어
[주요옵션]
-s : 변경하고자 하는 셸 명시 (--shell)
-l : 사용 가능한 셸의 목록 정보 출력. /etc/shells 파일 내용 출력 (--list-shells)
-u : chsh 명령어 사용법 출력 (--help)
-v : 설치한 패키지 버전 정보 출력 (--version)
[사용 예]
$ chsh -l
- 사용 가능한 셸의 목록 정보가 기록되어 있는 /etc/shells 파일 내용 출력 :
- chsh 만 입력하면 로그인한 사용자 셸 변경
[root@www ~]# chsh posein
- posein 사용자의 셸 변경
[posein@www ~]$ chsh -s /bin/csh
- 로그인 셸을 csh 로 변경
셸 변수와 환경 변수
셸 변수
- 특정한 셸에서만 적용되는 변수
- 리눅스에서는 명령행에서 '변수명=값' 형태로 지정하여 사용 가능
- 변수값 출력 시 변수명 앞에 $ 을 붙이고 echo 명령으로 확인 가능
- 선언된 셸 변수를 전부 확인하려면 set 명령 사용
$ city=daejeon
$ echo $city
---daejeon
환경 변수
- 프롬포트 변경, PATH 변경 등 과 같이 셸의 환경을 정의하는 중요한 역할을 수행하는 변수
- 미리 예약된 변수명 사용
- bash 에서는 PATH, SHELL 등과 같이 대문자로 된 변수로 구성
- 현재 설정된 전체 환경 변수의 값은 env 명령으로 확인 가능
주요 환경 변수
HOME : 사용자 홈 디렉터리
PATH : 실행 파일을 찾는 디렉터리 경로
LANG : 셸 사용 시 기본으로 지원되는 언어
TERM : 로그인한 터미널 종류
PWD : 사용자의 현재 작업 디렉터리
SHELL : 사용자의 로그인 셸
USER : 사용자의 이름
DISPLAY : X 윈도에서 프로그램 실행 시 출력되는 창
PS1 : 프롬프트(Prompt) 변수
PS2 : 2차 프롬프트 변수
HISTFILE : 히스토리 파일의 절대 경로
HISTSIZE : 히스토리 파일에 저장되는 명령어의 개수(줄 기준)
HISTFILESIZE : 히스토리 파일의 파일 크기
HOSTNAME : 시스템의 호스트명
MAIL : 도착한 메일이 저장되는 경로
TMOUT : 사용자가 로그인한 후 일정 시간동안 작업을 하지 않을 경우 로그아웃시키는 시간 (second)
UID : 사용자의 UID
환경 변수의 사용 및 변경
- 환경 변수를 사용하여 각 사용자 고유의 셸 환경을 구축할 수 있고, 명령어와 결합하여 이용할 수 있다.
[사용 예]
$ mkdir $HOME/data
- 해당 사용자 홈 디렉터리 안에 data 라는 디렉터리를 만든다
$ echo $LANG
- 현재 설정된 언어를 확인한다
$ LANG=C
- 현재 언어를 영어로 변경한다
[posein@localhost ~]$ echo $PS1
[\u@\h \W]\$
[posein@localhost ~]$ PS1="[\u@\t \W]\$ "
- 설정된 프롬프트 확인 후 변경
[주요 프롬프트 형식]
\d : '요일 월 일' 형태로 날짜 표시 ( Wed Jan 15)
\h : 호스트 이름 표시
\s : 사용 중인 셸 이름 표시
\t : 24시 형태의 현재시간 표시 (HH:MM:SS)
\T : 12시 형태의 현재시간 표시 (HH:MM:SS)
\@ : 12시 형태의 현재 시간에 AM/PM을 추가로 표시
\u : 현재 사용자의 이름 표시
\w : 현재 작업 디렉터리를 절대 경로로 표시
\W : 현재 작업 디렉터리 중 마지막 디렉터리만 표시
\! : 현재 명령의 히스토리 넘버를 보여줌
\\ : \ 표시
bash 의 주요 기능
명령행 완성 기능
명령어 history 기능
- history 명령은 ! 로 대체하여 사용할 수 있다.
!! : 마지막에 사용한 명령 실행
!n : n번째 사용한 명령 실행
!-n : 사용한 명령 목록을 역으로 세어서 n번째 명령 실행
!문자열 : 가장 최근에 사용한 명령 중 문자열로 시작하는 명령을 찾아서 실행
!?문자열? : 가장 최근에 사용한 명령 중 문자열을 포함하고 있는 명령을 찾아서 실행
^문자열1^문자열2 : 마지막에 사용한 명령문의 '문자열1'을 '문자열2'로 대체한 후 실행
[히스토리 관련 환경 변수]
HISTSIZE : 히스토리 스택의 크기가 지정되어 있는 변수로 단위는 명령의 개수이다. 이 변수에 지정한 값만큼만 history 명령 실행 시에 출력되고, 방향키로 검색했을 경우에도 이 값 내에서만 가능
HISTFILESIZE : 실질적은 히스토리 파일의 크기
HISTFILE : 히스토리 파일의 위치를 보여준다
HISTCONTROL : 중복되어지는 명령에 대한 기록 유무를 지정하는 변수
HISTTIMEFORMAT : history 명령 실행 시 출력되는 시간 형식 지정 시 사용
[환경변수 사용 예]
$ export HISTCONTROL=ignoredups
- 연속적으로 중복된 명령은 히스토리에 저장하지 않는다. CentOS 7 에는 기본 적용 되어 있음
[posein@localhost ~]$ echo $HISTFILE
/home/posein/ .bash_history
[posein@localhost ~]$ HISTSIZE=10
- 히스토리 파일 위치 확인 후 히스토리 파일 스택크기를 10 으로 지정
$ export HISTTIMEFORMAT="%Y.%m.%d %T"
- history 명령 실행 시 출력되는 날짜 형식 변경
%Y.%m.%d %T | 2022.08.17 22:10:10 |
%F | %Y-%m-%d |
%T | %H:%M:%S |
[관련 파일 : .bash_history]
- 사용자의 홈 디렉터리 내에 존재하면서 사용자들이 입력했던 명령들이 기록되는 파일
- 파일명이 '.' 으로 시작되어 숨겨진 파일 형태로 존재하고, 현재 로그인해서 내린 명령들은 로그아웃할 때 기록되므로 다음 번 로그인 시 확인 가능
[ctrl + r] : 검색할 수 있는 명령 프롬프트가 나타남. 특정한 문자를 입력하면 가장 최근에 그 문자로 수행한 명령 보여줌
[esc 후 .] : 최근 사용된 인자를 명령행에 붙여준다. 한번 실행할 때마다 하나씩 역으로 호출
[alt + .] : alt와 .키를 계속 누르고 있으면 최근 사용된 인자를 하나씩 호출
alias 기능
$ alias 나만의명령어='기존 명령어 조합'
- alias 지정
$ unalias 지정한_명령어
- alias 해제
$ alias ls='ls -alF'
- ls 명령만 실행시켜도 기본으로 -alF 옵션이 지정 (만약ls를 설정해지 하지 않고 일시적으로 실행하려면 $/bin/ls 혹은 $ \ls)
$ alias aaa='ls -alF'
- aaa 라는 명령은 기본적으로 존재하지 않는다. 사용자 고유의 명령어인 aaa를 생성하게 된다. 이 경우 'which aaa' 하게 관련 정보를 출력해준다
$ alias bbb='ls ; pwd'
- bbb 라는 명령을 실행하면 ls 명령을 실행한 뒤 pwd 명령을 실행한다
$ alias c=clear
- c 라는 명령어에 clear 가 실행되도록 설정
$ unalias aaa
- aaa에 설정된 alias 를 해제한다
$ unalias -a
- 설정되어 있는 모든 alias 해제
명령행 편집 기능
ctrl b : 커서를 왼쪽으로 한 칸 이동
ctrl f : 커서를 오른쪽으로 한 칸 이동esc 후 b : 커서를 왼쪽으로 한 단어 이동esc 후 f : 커서를 오른쪽으로 한 단어 이동ctrl a : 맨 왼쪽으로 이동ctrl e : 맨 오른쪽으로 이동ctrl d : 커서 오른쪽 한 글자 삭제esc 후 backspace : 커서 왼쪽 한 단어 삭제esc 후 d : 커서 오른쪽 한 단어 삭제ctrl k : 커서 왼쪽 행 전체 삭제ctrl u : 행 전체 삭제ctrl y : 삭제 취소
명령 대체 또는 명령 치환 기능
- 특정 명령의 결과를 다른 명령어의 인자값으로 사용하는 것- passwd 라는 명령의 허가권을 알기 위해서는 먼저 'which passwd' 라는 명령으로 passwd 명령어의 위치를 찾아내고, 다시 'ls -' 명령을 수행해야 한다. 2번의 명령을 수행하는 대신 ` ` 또는 $( ) 를 이용해서 대체할 수 있다.
[사용예]
[posein@www ~]$ which passwd
/bin/passwd
[posein@www ~]$ ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2022 /bin/passwd
[posein@www ~]$ ls -l `which passwd`
-rwsr-xr-x. 1 root root 27832 Jun 10 2011 /bin/passwd
[posein@www ~]$ ls -l $(which passwd)
-rwsr-xr-x. 1 root root 27832 Jun 10 2022 /bin/passwd
그룹 명령 실행
; : 단순히 한 줄에 여러 명령을 나열하기 위해 사용. 입력한 순서대로 순차처리
|| : 논리적 OR 라 부르며 앞의 명령이 성공이면 결과 출력. 그렇지 않으면 뒤의 명령 실행하여 결과 출력
&& : 논리적 AND 라 부르며 앞의 명령이 성공적으로 수행 되어야만 다음 명령 수행
[사용예]
$ ls ; sleep 10 ; ls
- ls, sleep, ls 명령을 순차적으로 실행
$ clear; aaa ; pwd
- 명령을 순서대로 수행하는데 앞선 명령의 실행 결과에 상관없이 순차적으로 다음 명령 실행. 즉, clear 명령 후에 존재하지 않는 aaa 명령을 실행하고 pwd 명령을 실행한다
$ ls ; find / -type d > list.txt
- find / -type d 명령의 결과를 list.txt파일로 저장한다
$ (ls ; find / -type d) > list.txt
- ls 및 find 명령의 결과 모두를 list.txt 파일로 저장
$ pwd ; ( cd / ; pwd ) ; pwd
- () 기호를 이용하여 그룹 명령을 실행한 후 원래 상태로 전환
[posein@www ~]$ grep zzang /etc/passwd || echo "No zzang"
No zzang
[posein@www ~]$ grep posein /etc/passwd || echo "No posein"
posein:x:1000:1000:posein: /home/posein:/bin/bash
- 첫 번째 명령에서는 zzang 이라는 계정이 없으므로 뒤의 명령이 실행되고, 두 번째 명령은 posein 이라는 계정이 존재하여 앞의 명령 결과만 출력
[posein@localhost data]$ ls
lin.txt
[posein@localhost data]$ mv lin.txt joon.txt && ls
joon.txt
[posein@localhost data]$ mv lin.txt joon.txt && ls
mv: cannot stat 'lin.txt' : No such file or directory
- 첫 번째 mv 명령은 파일이 존재하지 않으므로 이름을 변경한 후 ls 명령이 실행되고, 두 번째 mv 명령은 lin.txt 파일이 존재하지 않으므로 에러 메시지 출력되며 끝남
표준 입출력 제어 기능
개요
- 리눅스에서는 표준 입력과 표준 출력이라는 이름의 데이터 흐름을 사용한다
- 입력장치 : 키보드, 파일, 스캐너 등
- 출력장치 : 모니터, 프린터, 파일 등
표준 입출력 종류
- 표준 입력 : 입력을 담당하는 기보드. 약어로 stdin. 숫자값 : 0
- 표준 출력 : 명령의 결과값이 보여지는 화면. 약어로 stdout. 숫자값 : 1 (생략 가능)
- 표준 에러 : 에러값이 보여지는 화면. 약어로 stderr. 숫자값 : 2
[사용예]
[posein@localhost ~]$ abc
bash: abc: command not found...
[posein@localhost ~]$ abc 2>/dev/null
- 존재하지 않는 명령을 입력하면 오류 메시지를 확인할 수 있지만, 숫자 2 와 리다이렉션 기호를 사용하면 오류 메시지를 없앨 수 있다
리다이렉션
개요
- 어떤 프로세스의 입/출력을 표준 입출력이 아닌 다른 입출력으로 변경할 때 사용
- 출력 결과 파일로 저장하거나 파일의 내용을 프로세스의 입력으로 사용하는 기법
[리다이렉션의 종류]
> | 프로세스의 출력을 표준 출력에서 다른 출력으로 변경한다 |
>> | 프로세스의 출력을 지정한 출력(보통 파일)에 추가한다 |
< | 프로세스의 입력을 표준 입력에서 다른 입력으로 변경한다 |
<< | 기호 뒤에 지정한 문자열을 입력으로 받아 해당 문자열이 나오기 전까지를 표준 입력을 삼아 해당 내용을 출력한다 |
[사용예]
$ cat > tmp.txt
- 표준 입력인 키보드로 입력한 내용을 tmp.txt 파일에 저장한다. 키보드로 내용을 입력한 뒤 ctrl + d 를 누르면 종료된다
$ cat >> tmp.txt
- 키보드 입력한 내용을 tmp.txt 파일의 뒷부분에 덧붙인다. 만약 tmp.txt 파일이 존재하지 않으면 새로운 파일을 생성한다
$ wc < tmp.txt
- tmp.txt 파일의 내용을 wc 의 입력으로 사용한다. cat tmp.txt | wc 와 같고, < 은 생략 가능하다
$ mail posein < abc.txt
- posein 이라는 사용자에게 미리 작성된 abc.txt 내용을 메일로 보낸다
[posein@localhost ~]$ cat << end
> I love linux
> I love windows
> end
I love linux
I love windows
- end 라는 문자열이 나오기 전까지를 표준 입력으로 삼아 출력한다
[응용예]
$ find / -name '*.txt'
- 결과값과 에러를 모두 화면(표준 출력)에 보여준다
$ find / -name '*.txt' 2>/dev/null
- 결과값은 화면에 보여주고, 에러는 화면에 출력하지 않고 버린다
$ find / -name '*.txt' >list.txt
- 결과값(1)은 list.txt 파일에 저장하고 에러는 화면에 출력한다. 참고로 find / -name '*.txt' 1>list.txt 와 같다
$ find / -name '*.txt' 2>/dev/null > list.txt
- 결과값은 list.txt 파일에 저장하고 에러는 화면에 출력하지 않고 버린다
$ find / -name '*.txt' 2>error.txt
- 결과값은 화면에 출력하고 에러는 error.txt 파일에 저장한다
$ find / -name '*.txt' 2>error.txt > result.txt
- 결과값은 result.txt 에 저장하고 에러는 error.txt 파일에 저장한다
$ find / -name '*.txt' > data.txt 2>&1
- 결과값과 에러값을 모두 data.txt 이라는 한 파일에 저장한다. find / -name '*.txt' &> data.txt 와 같다
$ find / -name '*.bak' 2>>error.txt
- 결과값은 화면에 출력하고 에러는 error.txt 파일에 추가하여 저장한다
[posein@localhost ~]$ cat fam.txt
I LOVE LIN.
I LOVE JOON.
[posein@localhost ~]$ cat < fam.txt
I LOVE LIN.
I LOVE JOON.
[posein@localhost ~]$ tr 'A-z' 'a-z' < fam.txt
i love lin.
i love joon.
- cat 처럼 대부분의 명령어는 뒤에 오는 항목을 인자값으로 받아들여 입력 전환 기호인 < 를 사용하지 않아도 상관없으나, tr 과 같은 명령어는 반드시 < 기호를 사용해야 한다.
파이프(pipe)
개요
- 프로세스의 통신을 위해 도입한 것으로 어떤 프로세스의 표준 출력이 다른 프로세스의 표준 입력으로 쓰이게 하는 것을 말한다
- | 기호를 사용하고, 여러 개를 사용하면 pipe-line 을 구성하게 되면서 데이터들을 파이프라인을 따라 흐르게 된다
[사용법]
$ 명령어1 | 명령어2
- 명령어1의 결과값이 명령어2의 입력으로 사용된다
[사용예]
$ ls -alF | more
- ls 명령의 출력이 more 라는 filter 의 입력으로 사용되어 결과가 한 화면씩 출력된다
$ ls | sort | more
- ls의 결과인 자료들은 sort 를 통해 정렬되고, 다시 more 를 통해 한 화면씩 출력된다
관련 명령어
1. tee : 파이프연결 출력을 두 갈래로 나눌 때 사용하는 명령 (tee [option] [파일])
[주요옵션]
-i : 인터럽트를 무시하도록 한다
-a : 지정된 파일로 출력을 덮어쓰지 않고, 파일 내용 뒤에 추가한다
[사용 예]
$ ls -l | tee list.txt |more
- 파일의 목록을 list.txt 라는 파일에 기록함과 동시에 more 를 사용하여 화면에도 출력 내용을 보여준다
$ ls -l /etc | tee etc.txt | tee /tmp/etc.txt |more
- 'ls -l /etc' 의 결과를 현재 디렉터리 안에 etc.txt 및 /tmp/etc.txt 로 저장하고 화면에도 한 페이지씩 출력한다
$ ls -l /etc | tee etc.txt | tee /dev/pts/0 | more
- 'ls -l /etc' 의 결과를 현재 디렉터리 안에 etc.txt 로 저장하고 /dev/pts/0 으로 출력하고, 화면에도 한 페이지씩 출력한다
- 사용 중인 /dev/pts/0 터미널은 해당 사용자가 권한이 있어야 하고, '/dev/' 는 생략 가능하나, 콘솔창인 /dev/tty2 등은 버전에 따라 생략하면 안 될 수도 있다
2. xargs : 표준 입력으로부터 값을 받아 처리하는 명령으로 보통 다른 명령어와 파이프 기호 조합으로 사용된다
[사용법]
$ 명령어 | xargs [option]
[주요옵션]
-n : 한 번에 처리하는 최대 인자값을 지정하는 옵션 (--max-args=값)
[사용 예]
$ echo a.txt | xargs ls -l
- a.txt 의 ls -l 결과를 출력한다
$ find -name '*.xtx' | xargs rm -rf
- 현재 디렉터리 이하에서 .txt 로 끝나는 파일이나 디렉터리를 찾아 전부 삭제한다
$ echo a.txt b.txt | xargs -n 1 cp -v /etc/passwd
- /etc/passwd 를 a.txt b.txt 라는 이름으로 하나씩 복사하고 진행 과정을 출력한다
작업 제어 기능
개요
- 작업을 백그라운드와 포그라운드에서 실행할 수 있으며, 이 작업을 서로 전환하여 실행할 수 있다
산술 연산 기능
개요
- expr 명령을 이용하여 산술 연산이 가능하다
[사용법]
$ expr 값 연산자 값
- expr, 값, 연산자 사이는 반드시 한 칸씩 띄어야 한다
- 값 대신 미리 지정한 변수를 사용해도 된다
[사용예]
$ expr 3 + 2 - 명령어, 연산자, 피연산자 사이를 띄어야 한다$ expr 3 \* 2 - * 앞에는 \ 를 붙여야 한다
프롬포트 제어 기능
개요
- 프롬프트를 원하는 대로 변경 지정이 가능하다. 환경 변수인 PS1 을 이용해서 변경할 수 있다
확장된 내부 명령어
개요
- bash 자체적으로 해석하는 set, export 등의 내부 명령어(Built-in command) 들이 점점 많아지고 있다
설정들을 지속적으로 이용하려면 관련 파일에 설정해야 한다
[관련 파일 및 디렉터리]
/etc/profile | 시스템 전체(모든 사용자)에 적용되는 환경 변수와 시작 관련 프로그램을 설정한다 |
/etc/bashrc | 시스템 전체(모든 사용자)에 적용되는 alias 와 함수를 설정한다 |
~/.bash_profile | 개인 사용자의 환경 설정과 시작 프로그램 설정과 관련이 있는 파일 로그인 시 읽어들인다 경로, 환경 변수 등 설정이 들어있고, 사용자가 PATH 와 같은 환경 변수 수정 시 사용하면 된다 |
~/.bashrc | 개인 사용자가 정의한 alias 와 함수들이 있는 파일 alias 를 지속적으로 사용하려면 이 파일에 설정한다 |
~/.bash_logout | 개인 사용자가 로그아웃할 때 수행하는 설정을 지정하는 파일 |
/etc/profile.d | 몇몇 응용 프로그램들이 시작할 때 위한 필요한 스크립트가 위치하는 디렉터리 보통 /etc/profile 에서 호출 일반 사용자의 alias 설정 등과 관련된 스크립트 존재 |
[셸에서 사용되는 특수문자 1]
~(filde) | 홈 디렉터리 예) ~posein : posein 이라는 사용자의 홈 디렉터리를 나다낸다 ~+ : 현재 디렉터리를 나타내고. '.' 과 같다 |
. | 현재 디렉터리를 나타내거나, 명령행 맨 앞에서 source 라는 의미로 셸 스크립트 등을 실행시킬 때도 사용한다 |
.. | 부모 디렉터리 |
' ' | 모든 문자나 특수 문자들을 일반 문자로 취금한다 |
" " | $, ``, \, ` 를 제외한 문자들을 일반 문자로 취급한다 |
` ` | 명령 대체 기능 수행. 명령의 결과를 대체해서 사용한다 |
$ | shell 변수 기호. 뒤에 오는 문자열을 변수로 취급함 |
* | 아무 것도 없는 경우를 포함한 모든 문자를 뜻함 |
? | 보통 한 문자를 대체할 때 사용한다 특정 명령에 대한 결과를 갖는 return 변수로도 쓰이는데, 셸 상에서 내린 명령의 에러 유무를 확인할 수 있다 |
( ) | 부속 shell (subshell) 을 뜻하는 기호로 하나의 셸 단위로 묶어준다 |
\ | 탈출(escape) 문자로 바로 다음에 오는 특수 문자의 기능을 없앤다 또한 alias 가 설정된 명령어 앞에 사용하는 경우 alias 를 없애준다 셸에서 긴 명령행 입력 시에 행을 연장할 때도 사용한다 |
[ ] | bracket, 문자집합 이다 [ 와 ] 사이에 선택할 수 있는 문자를 나열하여 '~중의 하나' 라고 표현된다 범위를 지정할 때는 - 를 사용한다 예) [abc] : a,b 또는 c [a-c] : a,b 또는 c [..;] : period, comma 또는 semicoion [-_] : dash(-) 또는 underscore(_) [*?] : * 또는 ? → [ ] 안의 와일드카드는 의미가 없다 [!0-9] : 숫자가 아닌 문자 [^chars] : c, h, a, r, s 중 없는 문자 중 하나로 대체 [a-zA-Z] : 모든 알파벳 문자 |
; | shell 명령 분리자이다. 명령어를 순차적으로 실행할 때 사용한다 |
{ } | { } 안에 제시된 문자열 중 하나로 대치시킨다 예) b{ed, olt, ar}s : beds, bolts, bars b{ar{d, n, k}, ed}s : bards, barns, barks, beds |
[사용예]
현재 디렉터리에 a, a.c, a.txt, a.o, b.txt, c.txt, d.o, ab.txt 파일이 있다고 가정
$ ls a*
a a.c a.o a.txt ab.txt
- * 는 모든 문자를 뜻한다. 즉 a 로 시작하는 모든 파일을 보여준다. 물론 a 라는 이름이 파일도 찾아준다
$ ls a.?
a.c a.o
- ? 는 한 문자를 대체한다
$ ls [a-c].*
a.c a.o a.txt b.txt c.txt
- [a-c] 는 a, b 또는 c 한 문자를 가리킨다
$ ls[!ab].*
c.txt d.o
- a나 b가 들어가지 않는 파일만을 찾아 출력한다
[셸에서 사용되는 특수문자 2] : 인용부호
- 문자나 단어의 특별한 의미, 즉 메타 문자가 가지고 있는 특수한 기능을 제거할 때 사용하는 부호를 인용 부호라 한다
1. 달러 표시(dollar sign : $)
- $ 은 shell 변수를 나타날 때 사용한다. 변수에 특정한 값으로 부여할 때는 = 를 사용한다
[사용예]
[posein@www ~]$ name=posein
[posein@www ~]$ echo name
name
- echo 명령은 텍스트 문자열을 그대로 출력하는 명령어이므로 name 이라는 문자열이 그대로 출력된다
[posein@www ~]$ echo $name
posein
- name 을 변수 취급해서 변수에 저장된 값을 출력한다
[posein@www ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
- 경로를 나타내는 환경 변수(PATH) 값을 출력한다
2. 작은 따옴표(sINGLE qUOTES : ' ')
- 모든 특수 문자의 의미를 제거한다
[사용예]
[posein@www ~]$ ECHO '$PATH'
$PATH
- ' ' 안의 $PATH 를 단순한 문자열로 표기한다
3. 큰따옴표(double quotes : " ")
- 따옴표 안에 있는 $, `, \ 를 제외한 모든 문자들의 툭별한 의미를 없앤다. 또한 !(history) 도 예외로 인정한다
[사용예]
[posein@www ~]$ echo "$PATH"
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
- " " 안의 $ 는 해당 역할을 수행하므로 변수이 값이 출력된다
[posein@www ~]$ pwd
/home/posein
[posein@www ~]$ echo "previous command is !!"
echo "previous command is pwd"
previous command is pwd
- !! 기호의 역할인 바로 직전 명령을 호출하여 문자로 붙여준다
4. 백슬래쉬(backslash : \)
- \ 기호 다음에 나오는 문자의 특별한 의미를 제거하거나, 명령행이 긴 경우 다음 라인까지 명령행을 연장할 때 사용한다
- 특정 명령어에 옵션 기본 장착과 같은 alias 가 설정되어 있을 경우 앞부분에 \를 덧붙여 실행하면 옵션 없이 기본 명령어로 실행된다
[사용예]
[posein@www ~]$ echo \$PATH
$PATH
- \ 뒤에 오는 $ 의 특수한 기능을 없애고, 단순한 문자열로 만들어 출력한다
[posein@www ~]$ echo \$$PATH
$/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
- \ 뒤에 오는 첫 번째 $ 의 특수한 기능을 없애고, 그 다음 $PATH 는 환경 변수로 인식하여 경로를 출력한다
[root@www php-5.6.5]# ./configure --with-apxs2=/usr/local/apache/bin/apxs \
> --with-mysql=/usr/local/mysql \
> --with-config-file-path=/usr/local/apache/conf
- 명령 입력 중 \ 를 입력하면 줄이 바뀌고 2차 프롬프트 > 가 나타나면서 계속 입력할 수 있다
[posein@www ~]$ \ls
- ls 명령어에 alias 가 특정 옵션이 기본 설정되었을 경우 무시되고 원래의 ls 명령어가 실행된다
5. 백쿼츠(back quotes : ` `)
- 명령어 대체 (command substitution) 역할을 하는 문자로서 ` ` 로 묶여진 문자열은 명령어로 인식된다
[사용예]
[posein@www ~]$ echo "Current directory `pwd`"
Current directory /home/posein
- ` ` 안의 pwd 명령어로 인식하여 그 결과값인 /home/posein 을 출력한다
Shell 프로그래밍
shell 프로그래밍
- 셸에서 사용되는 여러 명령어들을 모아 하나의 파일로 만드는 과정을 말하며, 이러한 과정을 통해 만들어진 파일 또는 프로그램을 셸 스크립트 (shell script) 라고 부른다
- 셸은 for 문 및 case 문 같은 구문, 변수, 함수 등과 같이 보통 언어가 가지고 있는 기본적인 특성을 가지고 있어서 다양한 명령어와의 조합을 통해 사용자 환경에 맞도록 프로그래밍을 할 수 있다
shell 스크립트 작성 방법
1. vi 편집기 등을 사용해서 파일을 생성한다
예) $ vi who2.sh
2. 첫 번째 줄은 사용할 셸을 명시하는데, bash 를 사용할 경우 다음과 같이 명시한다
예) #!/bin/bash
3. 두 번째 줄 부터는 원하는 명령 및 구문 등을 입력한다
예) # /bin/bash
echo "Login List"
who
4. 스크립트를 실행 가능한 파일로 만든다
예) $ chmod 755 who2.sh
5. 실행시킨다
예) $./who2.sh
shell 스크립트 실행하기
1.경로(PATH) 등록
- 사용자의 홈 디렉터리에서 셸 스크립트를 생성한 뒤에 실행하려면 파일명 앞에 반드시 ./ 를 붙여야 한다
- 이 의미는 현재 디렉터리 안에 있는 해당 파일을 실행시키라는 뜻으로 ./를 붙이지 않으면 PATH 에 등록된 디렉터리만 검색하므로 "command not found" 라는 메시지를 접하게 된다
- 따라서 계속 사용하려면 PATH 에 해당 경로를 등록하거나, 해당 스크립트를 PATH 에 등록된 디렉터리로 옮겨야 한다
[posein@www ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/posein/.local/bin:/home/posein/bin
-CentOS 7 버전에서 일반 사용자의 PATH 값을 확인하면 위 그림과 같다. 계속적으로 사용할 셸 스크립트라면 'mkdir ~/bin' 또는 'mkdir ~/.local/bin' 명령을 실행한 후에 이 디렉터리 안에 넣어두면 위치에 상관없이 실행 가능하다
- 홈 디렉터리를 PATH 에 등록하려면 'export PATH=$PATH:$HOME' 을 실행하면 된다
2. 허가권 없이 셸 스크립트 실행하기
- 셸 스크립트에 실행 권한을 부여하지 않고도 실행하려면 다음과 같은 세가지 방법을 사용할 수 있다
① 앞부분에 sh 명령 덧붙이기
예) $ sh who2.sh
② 앞부분에 source 명령 덧붙이기
예) $ source who2.sh
③ 앞부분에 . 덧붙이기
예) $ . who2.sh
shell 프로그래밍 문법
1. 주석
2. 변수
- var 변수에 값 value 를 저장한다. 셸에서 변수를 사용할 때는 변수명 앞에 $ 을 붙인다.
- 변수에 데이터를 저장할 때는 대입연사자 '=' 를 사용ㅎ며 대입연산자, 연산자/피연산자 사이에는 공백이 존재해서는 안 된다
- 변수명은 - 를 제외한 특수 문자와 숫자로 시작해서는 안된다
[기타 변수 대응법]
${name} | name 이라는 변수에 들어있는 값으로 치환한다 변수명 다음에 다른 문자가 연이어 나올 경우 유용하다 |
${name:=value} | name 이 null 이면 value 로 할당하여 저장하고, name 에 값이 있으면 그 값을 사용한다 변수의 기본값을 지정할 때 유용하다 |
${name:+value} | 기존 name 이 null 이 아니라면 value 를 사용하지만, name 에 저장하지 않는다 (1회사용) |
${name:-value} | 기존 name 값이 있다면 그 값을 사용하고, 값이 없으면 value 값을 대입한다 name 에 value 값을 저장하지는 않는다 |
${name:?value} | 기존 name 값이 있다면 기본값으로 하고, 값이 없으면 error 를 내면서 value 값을 보여준다 |
${#name} | name 의 문자열 길이를 반환한다 |
${name:offset} | name 값에서 offset 만큼 삭제한 후 값을 반환한다 |
${name:offset:length} | name 값에서 offset 만큼 삭제한 후 length 만큼 센 뒤 값을 반환하다 |
[관련 환경 변수]
$IFS | 입력필드 구분자로서 셸 상에서 입력을 읽어 들일 때 글자를 구분하기 위한 목적으로 사용되는 문자 목록을 뜻한다 보통 스페이스, 탬, 개행 문자를 사용한다 |
[argument 변수]
- 특별한 내장 변수로 '위치 매개 변수(positional parameter)' 라고도 한다
- 이 변수는 매개 변수를 불러올 때 스크립트의 명령행 인자를 담당한다
- 위치 매개 변수는 그 이름이 1, 2, 3 등으로 되어 있으며, 그 값을 각 $1, $2, $3 등으로 표시하고 0은 스크립트 파일명을 뜻한다
$0 | 실행된 셸 스크립트명 |
$1 | 스크립트에 넘겨진 첫 번째 아규먼트 |
$2 | 스크립트에 넘겨진 두 번째 아규먼트 |
$# | 스크립트에 넘겨진 아규먼트 개수 |
$$ | 셸 스크립트의 PID |
$* | 스크립트에 전달된 인자 전체를 하나의 변수에 저장하면 IFS 변수의 첫 번째 문자로 구분 |
$@ | $* 와 비슷한데, IFS 환경 변수를 사용하지 않는 것이 다른 점이다 |
$? | 실행한 뒤 반환 값, 즉 참이면 0, 거짓이면 1이 반환됨 |
$- | 현재 Shell 이 호출될 때 사용한 옵션들 |
p 139
사용자 계정 생성 : useradd
개요
- b
사용자 전환 : su
개요
- subsitute user : 대리유저
- 시스템에 로그인되어 있는 상태에서 다른 사용자의 권한으로 셸을 실행할 수 있도록 전환하는 명령
- 리눅스 배포판에서는 텔넷과 같이 원격에서 접속할 때 직접 root 계정으로 로그인이 불가능하도록 설정되어 있다. 관리자라고 하더라도 일반 사용자로 로그인한 뒤 root 로 전환해야 하는데 이 때 su 명령어가 필요하다
사용자 관련 파일 및 디렉터리
개요
- useradd 명령을 실행하면
: 기본 설정은 /etc/default/useradd 에서 정보를 가져오고
: /etc/skel 에 들어있는 파일 및 디렉터리를 사용자에게 제공고
: 생성된 사용자의 정보는 /etc/passwd 와 /etc/shadow 에 기록되고 레드햇일 경우 /etc/group 에도 기록됨)
: '/home/사용자아이디' 에 홈 디렉터리를 부여받아서 파일을 생성 삭제할 수 있고
: '/var/spool/mail/사용자아이디' 에 메일 파일을 생성해준다
1. /etc/passwd
- 시스템에 로그인하여 자원을 이용할 수 있는 사용자 목록을 저장하는 파일
2. /etc/shadow
- /etc/passwd 의 두 번째 필드인 패스워드 부분을 암호화하여 관리
- 총 9개의 필드로 구성되어 있고 패스워드 만기일, 계정 만기일 등 설정 가능
- root 로만 접근 가능
3. /etc/default/useradd
- 별도 옵션 없이 'useradd 사용자명' 으로 계정 생성 시 기본적으로 적용되는 설정이 들어있는 파일
- cat 명령 (텍스트 파일의 전체 내용을 출력해주는 명령) 으로 확인하거나 'useradd -D' 를 입력하면 확인 가능
4. useradd 명령을 /etc/default/useradd 파일 관리
[사용법]
# useradd -D option
[주요 옵션]
-D | 사용자 추가 시 기본적으로 반영되는 정보 파일인 /etc/default/useradd 내용 출력 설정 편경을 원한다면 이 옵션과 함께 아래 옵션들을 사용하면 된다 |
-g | 기본 그룹 지정. 여기에서 지정하는 값은 /etc/group 내에 있어야 한다 리눅스 표준인 LSB (Linux Standard Base) 를 따라가는 리눅스 배포판인 경우 기본 그룹 지정이 가능 레드햇 계열 리눅스에서 설정하면 /etc/default/useradd 파일에 변경된 값이 반영은 되나 실제 사용자 추가 시 적용되고 있지 않다 |
-b | 사용자 홈 디렉터리의 상위 디렉터리 지정 |
-f | INACTIVE 행과 관련된 옵션으로 패스워드 유효 기간이 만료된 후 언제 이 게정을 사용할 수 없도록 할 것인지 하루 단위로 설정 |
-e | 사용자 계정 만료일 지정 |
-s | 사용자 기본 셸 지정 |
5. /etc/login.defs
- 메일 디렉터리, 패스워드 관련 설정, UID 최솟값 및 최댓값, GID 최솟값 및 최댓값, 홈 디렉터리 생성 여부, 기본 UMASK 값, 패스워드에 적용하는 암호화 알고리즘 등이 정의되어 있음
6. /etc/skel
- 사용자 생성 시 기본적으로 제공되는 파일이나 디렉터리가 위치한다
[사용예]
# mkdir /etc/skel/www
- 사용자를 추가하면 www 라는 디렉터리도 제공된다
사용자 계정 관리 : usermod
개요
- 사용자의 셸, 홈 디렉터리, 그룹, UID, HID 등을 변경하는 명령어
[주요옵션]
-d : 사용자 홈 디렉터리 변경. 변경할 디렉터리는 미리 생성되어야 한다. -m 과 같이 사용하면 사용하던 홈 디렉터리의 파일과 디렉터리도 같이 옮겨주므로 이 경우 디렉터리를 생성하지 않아도 된다 (--home)
-m : 사용자의 홈 디렉터리 변경 시 기존에 사용하던 파일 및디렉터리를 옮겨주는 옵션. -d 와 함께 쓰인다 (--move-home)
-g : 사용자 그룹 변경 (--gid)
-s : 사용자 셸 변경 (--shell)
-u : 사용자 UID 값 변경
-e : 계정 만기일 변경. YYYY-MM-DD 또는 MM/DD/YY 형태로 지정
-f : 패스워드 만기일이 지난 후 패스워드에 lock 을 설정할 유예 기간 지정 (--inactive)
-c : 사용자의 간단한 정보 입력 및 변경 (--command)
-G : 추가로 다른 그룹에 속하게 할 때 쓰인다 (--groups)
-a : -G 옵션과 같이 사용하는 옵션. 기존 2차 그룹 이외에 추가로 2차 그룹을 지정할 때 사용 (--append)
-p : /etc/shadow 의 두번째 필드인 암호화된 패스워드 값 변경 시 사용. 암호화된 값으로 값 지정 (--password)
-l : 사용자 아이디 변경 (--login)
-L : 사용자 패스워드에 잠금을 걸어 로그인을 막는다 (--lock)
-U : 사용자 패스워드에 설정된 잠금을 푼다 (--unlock)
사용자 계정 삭제 : userdel
개요
- 사용자 계정 삭제
[주요옵션]
-r : 사용자 홈 디렉터리 및 메일 관련 파일까지 제거 (--remove)
사용자 패스워드 관리(1) : passwd
개요
- passwd 은 기본적으로 패스워드를 부여하거나 패스워드를 변경하는 명령
- 계정을 사용하지 못하게 하거나 패스워드 만기일 및 유효 기간 등을 설정할 수 있다
[주요옵션]
-S : 사용자에 대한 패스워드 정보를 알 수 있다
-l : 사용자의 패스워드에 잠근을 걸어 로그인을 막는다 (--lock)
-u : 사용자에게 설정되어 있는 패스워드 잠금을 푼다 (--unlock)
-d : 사용자 패스워드 삭제. 패스워드 없이 로그인 가능
-n : 패스워드 변경까지의 최소 날짜 설정. 패스워드 변경 후 최소로 사용해야 되는 날짜 수
-x : 현재 패스워드 유효기간 지정. 패스워드 최대 사용 가능한 날짜 수
-w : 패스워드 만료 전 경고 날짜 지정
-i : 패스워드 만료된 뒤 사용자 계정 사용이 실제 로그인이 불가능하게 되기까지의 유예기간 설정
-e : 다음 로그인 시 반드시 패스워드 변경하도록 할 때 사용. 이 옵션을 사용하면 /etc/shadow 의 세 번째 필드 값이 0 으로 설정
사용자 패스워드 관리(2) : chage
개요
- 사용자의 패스워드 정보를 출력하고 설정하는 명령
- /etc/shadow 날짜 관련 필드 설정 가능
사용자 패스워드 관리(3) : chpasswd
개요
- 사용자 패스워드 변경. 여러 사용자들을 한 번에 패스워드를 변경 시 사용
ssh
ssh 란
- 원격 시스템에 로그인하여 명령을 실행하는 프로그램
- 패킷을 암호화 하여 telnet 이나 rlogin 에 비해 안전
- 기본 설정 포트는 22번이며 원격 셸, scp, sftp 기능을 지원함
- ssh-keygen을 이용하면 인증키를 이용한 접속이 가능함
telnet 과 ssh 비교
- telnet : 클라이언트와 서버간의 데이터 전송 시, 일반 텍스트 형태를 패킷으로 전달하여 패킷의 내용이 유출당할 수 있다.
- ssh : 패킷 전송 시 암호화시키므로 안전하게 패킷을 전송할 수 있다.
버전
- ssh1
- ssh2 : ssh 와 호환은 되지만 기본적으로 호환성을 포함하고 있는 것이 아니므로 ssh1 을 지원하려면 ssh1 서버를 같이 운영해야 한다. 이 중 암호화 RSA 키 교환을 비롯하여 다양한 키 교환 방법을 지원한다.
- ssh2 는 ssh1의 보안 기능을 강화하여 새로 나온 보안 프로토콜로 ssh1 과는 완전히 다른 프로토콜이다.
특징
- 패킷을 암호화하여 다른 원격 프로그램인 telnet 이나 rlogin 에 비해 안전하다.
- rlogin 처럼 패스워드 입력 없이 로그인이 가능한다.
- rsh 처럼 원격 셸을 지원한다.
- 원격 복사(scp) 를 지원한다.
- 안전한 파일 전송(sftp)를 지원한다.
- 로그인 전에 보여주는 메시지를 별도의 파일로 지정할 수 있다.
ssh 설치
- 리눅스 에서는 ssh 의 공개버전인 openssh 를 사용한다. ssh 서버와 ssh 클라이언트 프로그램으로 나누어져 있다.
- 레드햇 계열 리눅스에서는 3개 패키지로 구분해서 배포하고 있다.
1. openssh : openssh 서버와 openssh 클라이언트에 모두 필요한 핵심적인 파일들이 들어있는 패키지 ssh-keygen 명령이 들어있다.
2. openssh-server : openssh 서버 관련 패키지. 데몬인 sshd, sftp 서버 등이 들어있다.
3. openssh-clients : openssh 클라이언트 관련 패키지. ssh, scp, sftp 등의 명령어가 들어있다.
서버 설정
- ssh 서버 환경 설정 파일 : /etc/ssh/sshd_config
- 실행 데몬 스크립트 : /usr/sbin/sshd
- 실행 명령 : systemctl start sshd.service
백업관리
백업종류
- 전체백업 : 말 그대로 특정 디스크나 파티션 등 전체 백업
- 부분백업 : 선택한 파일들만 백업하는 것
- 증분백업 : 증가된 내용만 백업
- 차등백업 : 바뀐 부분만 백업
파일 및 디렉터리 관리
소유권(Ownership) 과 허가권(Permission)
- 소유권 : 어떠한 파일이나 디렉터리를 소유하여 지배하는 권리 (사용자 소유권, 그룹 소유권)
- 허가권 : 파일이나 디렉터리에 접근 권한을 설정하는 권리로 일반적으로 소유권을 가진 사용자가 허가권을 설정 (사용자, 그룹, 다른 사용자) 총 10개의 영역으로 나눌 수 있는데, 첫 번째 영역은 파일 타입. 나머지 9개는 각 3개씩 나눠 첫 세자리는 파일을 소유한 사용자에게 적용되는 권한, 두 번째 세자리는 해당 그룹에 속한 사용자들에게 적용되는 권한, 마지막 세 자리는 그 외의 다른 사용자들에게 적용되는 권한
- ls -l 명령으로 확인 가능
[posein@localhost ~] $ ls -l lin.txt
-rw-rrw-r--. 1 posein posein 13 Jan 11 11:05 lin.txt
차례대로 허가권, 소유권을 가진 사용자, 그룹 소유권
특수권한
1. 특수권한의 개요
- 일반 사용자도 root 권한이 필요한 경우가 있다. 이 때 일부 권한 허용 등을 위한 특별한 권한이 있다.
특수 권한 | 설명 |
Set-UID | 실행파일에 사용됨 Set-UID 가 부여된 파일을 실행 시, 해당 파일을 실행하는 동안 실행시킨 사용자의 권한이 아닌 해당 파일의 소유자 권한으로 인식한다 실행 파일에 주로 사용하므로 설정하면 소유자 권한 부분의 x 자리에 s 로 표기된다 만약 실행 권한이 없는 파일에 부여하면 대문자 S 로 나타난다 |
Set-GID | d |
Sticky-Bit | d |
2. 특수 권한의 확인
3. 특수 권한의 설정
파일 및 디렉터리 관리 관련 명령어
chmod(change mode)
-
chown(change owner)
-
chgrp(change group)
-
umask
-
파일 링크 (Link)
파일 링크 개요
-
관련 명령어
-
하드 링크와 심볼릭 링크
-
파일 시스템 관리 및 복구 > 파일 시스템 생성
파일 시스템 생성의 개요
-
파일 시스템 생성의 예
-
파일 시스템 관리 및 복구 > 관련 명령어
fdisk
-
mkfs(make filesystem)
-
mke2fs
-
mkfs.xfs
-
mount
-
umount
-
eject
-
파일 시스템 관리 및 복구 > 관련 파일
/etc/fstab
-
/etc/mtab
-
blkid
-
파일 시스템 관리 및 복구 > 파일 시스템 점검 및 관리
fsck(filesystem check)
-
e2fsck
-
xfs_repair
-
df(disk free)
-
du(disk usage)
-
dd(data dumper)
-
partprobe
- 변경된 파티션 정보를 반영시킬 때 사용하는 명령
- 재부팅 하지 않아도 적용됨. 반영되지 않는 경우도 있는데 /proc/partitions 에서 확인하고, 반영되지 않았다면 재부팅 해야함
stat
- 파일 또는 파일 시스템 관련 정보 출력
파일 시스템 관리 및 복구 > 스왑생성
개요
-
관련명령어
1. mkswap
- 스왑 파티션이나 스왑 파일을 생성하는 명령
2. swapon
- 스왑 파티션이나 스왑 파일을 활성화시키는 명령으로 스왑의 상태 확인도 가능
3. swapoff
- 활성화된 스왑 파티션이나 스왑 파일을 중지시킨다
4. free
- 현재 사용 중인 메모리의 상태를 출력해 주는 명령. 기본적인 정보는 /proc/meminfo 파일에서 가져온다
스왑 영역 만들기
-
파일 시스템 관리 및 복구 > Disk Quota
개요
-
관련 명령어
1. xfs_quota
-
2. edquota
- 사용자나 그룹에 쿼터를 설정할 때 사용하는 명령. 실행시키면 vi 편집기가 실행되고 기본 단위가 KB 이므로 10MB 를 제한하려면 10000 이라고 입력해야 한다
3. repquota
- 파일 시스템에 설정된 쿼터 정보 출력
4. quota
- 사용자나 그룹 단위로 쿼터 설정 정보를 출력해주는 명령
5. setquota
- 쿼터를 설정하는 명령. vi 편집기를 이용하는 대신 직접 명령행에서 설정 가능
6. quotacheck
- quota 기록 파일 (aquota.user, aquota.group 또는 aquota.group) 을 가장 최근 상태로 업데이트 시키는 명령
- 파일 시스템을 검사하여 aquota.user 와 같은 quota 기록 파일을 생성하는 명령
backup 및 restore
tar (tape archive)
- 유닉스와 리눅스 시스템 모두 사용 가능한 유틸리티
- 파일이나 디렉터리들을 하나의 파일로 묶어 주는 역할
- 사용이 쉽고 소량의 파일 백업에 좋고 원본 파일을 남겨두므로 안전하다
1. 전체백업
[전체 백업 예]
# tar cvfp home.tar /home
- /home 디렉터리를 퍼미션 등을 그대로 유지하면서 home.tar 라는 파일로 묶는다
[전체 백업 복원 예]
# tar xvf home.tar
- home.tar 를 풀어서 현재 디렉터리에 복원한다
2. 증분 백업
[증분 백업 예]
# tar -g list -cvfp home1.tar /home
- -g는 증분 백업에 사용하는 옵션으로 list 라는 파일의 내용을 토대로 증분 백업을 시도하는데, 처음 사용하는 경우 전체 백업을 사용한다
# tar -g list -cvfp home2.tar /home
- list 라는 파일의 내용과 비교하여 증가된 것만 home2.tar 로 백업한다
[증분 백업 복원 예]
# tar xvf home1.tar -C /
# tar xvf home2.tar -C /
- 처음에 백업한 파일부터 순차적으로 복원하면 된다
3. 날짜를 이용한 부분 백업
[부분 백업 예]
# tar -c -v -N '13 May 2013' -f home.tar /home
- /home 에서 2013년 5월 13일 이후로 변경된 파일만을 home.tar 로 백업한다
4. 분할 및 압축 백업
[압축 및 분할 백업 예]
#tar zcvf - /home | split -b 10m - home.tar.gz
- /home 디렉터리를 압축하여 10MB 단위로 백업한다. split 명령은 지정한 파일명 뒤에 aa,ab 등의 형태로 파일이 생성되므로 'home.tar.gzaa', 'home.tar.gzab' 등으로 생성된다
[복원 예]
# cat home.tar.gza* | tar zxvf -
- split 명령은 텍스트 파일 관련 명령어이므로 복원할 때 cat 명령을 사용한다
[주요옵션]
-c : 아카이브생성
-x : 아카이브 파일풀기
-v : 작업내용 출력
-f : 아카이브의 파일 이름 지정
-r : 파일추가
-t : 아카이브 파일 풀지않고 내용 확인
-g : 증분백업 (snap shot 파일)
-p : 권한 그대로 유지 백업/해제
-z : gzip 압축 (압축 해제 시 같은 옵션 .gz gunzip : 압축해제)
-j : bzip2 압축 ( .bz2 bunzip2 : 압축해제)
-J : xz 압축 ( .xz unxz : 압축해제)
cpio
- 많은 양의 데이터에 대해서는 tar 보다 빠르다
- 장치 파일이나 네트워크 파일 등의 특수 파일도 백업이 가능하고 백업본의 크기도 작고, 백업본에 손상된 부분이 있더라도 손상된 부분을 제외하고 나머지 부분을 복구한다
- 기존 명령어를 사용하여 백업을 진행하므로 다양한 조건을 활용하여 백업 가능하다
- 단점은 완전 백업만 지원한다
[사용법]
$ [셸명령어 | ] cpio option > 파일명
$ cpio option < 파일명
[주요옵션]
-o: 표준 출력으로 보내어 사용 (--create)
-i : 표준 입력으로 받을 때 사용. 백업한 자료 불러올 때 사용 (--extract)
-v : 과정을 상세히 출력 (--verbose)
-c : 아카이브 포맷 형식을 아스키 형식으로 헤더정보를 읽고 씀 (-H newc 옵션과 동일)
-t : 내용만 확인 (--list)
-d : 디렉토리를 생성 (--make-directories)
-F : 표준 입출력 전환 기호 대신에 파일명을 지정할 때 사용 (--file=파일명)
-B : 입출력 블록 사이즈를 조절할 때 사용. 기본 512byte 이고 최대 5120byte 까지 가능
-H 포맷 : 아카이브 포맷 형식을 지정하는 옵션. 'bin', 'newc', 'crc' 등 값 사용 (--format 포맷)
[사용 예]
# find /home | cpio -ocv > home.cpio
- /home 을 home.cpio 파일로 백업한다
# ls *.cong | cpio -ocv > conf.cpio
- *.conf 파일을 conf.cpio 로 백업한다
# cpio -icdv < home.cpio
- home.cpio 의 내용을 현재 디렉터리에 복원한다
# cpio -ic < conf.cpio
- conf.cpio 에 백업된 데이터를 복원한다
# cpio -icvt < conf.cpio
- conf.cpio 내용만 확인한다
# cpio -icvt "s*.conf" < conf.cpio
- conf.cpio 의 내용 중 s*.conf 에 해당하는 내용만 보여준다
# ls *.conf | cpio -ocvF conf2.cpio
- 현재 디렉터리에 있는 .conf 로 끝나는 모든 파일을 conf2.cpio 로 백업한다
# cpio -iF conf2.cpio
- conf2.cpio 로 백업된 데이터를 복원한다
Q. # find /home | (cpio 명령과 옵션) > home.backup
rsync (remote synchronous)
- p484
기본적으로 ssh 나 rsh 를 이용하여 전송하며, 다른 프로토콜 접속을 지원한다. 이전에 받은 백업본을 삭제하고, 원본과 항상 똑같이 백업이 되도록 설정이 가능하다. 데이터를 압축하여 전송이 가능하며 심볼릭 링크나 심볼릭 링크가 참고하고 있는 파일도 복사가 가능하다.
- rcp(remote copy) 에 비해 처리 속도가 빠르다.
- 내부 파이프라인을 통하여 전송기간을 줄인다.
dump, restore
- 파일들이 아닌 파일 시스템 전체를 백업할 때 사용하는 유틸리티. 보통 파티션 단위로 백업할 때 사용
- 전체 백업과 증분 백업을 지원하고 level 0 이 전체 백업이고 나머지 level 을 가지고 부분백업 시에 사용
- 백업할 때 /etc/fstab 파일을 참조하며 데이터 복원은 restore 명령 사용
- ext 파일 시스템인 ext2, ext3, ext4 만 지원하고 centos7 의 기본 파일 시스템인 XFS 는 지원하지 않는다.
1. dump : 파티션 단위로 백업하는 명령, 작업 정보를 /etc/dumpdates 에 기록
[사용법]
# dump option 파일명 백업대상
[주요옵션]
0~9 : 레벨 지정
-f : 백업할 매체나 파일명을 적는다
-u : dump 작업 후 /etc/dumpdates 라는 파일에 관련 정보 기록
[사용 예]
# dump -0u -f backup.dump /dev/sda7
- /dev/sda7 를 backup.dump 에 전체 백업하고, 작업 정보를 /etc/dumpdates 에 기록한다
# dump -0u -f home.dump /home
- /home 디렉터리를 home.dump 라는 이름으로 전체백업하고, 작업 정보를 /etc/dumpdates 에 기록한다
2. restore : dump 로 백업한 내용을 복원할 때 사용하는 명령. 파일 기반으로 백업한 경우 복원하고자 하는 파티션 영역에 해당 파일을 복사한 후에 실행하면 된다
[사용법]
# restore option 백업파일명
[주요옵션]
-i : 대화식으로 복구할 파일을 선택한 후 복원할 때 사용
-f : 백업할 매체나 파일명을 적는다
-r : 전체 복원 시 사용. 파일 시스템이 미리 생성되어 있어야 하고, 마운트도 되어 있어야 한다
[사용예]
# restore -rf backup.dump
- backup.dump 에 백업된 데이터를 전체 복원한다
[root@localhost home] # restore -if home.dump
restore > ls
. :
joon/ lin/ lost+fount/ posein/
restore > add joon
restore > ls
. :
*joon/ lin/ lost+found/ posein/
restore > extract
- home.dump 에 백업된 데이터를 상호 대화식으로 복원한다. 명령을 실행하면 'restore >' 라는 프롬프트가 나타난다. ls, add, extract 명령어 등을 이용하여 확인 및 부분 복원이 가능하다
dd (data dumper)
- 파티션이나 디스크 단위로 백업 시 사용
- 사용하기 쉬우나 많은 시간 소요
- 공유 디렉터리로 사용되는 하드디스크 전체를 CD-ROM 용량에 해당하는 650MB 단위로 분할해서 백업하려고 한다
[사용예]
# dd if=/dev/sda1 of=/dev/sdb1 bs=1k
- 블록 사이즈 1KB 단위로 하여 /dev/sda1 을 /dev/sdb1 으로 백업한다
# dd if=/dev/sda of=/dev/sdb bs=1M
- 블록 사이즈 1MB 단위로 하여 /dev/sda 을 /dev/sdb 으로 백업한다
로그 파일/명령어
로그파일 | 설명 | 형식 | 로그 명령어 |
secure | 사용자 원격접속 정보, vi 편집기를 사용하여 편집이 가능한 로그 파일 | test file | grep |
pacct | 사용자별 시간대별 명령어 기록 | binary file | lastcomm, acctcom |
utmp | 현재 로그인한 상태 정보를 담고 있는 로그 파일 | binary file | w, who, finger |
wtmp | 성공한 로그인, 로그아웃 정보 시스템의 boot/shutdown 히스토리를 담고 있는 로그 파일 |
binary file | last |
btmp | 실패한 로그인 정보를 담고 있는 로그 파일 | binary file | lastb |
xferlog | ftp 로그 파일 | textfile | |
dmesg | 커널링버퍼 (kernel ring buffer) 의 내용을 출력하고 제어 시스템이 부팅할 때 출력되었던 로그 기록 |
dmesg | |
messages | 시스템에 문제가 생겼을 때 가장 먼저 찾아보는 로그 파일 syslog.conf 에서 로그를 남기지 않는 것으로 지정된 내용을 제외한 모든 항목 기록 |
||
boot.log | 서비스 데몬들의 부트에 관련된 정보 기록 각 데몬들의 시작, 종료, 실패 내용이 기록됨 부팅과 관련된 내용 뿐 아니라 종료 시의 내용도 기록 |
||
/var/log/httpd/access_log | apache 서비스 데몬의 로그 파일 | ||
/var/log/httpd/error_log | apache 서비스 데몬의 에러 사항에 대한 내용 기록 |
명령어와 관계있는 파일 연결
- lastb : /var/log/btmp
- lastlog : /var/log/lastlog
- dmesg : /var/log/dmesg
- last : /var/log/wtmp -> 콘솔, telnet, ftp 등 이용하여 접속한 사용자 기록, 시스템을 재부팅한 기록 등의 로그가 쌓이는 파일. 바이너리 파일로 last라는 명령으로 확인할 수 있음
rsyslog
- 로그 기록과 관련된 리눅스 초기의 syslog 를 대체하여 성능을 대폭 강화한 패키지로 멀티 스레드 지원, TCP 프로토콜 지원, SSL 및 TLS 지원, DB 로그 관리 지원 등과 같은 다양한 기능 지원
- 인증 관련 로그를 ihduser 사용자의 터미널에 나타나도록 rsyslog.conf 파일에 설정하는 내용 : authpriv.* ihduser
logrotate
- 로그 파일을 여러개로 분할해주는 프로그램
- 로그 파일의 자동 로테이션 기능, 압축 기능, 제거 기능을 지원
- 각 로그 파일은 하루, 일주일, 한 달 단위로 로테이션 할 수 있다.
- 시스템과 관련된 기본적인 로그 설정 : /etc/logrotate.conf
- 응용 프로그램 /etc/logrotate.d 디렉터리 내에 위치하여 로그 파일 관리
- 명령행에서 logrotate를 직접 사용가능하다. 하지만, 현재 리눅스에서는 /etc/cron.daily 디렉터리에 등록되어 있다. cron에 의해 스케줄링 되어 실행되고 있다.
xferlog
- FTP 등을 통해 파일이 전송된 기록이 저장된 로그 파일
- /var/log/xferlog 에 위치함
- direction : 전송 방향을 나타내며 o(outgoing) 과 i(incoming)이 있다. 전송된 지시를 나타내는 영역이다.
- access-mode : 사용자가 로그인 하는 방법 (a: 익명 사용자, g: 게스트 사용자, r: 로컬 사용자). 사용자가 어떤 형태로 login 했는지 나타내는 영역.
- completion-status : 전송상태 나타냄 (c: 완전한 전송상태, i: 불완전한 전송상태)
- transfer-type : 전송 유형 나타냄 (a: ASCII 전송, b: 바이너리 전송)
- special-action-flag : 특별한 조치 (c: 파일압축, u: 파일압축해제, T: 파일 아카이브, _: 아무 action 도 발생하지 않음)
sudo
개요
- 특정 사용자 또는 특정 그룹에 root 사용자 권한을 가질 수 있게 하는 도구
- visudo 명령어 : 환경설정파일을 편집할 때 사용
- /etc/sudoers 파일 : 환경설정 파일
- 적용된 사용자는 'sudo 명령어' 형태로 실행하며 root 권한을 대행함
보안도구
tcpdump
- 조건식을 설정하여 네트워크 인터페이스를 거치는 패킷 헤더 정보 출력
nmap
- 네트워크 탐지 도구 및 보안 스캐너로 시스템의 서비스 중인 포트를 스캔하여 관련 정보를 출력. 운영 중인 서버에 불필요하게 작동하고 있는 서비스 포트를 확인할 수 있음
nessus
- 가장 많이 사용하는 취약점 스캐너
tripwire
- 원래 파일의 무결성을 체크할 수 있는 프로그램
John the Ripper
- 사용자 보안 강화를 위해 단순한 패스워드를 설정한 사용자를 찾아서 경고 조치를 시행함
find
find [경로] [-옵션] [옵션내용]
- name : 파일명으로 탐색
- perm : 파일의 권한으로 탐색
[-] : 설정된 권한의 모든 것이 설정된 파일을 찾는 것
[+] : 설정된 권한 중 하나라도 설정된 파일 찾는 것
- group
rpm
개요
- Red Hat Package Manage
- 설치 및 갱신 모드, 제거 모드, 질의 모드, 검증 모드, 소스 rpm(.src.rpm) 의 리빌드 모드
[사용법]
$ rmp [option] [패키지_파일명]
1. 설치 및 갱신 (install & update) 모드 https://starrykss.tistory.com/1878
- 새로운 패키지를 설치하거나 갱신(update)할 수 있다
[주요 옵션]
-i : 새로운 패키지를 설치할 때 사용. 기본적으로 이전 버전의 같은 패키지가 있을 경우 설치 되지 않음 --install
-U : 기본 패키지를 새로운 버전의 패키지로 업그레이드 할 때 사용. 만약 설치된 패키지가 없을 경우에도 새로운 버전을 설치할 수 있음 (이 때는 -i 와 같음) --upgrade
-F : 이전 버전이 설치되어 있는 경우에만 설치 --freshen
-v : 메시지 자세히 보여줌
-vv : 메시지를 아주 자세히 보여줌
-h : 설치 상황을 # 기호 표시해줌 --hash
--force : 기존 버전이 설치되었을 경우처럼 강제로 설치할 때 사용
--nodeps : 의존선 무시. rpm 설치 시 의존성 관계에 있는 패키지가 존재하지 않을 경우 설치가 되지 않는데, 이럴 때 강제로 설치할 때 사용
--test : 실제로 파일에 기록하는 작업을 제외한 대부분을 테스트할 때 사용. 패키지를 실제 설치하기 전에 제대로 설치되는지 테스트해 볼 경우 사용. 보통 -vv 와 같이 사용
--rebuilddb : 특정한 패키지 설치 후 rpm 패키지를 검색 했으나, 나타나지 않을 때 rpm db 를 업데이트할 때 사용
2. 제거 모드
- 설치된 패키지 제거
- 패키지 제거 시 -e 옵션 사용
- 다른 패키지에 대한 의존성이 발생한 경우 제거되지 않는다
[주요 옵션]
-e : 설치된 패키지 삭제, 의존성을 갖는 패키지가 있는 경우 삭제되지 않음, --erase
--nodeps : 의존성을 갖는 패키지가 있어도 삭제
--test : 실제로 제거하지 않고 테스트
--allmatches : 동일한 이름을 갖는 패키지가 중복 설치되어 있는 경우 모두 제거
3. 질의모드
- 패키지 관련 정보를 알아내기 위해 -q 옵션 사용
[주요 옵션]
-q : 질의 시 꼭 사용해야 하는 옵션. 패키지를 찾으면 패키지 이름과 버전만 표시. --query
-i : 설치된 패키지의 정보 출력. -p 옵션과 같이 사용하면 rpm 패키지 파일에 대한 정보 알 수 있음. --info
-l : 패키지에서 설치한 모든 파일 정보 출력. -p 와 함께 사용하면 rpm 패키지 파일이 설치되는 목록 파일을 알 수 있음. --list
-a : 시스템에 설치된 모든 패키지 목록 출력 --all
-p 패키지 파일명 : rpm 패키지의 파일에 대한 정보를 보여줌. 이 옵션을 사용하려면 패키지 파일명을 정확히 알아야 함
-f 파일명 : 지정한 파일을 설치한 패키지 이름 출력
-c : 해당 패키지의 설정 파일이나 스크립트 파일 출력
-d : 해당 패키지의 문서 파일 출력
-R : 어떤 패키지에 의존하고 있는지 보여줌. 해당 패키지가 설치되거나 동작 시 필요한 패키지 목록을 보여줌. --requires
-changelog : 특정 패키지의 바뀐 내역을 최근부터 연대순으로 보여줌
--scripts : 설치 및 제거 관련 스크립트를 보여줌
--filesbypkg : rpm 패키지가 많을 경우, 목록으로 보이는 파일 앞에 패키지 명을 붙임
--queryformat : 질의의 결과를 원하는 형태로 출력할 때 씀. C 언어의 printf() 함수의 동작 방법과 유사함
4. 검증보드
- rpm DB 에 저장되어 있는 패키지의 메타데이터 정보를 이용하여 변경된 정보를 찾아내는 모드
- -V(--verify) 옵션을 사용한다
5. 리빌드(rebuild) 모드 : rpmnuild
- rpm 소스 파일인 .src.rpm 파일을 패키지 파일로 만드는 모드
- rpmbuild 명령어 사용
디스크 확장 (마운트)
개요
- 하드 디스크 용량이 부족할 경우 디스크를 추가 장착하여 용량을 늘릴 수 있다 https://starrykss.tistory.com/1861
stat : timestamp 전보 확인
touch : timestamp 수정 및 생성
Q 시스템 전체에서 Set-UID 가 설정된 파일을 전부 찾는 명령은?
find / -type f -perm -4000
: / 아래에 있는 -perm 4000(Set-UID) 설정된 -type f(파일) 을 find 찾겠다
perm 4000 : 정확히 같은 권한을 가진 파일을 찾는다
perm -4000 : 부여한 권한을 만족하는 파일을 전부 찾는다
perm /4000 : 부여한 권한을 하나라도 만족하는 파일을 찾는다