기타/리눅스마스터 1급

[1028] 가.실무의이해 > B.시스템 이해 > ii) 리눅스의 구조

가. 실무의 이해 
  A. 운영체제와 리눅스
  i) 운영체제
  1. 역할(3), 2. 역사(1940~), 3.특징(13), 4. 종류(데스크톱(3), 모바일(6), 스마트TV(4), IVI(5), 웹)
  ii) 리눅스 철학과 역사
  1. 철학(3), 2. 라이선스(6), 3. 역사(1991~),
4. 활용(클러스터
(3), 임베디드 시스템, 클라우드 컴퓨팅(3), 빅데이터, 사물인터넷)
  B. 시스템 이해 
  i)리눅스와  하드웨어
  1. 리눅스와 하드웨어(8), 2.RAID(2,디스크설계), 3.LVM(PV,PE,VG,LV)
  ii) 리눅스 구조
  1. 부트매니저(LILO,GRUB), 2.디렉터리 구조(14), 3. 부팅과 셧다운(6), 4. 파일시스템(XFS), 5. X윈도(GDM,KDM), 6. 셸 Shell(bash), 7. 프로세스(standalone,inetd)

ii) 리눅스 구조 

1. 부트매니저

부트매니저 1. 부팅을 도와줌
2. =부트로더 
3. 하드디스크 맨앞 MBR(마스터부트기록)에설치
    =부트섹터 =0번섹터, 512Byte =부트매니저프로그램, 파티션 정보 기록. 
 
GRUB 1. GNU에서 만든 부트로더 
2. /boot/grub/brub.conf

[a] : grub.conf에서 커널과 관련된 매개변수추가.  ex) [a]+[1] 싱글모드 진입
[e] : 편집모드, 현재만 일시적용
e-줄편집, d-줄삭제, o-아래줄추가O-윗줄추가d-최종편집으로부팅시작
[c] : 상호대화식 Bash Shell과 유사 
tab-자동완성, esc- 취소
  #boot=/dev/sda
default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title CentOS (2.6.27.7)
root (hd0,0)
kernel /boot/vmlinuz-2.6.27.7 ro root=LABEL=/1
initrd /boot/initrd-2.6.27.7.img
title CentOS (2.6.18-92.el5PAE)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-92.el5PAE ro root=LABEL=/1
initrd /boot/initrd-2.6.18-92.el5PAE.img
#boot=/dev/sda
부팅 하드디스크지정(1개면주석처리됨)
default=0
부팅기본순서 0이 첫번째
timeout=10 
10초 대기후 default값으로 부팅
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
GRUB화면 배경이미지
(fd0)
/dev/fd0
(hd0)
일반 IDE, S-ATA, SCSI 등 첫번째 하드디스크
/dev/sda or /dev/hda
(hd0,0)
/dev/sda1 or /dev/hda1
(hd0,2)
/dev/sda3 or /dev/hda3

2. 디렉터리 구조

/boot   부팅시 필요한파일
GRUB, 
/dev   실제 물리적장치 파일화 
하드디스크, CD-ROM
/etc   시스템환경설정, 부팅과 관련 스크립트파일 
/home   개인사용자 파일 디렉터리
/lib 라이브러리 커널 모듈도 있음
/lost+found   fsck명령어 파일시스템복구시 작업 디랙터리 RHEL 7부터 사용안함
/mnt   CD-ROM, 플로피디스크, 하드디스크, 등 마운트할때 포인터가 되는 디렉터리 
/media, /net 추가제공. 
/misc   자동 마운드 프로그램 autofs에 의해사용. 
/proc   가상파일시스템, 프로세스 상태정보, 하드웨어, 기타 시스템 정보 
/root   루트사용자 홈디렉터리
/sbin System Binary 시스템 명령어, root가 보통 사용.   
시스템종료, 네트워크인터페이스 설정, 점검 복구
/tmp   임시저장
/user   시스템 운영에 필요한 명령, 응용프로그램 위치 
/var   로그파일, 스풀링 등 가변적 데이터 보관. 
메일서버 

3. 부팅과 셧다운 

부팅 루트파일시스템(/) 읽기전용 마운트후 검사-> 쓰기형태로 다시 마운트 -> init 프로세스 발생.   
init /etc/initab : 부팅 실행레벨
/etc/init/rcS.conf :   시스템초기화 
/etc/init/rc.conf : rc스크립트 지정 실행
/tc/rc.d/rc.local : 사용자 부팅시 필요한 구동 설정. 
 
레벨 /etc/initab 에 정의 , 마지막 8번째는 S, s로 유지보수점검시 안전모드  
0 시스템종료  
1 단일사용자, root 사용자로 관리자 모드 root패스워드잊어버렸을때
/boot/grub/grub.conf password삭제
2 네트워크 미사용 다중사용자  
3 네트워크 사용 다중사용자  
4 사용자 정의  
5 X윈도 사용 다중 사용자 모드  
6 시스템 재부팅  
로그인 /etc/issue : 로컬 사용자 로그인메시지
/etc/issue.net 텔넷 네트워크 접속시메시지
/etc/motd : 로그인 접속사용자 메시지 
 
shutdown shutdown -r now 즉시 재부팅
shutdown -h now 즉시 종료
shutdown -h +10 10분뒤 종료. 
shutdown -h 10  "종료함" 10분뒤 종료&메시지
shutdown -c       취소
shutdown -h 23:59  11시 59분종료
       
-r : reboot
-h : halt
-c : 취소
-k : 실제 셧다운 하지 않고 메시지만접속사용자전송
reboot reboot 즉시 재부팅 
reboot -w 재부팅안하고 /var/log/wtmp기록만저장
 
halt 로컬접속사용자 사용가능. 
halt 시스템 종료. 
 
poweroff 시스템종료, 전원끔.   
init init 0 즉시 종료. 
init 6 즉시재부팅
init 1 단일사용자모드로 
사용권장안함

4. 파일시스템

- ext3부터 저널링기능 추가됨. 현재XFS 많이 사용. 

ext4구조
부트섹터 블록그룹1 블록그룹2
  슈퍼블록/그룹디스크립터테이블/블록비트맵/아이노드 비트맵/아이노드테이블/데이터블록  
  슈퍼블록 : 파일시스템 모든 정보 갖고있음.  백업을 많이함. 
아이노드 테이블 : i-node(파일고유번호) -> (i-node 테이블:용량클때추가)-> 데이터블록위치 가르킴
데이터 블록 : 실제저장

i-node : 15개 만 표시 -> x128개 (i-node 테이블:용량클때추가) -> x128개 (i-node 테이블:용량클때추가)
 
항목 ext2 ext3 ext4(RHEL6) ext4(RHEL7) XFS(RHEL6) XFS(RHEL7)
시작년도 1993 2001 2006    
최대파일크기 2GB 2TB 16TB 16TB 100TB
[8EB]
500TB
[8EB]
최대 파일시스템 크기 4TB 16TB 16TB
[1EB]
50TB
[1EB]
300TB
[16EB]
500TB
[16EB]
하위디렉터리 생성 최대수 32000 32000 65000 제한없음
mkfs 파일시스템만들기  

5. X윈도

XFree86 (1992)
X.org (2004)
 
키보드  마우스 스크린  <-> X Server  <-> Xclient (브라우저, xterm)

                                                            <-----네트워크----> Xclient(xterm)
디스플레이 매니저 XDM
GNOME 의 GDM , KDM
명령어 startx -- {인자값}  인자값으로 윈도우를 실행시킴
xhost  현재 접근가능 클라이언트 목록
xhost + 모든 클라이언트접속 허용
xhost - 모든 클라이언트 접속 차단. 
xhost +{ip} ip 접속 허가. 
xhost -{ip} ip 접속 제거.  

xauth 접근허가
환경변수 $ echo $DISPLAY
#export DISPLAY ="{ip}:0.0"  X클라이언트 프로그램을 ip로전송
#export DISPLAY ="{ip}:0.1"  X클라이언트 프로그램을 ip 첫번째 실행 X서버 두번째 모니터로 전송. 
DE 인터페이스 스타일, 데스크톰환경 윈도메니저 Movie Player 이미지뷰어 음악
  KDE KWin, KWM   kdegraphics  
  GNOME Mutter, Metacity totem eog Rhythmbox
사진편집(GIMP), 노래방파일(KMid), 이미지(ImageMagick), 문서(evince, LibreOffice)


6. 셸 : 커널과 사용자간 다리역할

HW 커널 OS
<-----------------------과거 셸의 범위 ---------------->     
<--------------------------------------------------------------------------현재 셸의 범위 -------------------------->   
    유닉스 최초셸  켄 톰프슨 멀틱스 셀 모형화
  1977 sh
스티븐 본 본셀(sh)
- 유닉스버전 7 기본셸
C셸계열

1978 csh 빌조이 C셸(csh)
- 명령 히스토리, 별명, 작업제어, 편집기능안됨
1981 tcsh 켄그리어(테넥스+C셸)
- 명령 완성, 명령 편집
  1983 ksh 스티븐 콘 ksh(콘셸)
-  본셸 + 벨연구소사용자요청 C셸 
- 작업제어, 히스토리, Vi&Emacs스타일 편집, 명령행 완성 
  1989 bash 브라이언폭스 GNU프로젝트 위해 개발 배시셸 = Bourn Agin Shell , 본셸기반. 
GNU 운영체제, 리눅스, 맥OS X, 리눅스 표준셸 
sh와 호환,  ksh, csh의 유용한 기능 참고
- 명령 히스토리, 별명, 완성, 치환, 편집 지원 포직스와 호환. 
  1997 Dash (데비안 Almquist sheall) 포직스 호환되는 /bin/sh를 가능한작게 구현한셸, 빠른작업
 = NetBSD의 ash에서 파생
  데비안 우분트 기본셸
- Bash와 비교 매우작고 처리속도빠름, 히스토리 지원않함

 

echo $SHELL
chsh -l
cat /etc/shells
셸의 확인
chsh -> 비번 -> 셸정보 ex /bin/csh  셸의 변경
/etc/passwd 의 7번째 필드 사용자 로그인셸 
변수명=값  -> echo $변수명 변수지정
mkdir $HOME/data 자신 홈경로 안에 data 디렉터리추가
PATH=$PATH:$HOME/data PATH에 자신홈경로안 data 추가
env | tail 셸의 환경을 정의하는 중요한 역할 변수 
/etc/profile 
/etc/profile.d
/etc/bashrc
~/.bash_profile
~/.bashrc
~/.bash_logout
모든사용자 환경변수, 시작프로그램
일반사용자 alias,  설정스크립트
모든사용자 적용 alias
개인사용자 환경변수, 시작프로그램
개인사용자 적용 alias
개인사용자 로그아웃시 설정
~abc
~.
''
" "
`pwd`
#
$
&
*
?
()
\
[abc]
[a-c]
[!0-9]
;
<
>
/
!
abc 사용자 홈디렉토리   물결(tilde)
현재디렉토리
작은따옴표 : 모든 문자 특수문자 일반문자로
큰따옴표:  $, \ 제외 모든문자 일반문자
역따옴포 : 명령문실행 결과출력 
주석
변수
후작업
모든문자
한문자 대체
subshell 셸단위로 묶어줌
탈출(escape)문자
or조건으로 묶음
a부터c까지 알파벳소문자
숫자가아닌문자
shell 명령분리자
입력재지정
출력재지정
디렉터리 분리
history

 

환경변수

HOME 사용자홈 경로
PATH 실행파일 경로
LANG 셸 기본실행언어
TERM 로그인터미널종류
PWD 현재경로
SHELL 사용자로그인셸
USER 사용자이름
DISPLAY X윈도 프로그램실행시출력창
PS1 프롬프트(Prompt) 변수
PS1="[\u\@\t]"  \t=> 프롬프트변수
\d : 요일 월 일 
\h : 호스트이름
\s : 사용중셸
\t : hh24
\T : hh12
\@: hh12 + AM/PM 추가. 
\u: 현재사용자이름
\w : pwd 
\W : 마지막 경로
\! : 현재명령의 히스토리넘버
\\  : \ 표시 
PS2 프롬프트(Prompt) 변수2
HOSTNAME 시스템호스트명
MAIL 도착메일저장경로
TMOUT 로그아웃 대기초
UID 사용자 UID

 

배시셸

설명 bash
배시셸
1. 자동완성 [TAB]  
2. 히스토리 history
history 3
명령어목록
최근 3개

HISTFILE
HISTSIZE
HISTFILESIZE
HISTCONTROL
HISTTIMEFORMAT
히스토리파일경로
히스토리명령어줄수
히스토리파일크기
중복명령어기록유무 -ignoreboth :중복저장안함
history 출력시간형식 "%Y.%m.%d %T"
!!
!2
!-2
!a
!?al
가장최근명령실행
목록번호2번실행
뒤에서 2번째명령실행
최근에서 a시작명령실행
최근 al 문자포함명령실행
.bash_history 로그아웃시도 저장
3. 별명 .bashrc 재부팅,재로그인시사용위해설정
alias
alias ls='ls -alF'
\ls
unalias ls
별명목록출력
ls 실행하면 ls -alF실행
기본명령어 실행
ls명령해제
4. 명령행편집 [Ctrl] +[b] /[Ctrl] +[f]
[ESC] +[b] /[ ESC ] +[f]
[Ctrl] +[a] /[Ctrl ] +[e]
[ESC]+[<-] /[Ctrl] +[d] 
[Ctrl] +[k]
[Ctrl] +[u]
[Ctrl] +[y]
커서 왼쪽/오른쪽한칸
커서 왼쪽/오른쪽한단어
커서 제일 왼쪽/오른쪽
커서 왼쪽/오른쪽한단어
커서 왼쪾 행전체
행 전체 삭제 
삭제취소
5. 명령형치환 ls -l 'which passwd'
ls -l $(which passwd)
 
6. 그룹명령
()
||

%%
입력한 순차실행
() 우선실행
or 앞 명령이 성공이면출력 아니면 뒤출력
앞 수행해야 뒤수행
7. 표준입출력 0
1 or 생략
2
abc 2>/dev/null
표준입력
표준출력
표준에러
abc 에러면 버림
8. 리다이렉션 >
>>
<
<<
표준출력에서 다른출력
파일에 출력
표준입력에서 다른입력
기호뒤문자까지입력받음
9. 파이프  a | b
tee
ls -l |tee list.txt|more
a의 결과를 B의입력
파이프연결 동시처리
목록list.txt저장, 화면출력
10. 작업제어 kill -l
1 SIGHUP  
2 SIGINT    
3 SIGQUIT  
9 SIGKILL   
15 SIGTERM 
18 SIGCONT  
19 SIGTSTP   
kill 목록보기 
SIGHUP  끊다(Hangup) 데몬설정바꿀때 재시작시사용
SIGINT    키보드에서 차단(interrupt) =[ctrl]+[c]
SIGQUIT  키보드에서  중지(QUIT) = [ctrl]+[\]
SIGKILL   종료(KILL)
SIGTERM 정상종료(terminate)
SIGCONT  중지를실행(continue)
SIGSTOP  터미널입력 정지 (STOP) 시그널
SIGTSTP   실행정지후 다시실행계속위해 대기  = [ctrl]+[z]
0 시스템종료
1 단일사용자, root 사용자로 관리자 모드
2 네트워크 미사용 다중사용자
3 네트워크 사용 다중사용자
4 사용자 정의
5 X윈도 사용 다중 사용자 모드
6 시스템 재부팅
ntsysv --level 5
chkconfig --list
chkconfig --list abc
chkconfig --level 35 abc on
chkconfig --level 5 --del abc
chkconfig abc off
chkconfig telnet on
실행레벨 5의 서비스 데몬을 설정
각 실행레벨에서의 서비스 설정상태 
abc 서비스의 상태보기
실행레벨 3,5에 대해 abc서비스 on 
레벨 5에서 abc삭제
2,3,4,5 abc off

11. 산술연산  echo $[3**3]
expr 3 \* 3
echo $[expr 3+2 \* 3**3]
3의 3승 붙일것. 
3 X 3   띄울것.
5  - 연산자 반드시 띄울것
12 프롬프트기능 PS1 명령대기줄 이름변경 = 환경변수 PS1변경. 
13 확장된 내부명령어  set
env
export
unset
셸 변수 출력 셸환경, 관련변수, 함수등도 
환경변수 출력명령어
특정변수범위 전송 프로세스에서도 특정변수사용. 
선언된변수제거
셸스크립트 #!/bin/bash  셸스크립트 시작
$0
$1
$#
$$
$*
$@
$?
$-
 셸스크립트 명
첫번째 아규먼트
아규먼트 갯수
셸스크립트 pid
모든변수를 각각 연결해서 보여줌 문자인식위해 따옴표필요
모든변수를 공백으로 연결해서 보여줌
실행뒤 참이면 0, 거짓이면 1반환
shell호출시 사용한 옵션들
var=value                                      #var변수에value저장
var=`ls abc 2>&1 > /dev/null`        #명령실행결과
var=$(ls abc 2>&1 > /dev/null`)
var=$(var:=value)                          # var 에  null 아니면 그대로 사용 없으면 value
${var:+value}                                 # var가 null 이면 1회사용
$(#abc)                                          #문자열 길이반환
$(abc:2:3)                                      # 2번째글자부터 3자
\f
\n
\r
\t
\\
페이지이동 (form feed 종이 이동)
새 (new) 로운줄
앞으로이동(carriage return)
\
[string]
[a -eq b]
[! a]
[-b file]
[-c file]
[-d file]
[-f file]
string 비어있지않으면 참. 
두 표현식같으면 참
a가참이면 거짓
파일이 블록디바이스면 참
파일이 문자디바이스면 참
파일이 디렉터리면참
파일이 존재하고 정규파일이면 참
if []
then
       실행문장
elif []
then 
       실행문장2
else
        실행문장 3
fi
 
case  "$abc" in
   "a")
        실행문장
    ;;
   "b" | "c")
        실행문장2
    ;;
   *)
        실행문장3
    ;;
esac
 
options=("옵션 1" "옵션 2" "옵션 3" "종료") 
# select 문 시작  - 사용자와 상호작용
select choice in "${options[@]}"; 
       do 
            case $choice in 
                "옵션 1") echo "옵션 1이 선택되었습니다." 
                ;;
                "옵션 2") echo "옵션 2가 선택되었습니다."
                ;;
                "옵션 3") echo "옵션 3이 선택되었습니다."
                ;;
                "종료") echo "프로그램을 종료합니다."
                 break
                ;;
                *)  # 잘못된 입력에 대한 처리 echo "유효하지 않은 선택입니다."
                 ;;
           esac
      done
for i in {1..5}; 
      do
            echo "숫자: $i"
     done
while ["$var" -le 3]   #참일동안
     do
              echo $var
     done
until ["$var" -le 3]   #거짓일동안
     do
              echo $var
     done
함수
함수이름(){명령줄}
function 함수이름(){명령줄}
패턴 #
variable="prefix_text_prefix" 
echo ${variable#_}
echo ${variable##_}
패턴 %
variable="prefix_text_prefix"
echo ${variable#_}
echo ${variable##_}
# 순방향패턴
text_prefix
#순방향 최장일치패턴
prefix
# 역방향패턴
prefix_text
# 역방향 최장일치패턴
prefix

 

7. 프로세스

프로세스 1. 실행중이 프로그램
2. PCB(실행제어블록)가진 프로그램
3. 프로그램 카운터 가진 프로그램
4. 능동적개체로 순차적 수행. 
 
pstree
ps
exec ps -l
jobs
프로세스트리
pid확인 
새로운 프로세스 할당. 
작업프로세스보기  + 실행후 - 실행됨
 
포어그라운드 프로세스
백그라운드 프로세스

종료까지 기다림 (jobs -> fg %2 2번작업번호 포어그라운드로)   
뒤에서 실행 (끝에  &추가로붙여 실행 or bg 명령어 )
 
데몬의 실행
standalone
inetd
/etc/rc.d/init.d 
 rc0.d~rc6.d 디렉터리 

부팅시 실행, 항상동작,종료시 종료
요청시 실행, 후에 xinetd
시스템제공 서비스 시작 중지=service

/etc/rc.d/init.d/httpd stop    아파치 종료. 
/etc/rc.d/httpd start  아파치 시작 
ntsysv 
chkconfig