[Linux] 리눅스 환경 정보 확인 총정리

728x90

리눅스 환경 확인

1. OS 및 OS Bit :

uname -a
cat /etc/release

 2.  CPU 및 CPU 갯수

  • CPU 정보 : cat /proc/cpuinfo
  • CPU 갯수 : grep "physical id" /proc/cpuinfo | sort -u | wc -l

 3.  코어 수, 쓰레드 수

  • 코어 수 : grep -c processor /proc/cpuinfo
  • 쓰레드 수 :

4. MEMORY 

  • MEMORY : cat /proc/meminfo | grep MemTotal
  • 1024 나누기 한 다음 1000으로 또 나누기
  • kB → GB : 1e+6(1,000,000)으로 나누기

5. DISK

  • DISK : lsblk -d -o name,rota # HDD는 1, SSD는 0
  • lsblk -d
  • fdisk -l : 각각 용량 확인

CPU 관련 사항 확인

#cpu info 정리
cat /proc/cpuinfo
cat /proc/cpuinfo | more
dmesg | grep cpu

# CPU 비트 확인(x86, x64)
 arch

#cpu 물리 갯수
grep "physical id" /proc/cpuinfo | sort -u | wc -l

# cpu 코어 갯수
grep -c processor /proc/cpuinfo

#cpu 코어 정보
grep "cpu cores" /proc/cpuinfo | tail -1

#메모리 정보
cat /proc/meminfo | grep MemTotal
free

# 디스크 공간 통계 보기
df -h

# DISK 정보 확인
 lsblk -d -o name,rota  # HDD는 1, SSD는 0
 cat /proc/scsi/scs             -- scsi
 cat /proc/ide/hda/model    -- hda
 cat /proc/mdstat                -- raid
 /proc/ide/                         -- 아래에는 하드가 몇개인지
 /proc/ide/hda/                  -- 아래에는 그 하드에 대한 여러 정보

# DISK 용량 확인
 df -h               -- 디스크 파티션, 용량 정보 → 나오는 정보 : Size  Used Avail Use% Mounted on
 fdisk -l           -- 하드디스크 확인
 du -sk             -- 현재 폴더의 사용량(kb)
 du -sk /home       -- /home 폴더의 사용량(kb)

# NETWORK 정보 확인
 cat /proc/net/netlink
 ifconfig -a

# 리눅스 버전 확인
 uname -a
 uname -r
 cat /proc/version
 rpm -qa *-release
 cat /etc/*-release 

# 리눅스 배포본 확인
 cat /etc/hedhat-release
  Red Hat Enterprise Linux Server release 4.7 (Santiago)

# rook-ceph으로 묶인 디스크 총량, 할당량, 사용량
kubectl exec -it -n rook-ceph  $(kubectl get po -n rook-ceph |grep tools | awk '{print $1}') -- /usr/bin/ceph osd status
728x90

'IT_Engineer > Unix & Linux (Bash)' 카테고리의 다른 글

[Linux] 서버 사용량을 체크하는 df와 du  (0) 2021.07.20
[Linux] NET-TOOL 설치하기  (0) 2021.06.11
[Linux] TAR 압축 묶기/풀기  (0) 2021.01.18
[Linux] AWK와 SED  (0) 2020.12.08
[Linux] 정규 표현식  (0) 2020.12.07

댓글()

[Linux] AWK와 SED

728x90
텍스트 처리를 위한 유틸리티는 대표적으로 sed(stream editor)와 awk가 있음

1. AWK

  • awk
    데이터를 조작하고 리포트를 생성하기 위해 사용하는
    언어 리눅스에서 사용하는 awk는 GNU 버전의 gawk로 심볼릭 링크되어 있음
  • 간단한 연산자를 명령라인에서 사용할 수 있으며, 큰 프로그램을 위해 사용 가능
    awk는 데이터를 조작할 수 있기 때문에 쉘 스크립트에서 사용되는 필수 툴이며,
    작은 데이터베이스를 관리하기 위해서도 필수
  • Alfred Aho, Peter Weinberger, Brian Kernighan 3명의 제작자 이름 이니셜을 가져와서 awk

1.1 awk 프로그래밍 형식

  • awk 를 입력하고, 작은따옴표로 둘러싸인 패턴이나 액션을 입력,
    마지막에 입력 파일 이름 파일 이름을 지정하지 않으면 키보드 입력에 의한 표준 입력을 받음
  • awk는 입력된 라인들의 데이터들을 공백 또는 탭을 기준으로 분리,  
    $1부터 시작하는 각각의 필드 변수로 분리하여 인식

! AWK 형식

  • awk 'pattern' filename
  • awk '{action}' filename
  • awk 'pattern {action}' filename
  • 예시
$ vi awkfile 
홍 길동 3324 5/11/96 50354 
임 꺽정 5246 15/9/66 287650 
이 성계 7654 6/20/58 60000 
정 약용 8683 9/40/48 365000 

$ awk '{print $0}' awkfile 
> 
홍 길동 3324 5/11/96 50354 
임 꺽정 5246 15/9/66 287650 
이 성계 7654 6/20/58 60000 
정 약용 8683 9/40/48 365000 

$ awk '{print $1}' awkfile
> 홍 임 이 정 

$ awk '/길동/' awkfile 
> 홍 길동 3324 5/11/96 50354 

$ awk '/정/{print "\\t안녕하세요? " $1, $2 "님!"}' awkfile 
> 안녕하세요? 임 꺽정님! 안녕하세요? 정 약용님! 

$ awk '/홍/{print $1, $3}' awkfile 
> 홍 3324 $ df | awk '$4 < 100000' : |을 이용해 파이프라인 생성 
> devfs 368 368 0 100% 638 0 100% /dev
   map -hosts 0 0 0 100% 0 0 100% /net 
   map auto_home 0 0 0 100% 0 0 100% /home

! AWK 동작 원리

  1. awk는 파일 또는 파이프를 통해 입력 라인을 얻어와
    $0라는 내부 변수에 라인을 입력 각 라인은 레코드라고 부르고, newline에 의해 구분
  2. 라인은 공백을 기준으로 각각의 필드나 단어로 나뉨 필드는 $1부터 시작. 많게는 100개 이상의 필드 저장 가능
  3. 내장 변수인 FS라고 부르는 필드 분리자가 공백을 할당받음
    필드가 콜론/대시와 같은 문자에 의해 분리되면 새로운 필드 분리자로 FS의 값 변경 가능
  4. awk는 화면에 필드를 출력할 때 print 함수를 사용
  5. 콤마는 출력필즈 분리자(OFS)와 매핑되어 있으며 공백을 할당받음

! OFMT 변수

  • 숫자를 출력할 때 숫자 포맷 제어할 경우 사용. 간단히 printf를 사용할 수도 있지만, OFMT를 지정할 수 있음.
  • default는 %.6g로 소수점 6자리
$ awk 'BEGIN{OFMT="%.2f"; print 1.23412, 15E-3}' > 1.23 0.01

! printf 함수

  • 포매팅된 깔끔한 출력을 할 경우 사용
  • newline을 제공하지 않기 때문에 newline이 요구되면 \\n을 사용해야함
  • c : 문자, d : 10진수, f : 실수, x : 16진수
  • ``이 붙으면 좌측에서 시작되고 기본형이면 우측에서 시작
$ awk '{printf "The name is %-20s Number is %4d\\n", $1" "$2, $3}' awkfile
> The name is 홍 길동 Number is 3324
The name is 임 꺽정 Number is 5246
The name is 이 성계 Number is 7654
The name is 정 약용 Number is 8683

! awk -f 옵션

  • awk 액션과 명령이 파일에 작성되어 있다면 f 옵션을 사용
awk -f [awk 명령파일] [awk 명령을 적용할 텍스트 파일]
$ vi awkcommand {print "안녕하세요 " $1, $2"님"} {print $1, $2, $3, $4, $5}

$ awk -f awkcommand awkfile
> 안녕하세요 홍 길동님 홍 길동 3324 5/11/96 50354
안녕하세요 임 꺽정님 임 꺽정 5246 15/9/66 287650
안녕하세요 이 성계님 이 성계 7654 6/20/58 60000
안녕하세요 정 약용님 정 약용 8683 9/40/48 365000

! 레코드와 필드

  • 레코드- awk는 입력 데이터를 볼 수 없지만 포맷 또는 구조는 볼 수 있음. 각 라인(레코드)은 newline으로 분리
    - NR 변수 : 각 레코드들의 번호는 awk의 빌트인 변수 NR에 저장/ 레코드가 저장된 다음 NR의 값은 하나씩 증가
$ awk '{print NR, $0}' awkfile
> 1 홍 길동 3324 5/11/96 50354
2 임 꺽정 5246 15/9/66 287650
3 이 성계 7654 6/20/58 60000
4 정 약용 8683 9/40/48 365000

 

  • 필드
    - 빌트인 변수 FS는 입력 필드 분리자의 값을 가지고 있음
    - Default는 공백과 탭/ FS값 변경을 위해서는 F를 사용, F 다음 오는 문자가 새로운 필드 분리자
$ vi awkfile_FS 홍 길동 :3324 :5/11/96 :50354 임 꺽정 :5246 :15/9/66 :283502
$ awk -F: '/홍/{print $1, $2}' awkfile_FS > 홍 길동 3324
$ awk -F'[ :\t]' '/홍/{print $1, $2}' awkfile_FS > 홍 길동


! awk와 정규표현식

  • 정규표현식은 슬래시로 둘러싸인 문자들로 구성된 패턴
$ awk '/^정/{print $1, $2, $3}' awkfile > 정 약용 8683
$ awk '/^[A-Z][a-z]+ /' awkfile2 > Hong KilgDong 3324 5/11/96 50354
  • match 연산자(~) : 표현식과 매칭되는 것이 있는지 검사하는 연산자
$ awk '$2 !~ /g$/' awkfile2 : 2번 필드가 g로 끝나지 않는 라인 출력 > Lee Seongkye 7654 6/20/58 60000

 

  • POSIX 문자 클래스
$ awk '/[[:lower:]]+g[[:space:]]+[[:digit:]]' awkfile2 > Hong KilgDong 3324 5/11/96 50354


! 비교 표현식

  • 어떤 상태가 참일때만 액션이 수행
$ awk '$3 > 7000{print $1, $2}' awkfile > 이 성계 정 약용

 

  • 조건 표현식
    • 표현식을 검사하기 위해 ?와 :를 사용. if/else가 하는 역할과 같은 결과를 의미
$ awk '{max={$1 > $2) ? $1 : $2; print max}' filename if $1 > $2: max = $1 else: max = $2
  • 산술 연산자
    • 계산을 통해 필터링 가능
  • 논리연산자
    - && : AND 연산
    - || : OR 연산
    - ! : NOT 연산
$ awk '$3 > $5 && $3 <= 100' filename

1.2 awk 변수

  • BEGIN 패턴
    - awk가 입력 파일의 라인들을 처리하기 이전에 실행되며 액션 블록 앞에 놓임
    - 입력 파일 없이 테스트할 수 있고, 빌트인 내장 변수(OFS, RS, FS)들의 값을 변경할 경우 사용
  • END 패턴
    어떤 입력 라인과도 매칭되지 않고, 입력 모든 라인이 처리된 후 실행됨
    - BEGIN만 사용할 경우, 아규먼트 파일명을 적지 않아도 되지만
      END 블록을 사용할 경우엔 반드시 아규먼트 파일을 적어야 함
$ awk '/Tom/{count++}END{print "Tom was found " count " times."}' awkfile5
  •  
  • awk 리다이렉션
    - awk결과를 리눅스 파일로 리다이렉션할 경우 쉘 리다이렉션 연산자를 사용
    - 파일명은 큰따옴표로 둘러쌰아 함
    - > 심볼이 사용될 때 파일이 오픈되고 잘려짐
$ awk -F: '$4 >= 60000 {print $1, $2 > "new_file"}' awkfile5
  • getline 함수
    - 표준 입력, 파이프, 현재 처리되고 있는 파일로부터 입력을 읽기 위해 사용
      입력의 다음 라인을 가져와 NF, NR, FNR 빌트인 변수를 설정
    - 레코드가 검색되면 1을 리턴하고, 파일의 끝이면 0을 리턴. 에러가 발생하면 -1을 리턴
$ awk 'BEGIN{ "date " | getline d; split(d, year) ; print year[6]}' > 2009
$ awk 'BEGIN{while (getline < "/etc/passwd" > 0)lc++; print lc}' filename
  • awk 파이프
    - awk 프로그램에서 파이프를 오픈하고 다른 파이프를 오픈하기 전에 기존 파이프는 닫기
    - 파이프 심볼의 오른쪽 명령은 큰따옴표(““)로 둘러싸야 한다
  •  
$ awk '{print $1, $2 | "sort-r"}' cars

      - END블록에 close를 사용해 파이프를 꼭 닫아줘야 함

$ awk '{print $1, $2 | "sort -r"} END{close("sort -r")}' cars

2. SED

  • 정규 표현식을 사용하고, 기본 입출력은 표준 입력과 출력을 사용
  • 파이프를 통해 한쪽의 출력을 다른 쪽으로 넘길 수 있음
  • 주어진 주소 범위에 대해 입력의 어떤 줄을 처리할 것인지 결정
  • 주소 범위에는 라인 번호 또는 패턴을 사용 가능
    ex) 5d라고 하면 다섯 번째 라인을 삭제 windows/d는 “windows”를 포함하는 모든 라인을 삭제

2.1 sed 동작 원리

  • sed 스트림 에디터는 한번에 하나의 파일/ 하나의 입력으로부터 한 라인만 처리, 모니터로 출력
  • vi 에디터에서 사용 가능하며, 저장된 라인은 패턴 공간이라고 부르는 임시 버퍼에서 처리
  • 임시 버퍼에 있는 라인의 처리가 한번 끝나면 임시 버퍼에 있는 라인은 모니터로 출력
  • 라인이 처리된 다음 임시 버퍼에서 라인은 제거, 다음 라인이 임시 버퍼로 읽혀지고 처리/출력
  • 예제
    • 입력의 8번째 줄을 삭제
    /^$/d
    • 빈 줄을 모두 삭제
    1,/%$/d
    • 첫 줄부터 처음 나타내는 빈 줄까지 삭제
    /Jones/p
    • “Jones”를 포함하는 줄만 출력 (-n 옵션 사용)
    s/GUI//g
    • “GUI”가 나오는 줄에서 GUI를 ‘‘로 변경(삭제)
  • 8d
728x90

댓글()

[Linux] 정규 표현식

728x90

1. 정규표현식 정의

  • 검색에서 사용할 매칭되는 같은 문자들의 패턴

2. 메타 문자

  • 정규 표현식에서는 문자 그대로의 의미 이상으로 해석되는 메타문자 (문자들의 집합) 사용

※ 메타문자 연산자와 효과

연산자 효과
. 모든 문자 1개와 일치
? 앞에 존재하는 문자가 있을수도, 없을수도 있을 경우 사용
* 앞에 존재하는 문자가 0번 혹은 그 이상 반복되는 문자를 찾을 때 사용
+ 앞에 존재하는 문자가 1번 혹은 그 이상 반복되는 문자를 찾을 때 사용
[] 대괄호 사이에 존재하는 문자들 중 하나에 일치
[a-z] a부터 z까지 모든 영문자 소문자와 일치
^ 대괄호 사이에 존재할 때는 부정 [^a], 대괄호 밖에서는 문자 열의 시작과 일치
$ ^와 반대로 문자열의 끝과 일치할 경우
{N} 정확히 N번 일치
{N,} N번 또는 그 이상 일치
{N, M} 적어도 N번 일치하지만 M번 일치를 넘지 않음
\b 단어 끝의 공백 문자열
\B 단어 끝이 아닌 곳에서의 공백 문자열
\< 단어 시작에서의 공백 문자열을 의미. \<linux : linux 문자열로 시작하는 단어를 포함한 라인(vi, grep)
\> 단어 끝에서의 공백 문자열을 의미. linux\> : linux 문자열로 끝나는 단어를 포함한 라인

 


3. 확장 브래킷

※ 확장 브래킷과 각 브래킷 별 의미

브래킷 의미
[:alnum:] [A-Za-z0-9] 알파벳 문자와 숫자로 이루어진 문자열
[:alpha:] [A-Za-z] 알파벳 문자
[:blank:] [\x09] 스페이스와 탭
[:cntrl:] 컨트롤 제어 문자
[:digit:] [0-9] 숫자
[:graph:] [!-~] 공백이 아닌 문자(스페이스, 제어 문자들을 제외한 문자)
[:lower:] [a-z] 소문자
[:print:] graph와 유사하지만 스페이스 문자를 포함
[:punct:] [!-/:-@[-'{-~] 문장 부호 문자
[:space:] [\t\v\f] 모든 공백 문자(newline 줄바꿈, 스페이스, 탭)
[:upper:] [A-Z] 대문자
[:xdigit:] 16진수에서 사용할 수 있는 숫자
   
   
   

4. Vim에서 정규 표현식을 사용한 검색 예시

  • vim에서 ESC키를 누르고 /검색할 문자열 형태를 입력하고 엔터를 누르면 검색 가능
  • /없이$ : 없이로 끝나는 문자열 검색
  • /...자 : 4개 문자로 구성된 문자열 중 마지막 문자가 “자”로 끝나는 문자열 검색
  • /l*ve : l로 시작되는 문자부터 ve로 끝나는 모든 문자열 검색
  • /[Ll]ove : Love, love
728x90

댓글()

[Linux] 리눅스의 부팅 과정과 로그인 쉘 #2

IT_Engineer/Unix & Linux (Bash)|2020. 11. 20. 08:59
728x90

4. 변수

  • 변수 타입
    • 쉘 변수들은 대문자로 정의하며 2가지의 변수 타입을 가지고 있음
    • 전역 변수
      • 전역 변수 또는 환경 변수들은 모든 쉘에서 사용할 수 있으며, env 명령을 사용하면 환경 변수들을 출력해볼 수 있음
      • echo $PATH : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  이런식으로 나오는데 쉘은 명령어를 찾을 때마다 이 디렉토리를 순서대로 검사함
      • 추가하고 싶으면 vi ~/.bash_profile 에서 export PATH=$PATH:/path/to/add 로 추가
    • 지역 변수
      • 지역 변수는 현재의 쉘에서만 사용할 수 있음. 옵션 없이 set 빌트인 명령을 사용하면 환경 변수를 포함해 모든 변수들과 함수들의 목록을 보여줌
    • 다음 변수는 배시 쉘 프로그래밍 부분에 작성(문자열 변수, 정수형 변수, 상수형 변수, 배열 변수)
  • 변수 생성
    • 변수들은 기본적으로 대문자로 생성. 숫자를 포함할 순 있지만 숫자로 시작할 수 없음
    • = 앞뒤로 공백이 없어야 한다. VAR="value" 이런식!
    • 변수를 출력할 경우엔 echo 를 사용.  echo $VAR, echo "$VAR", echo "${VAR}" 모두 동일 기능 수행
    • ★ 큰따옴표(““)를 쓰면 $str의 실제 값을 출력할 수 있고(변수의 값) 작은따옴표(‘‘)를 쓰면 그냥 $str이란 문자열 자체를 출력함!
    • 밖에 큰따옴표를 쓰고 작은따옴표는 안에 쓰는 경우가 많음

4.1 지역 변수를 환경 변수로 만들기

  • 현재 쉘에 만든 변수들은 현재 쉘에서만 사용할 수 있음. 이 경우 export 빌트인 명령을 사용하면 지역 변수를 환경 변수로 만들 수 있음
  • 해제는 unset
  • 자식 쉘에서 export 명령을 사용한다고 해서 부모 쉘에 영향을 주지는 못함
  • ★ 특수 파라미터 변수들 (중요)
    • $* : 1부터 시작하는 위치 파라미터의 확장, 큰 따옴표로 구분하고 IFS 특수 변수의 첫 문자로 구분되는 각 파라미터의 값 하나의 단어를 확장하며, 전체 파라미터값을 가짐 만약 IFS가 NULL이거나 해제되어 잇으면 파라미터는 스페이스로 구분
    • $@ : 1부터 시작하는 위치 파라미터의 확장 큰 따옴표로 확장되면 각 파라미터는 하나의 구분 단어로 확장, 전체 파라미터값을 가짐
    • $# : 십진수의 위치 파라미터 전체 개수를 의미
    • $? : 최근 실행된 포그라운드 파이프라인의 종료상태를 가지고 있음(0은 정상적으로 종료)
    • $- : 실행하자마자 set 내장명령 또는 쉘 자체에 의해 설정된 현재 옵션 플래그로 확장
    • $$ : 현재 쉘의 프로세스 ID
    • $! : 가장 최근에 백그라운드로 실행된 프로세스의 ID를 가지고 있음
    • $0 :쉘 또는 쉘 스크립트의 이름을 가지고 있음
    • $_ : 아규먼트 목록을 사용해 실행된 쉘스크립트의 절대 경로를 가지고 있음

5. 본 쉘

  • 본 쉘 shbang 라인 : 쉘 스크립트의 첫 라인에 #!/bin/sh를 입력해서 커널에게 이 파일은 본 쉘 스크립트라고 인지해야 함
  • 주석은 #을 사용
  • 와일드 카드 : ``,?,[] 는 파일명 확장을 위해 사용되고, <,>,2>,>>,| 문자들은 표준 IO를 위해 사용된다. 문자들이 인터프리터에 의해 해석되지 않도록 하기 위해선 인용부호(', '')로 감싸주면 됨
  • read : 사용자의 입력을 읽고 read 명령의 오른쪽에 적는 변수에 사용자 입력값을 할당
  • read word echo "입력한 단어는: $word"
  • 조건문
    • if~then 문장을 사용하며 if문의 끝에는 반드시 fi를 적어 if문이 끝났음을 표시
    if [표현식] then 명령 문장 블록 elif [표현식] then 명령 문장 블록 else 명령 문장 블록 fi
    • case문
    • case "$color" in blue) echo $color is blue ;; green) echo $color is green ;; red|orange) echo $color is red or orange ;; *) echo "Not a color" # default esac
  • 루프문 : while, until, for 3가지 종류가 존재
    • while : 뒤에 오는 명령이나 표현식이 treu면 계속해서 do와 done 사이 문장 실행
    • until : while와 비슷하지만 until 뒤에 오는 명령이 false가 될 때까지 do와 done 사이 문장 실행. 거의 사용하지 않음
    • for : 단어목록을 통해서 반복, for 다음으로 변수 이름이 오고 in 다음 단어 목록이 온다. 그리고 do와 done 키워드 사이의 문장을 수행
  • 파일 테스팅 : test은 상태 표현식을 판단하기 위해 사용
    • 파일, dir, plain 텍스트, 읽을 수 있는 파일 등의 속성을 테스트하기 위해 옵션을 가지고 있음
    • d : 디렉터리인지 테스트
    • f : 파일인지 테스트
    • r : 현재 사용자가 읽을 수 있는지 테스트
    • s : 파일 크기가 0보다 큰지 테스트
    • w : 현재 사용자가 파일에 쓰기 가능한지 테스트
    • x : 현재 사용자가 파일을 실행할 수 있는지 테스트
    #!/bin/sh if [ -f file ] then echo "file exists" else echo "file not found" fi if [ -d file ] then echo "file is a directory" else echo "file is not a directory" fi if [ -s file ] then echo "file is not of zero length" else echo "file size is zero length" fi if [ -r file -a -w file ] then echo "file is readable and writable" else echo "file is not read/write" fi
    • 함수
    • #!/bin/sh lister(){ echo "현재 디렉터리는 'pwd'입니다" echo "현재 디렉터리 파일은 아래와 같습니다" ls } lister

5.1 배쉬 쉘 문법과 구조

  • 대부분의 리눅스에서 기본 쉘로 bash(Bourne Again SHell) 쉘을 사용하고 있음
  • 로그인 과정
    1. init 프로세스 생성
    2. getty 프로세스 생성
    3. 로그인 프롬포트를 보여줌
    4. /bin/login 프로그램이 실행되고 로그인 아이디를 입력하면 로그인 패스워드 입력을 기다림
    5. 입력받은 패스워드가 정확하면 환경 설정이 초기화되고 로그인 쉘을 시작
    6. /etc/profile 시스템 파일을 찾아 명령 라인에서 실행
    7. 유저의 홈디렉터리에 있는 유저의 초기 파일인 .bash_profile 파일 실행, .bashrc 라는 환경 파일을 실행
    8. 달러($) 기호를 모니터에 보여주며 유저의 명령을 기다림

5.2 배시 쉘 옵션 설정을 위한 set, shopt 명령

  • set 명령어는 특수한 빌트인 내장 옵션들을 켜고, 끄는 역할을 함
  • set -o : 쉘의 설정값 출력
  • set -o option : 옵션을 사용, set +o option : 옵션을 사용하지 않음
  • set -[a-z] : 옵션을 사용하는 단축형
  • set +[a-z] : 옵션을 사용하지 않는 단축형
  • shopt 명령은 배시 쉘에서 사용되는 set 명령으로 새로운 버전의 쉘 옵션 내장명령어. p 옵션을 사용해 모든 옵션을 출력해볼 수 있으며, u 옵션을 사용해 옵션 셜정을 off할 수 있고, s 옵션을 사용해 on할 수 있음

5.3 배열

  • 배시 쉘은 1차원 배열 생성을 지원. 배열은 하나의 변수 이름에 숫자 목록, 이름 목록, 파일 목록 등의 단어 목록 집합을 할당할 수 있음. 빌트인 함수 declear -로 x[0] 형태로 생성
  • 배열의 요소를 가져올 때에는 ${배열명[index]} 형식을 사용하며 ar 옵션을 사용하면 읽기전용 배열이 생성
  • 배열 요소의 개수를 파악할 경우엔 ${#names[*]}을 사용
  • 배열의 인덱스를 사용해 특정 인덱스에만 값을 넣을 수 있음

5.4 함수

  • 쉘의 컨텍스트 안에 명령들의 그룹 이름을 사용한다(자식 프로세스가 생성되지 않음)
  • 함수가 한번 정의되면 쉘 메모리에 적재되기 때문에 함수가 호출될 때 디스크로부터 읽어들일 필요가 없음/ 함수는 스크립트의 모듈을 향상시키기 위해 사용
  • 실행될 때 프롬프트에서 정의될 수 있지만 대부분 유저의 초기화 파일(.bash_profile)에 정의 그리고 함수는 호출되기 이전에 반드시 정의되야 함
  • 함수 정의
    • 본 쉘 방식 : 함수명을 적고 빈 괄호를 적은 다음 함수 정의
    • function 키워드를 사용. 컬리 브레이스({) 앞뒤에는 반드시 공백이 있어야 함
    • 정의 부분은 세미콜론(;)으로 분리된 명령어들로 구성되며, 마지막 명령어는 세미 콜론(;)으로 끝나야 함
  • declare -F 명령을 실행하면 정의되어 있는 함수명을 출력할 수 있으며, unset -f 함수명을 사용해 현재 쉘에서 정의한 함수를 제거할 수 있다

6. exec 명령

  • 새로운 프로세스를 시작하지 않고 현재 프로그램을 대신하여 사용 가능 표준 출력 또는 표준 입력은 서브쉘을 생성하지 않고 exec 명령으로 변경 가능 만약 파일이 exec 명령으로 오픈되면 파일의 끝까지 한 라인씩 읽게 됨

7. 파이프

  • 파이프 심볼(|)의 왼쪽 명령의 결과를 가져와서 오른쪽 명령의 입력으로 사용하도록 함
  • who | wc -l
    • 파이프는 3단계의 처리를 수행
    • who 명령의 결과값이 커널 버퍼로 보내지고, wc -l 명령은 버퍼로부터 데이터를 읽은 다음, 결과를 모니터 스크린으로 보냄
728x90

댓글()

[Linux] 리눅스의 부팅 과정과 로그인 쉘 #1

IT_Engineer/Unix & Linux (Bash)|2020. 11. 19. 08:59
728x90

1.init

  • init과 연결된 수많은 프로세스들이 자신만의 프로세스 ID(PID)를 가지고 생성되기 시작
  • init의 PID는 1
  • init 프로세스가 시스템을 초기화하고 터미널 라인을 오픈하기 위한 작업을 시작하고, 표준 입력과 표준 출력, 표준 에러를 설정
  • ps -ef 를 입력하면 PID와 같이 출력
    • 표준 입력 (0): 키보드로부터 입력받는 것
    • 표준 출력 (1) / 표준 에러(2) : 모니터로 출력하는 것
  • 그 이후 로그인 프롬포트를 보여줌
  • init 프로세스는 /etc/rc.d/init.d 에 런레벨 별로 설정되어 있는 쉘 스크립트를 실행. 이 스크립트들은 chkconfig 명령을 사용해 부팅 시 자동으로 실행할지, 실행하지 않을지 설정
  • 부팅 시 수행할 런레벨은 /etc/inittab에 설정되어 있음 (우분투 : /etc/init/rc-sysinit.conf!)
  • 런레벨은 0부터 6까지 존재, 주로 텍스트 모드 런레벨인 3번(주로 서버)과 그래픽 모드 런레벨인 5번을 주로 사용(주로 데스크탑) 현재는 level 2를 사용
  • rc1.d, rc2.d, rc3.d, rc4.d, rc5.d, rc6.d에 설정 파일이 들어가있음 (runlevel configuration)
  • K로 시작하는 것은 kill, S로 시작하는 것은 Start를 의미하며 파일의 prefix를 수정하면 바로 반영

2. 로그인 프롬프트

  • /bin/login 프로그램이 /etc/passwd 파일에 있는 첫 번째 필드를 체크하기 위해 유저 아이디를 검증하고, 존재하면 패스워드 검증
  • 패스워드가 맞다면 /etc/passwd 파일의 마지막에 설정되어있는 SHELL 변수에는 로그인 쉘을, USER와 USERNAME 변수에는 로그인 이름을 할당
  • 로그인이 끝나면 /etc/passwd 파일에서 유저 라인의 마지막 단계에 입력되어 있는 프로그램을 실행. 일반적으로 배시 쉘로 설정되어 있음
  • 쉘 초기화 파일들
    1. /etc/profile
      • 시스템 전역 쉘 변수 초기화
      • 유저가 쉘에 로그인하면 가장 먼저 이 곳의 파일을 읽음. 이 파일에는 PATH, USER, LOGNAME, MAIL, HOSTNAME, HISTSIZE, INPUTRC 등의 쉘 변수들이 선언되어 있음
      • 전역 리드라인 초기화 파일인 /etc/inputrc 파일을 읽어들이도록 되어 있으며, 프로그램들의 전역 환경을 설정하는 파일을 포함하고 있는 /etc/profile.d 디렉터리를 읽어들이도록 구성되어 있음
    2. /etc/bashrc
      • 쉘 함수와 Alias를 위한 시스템 전역 변수 정의
    3. ~/.bash_profile
      • 유저 개인의 환경 설정 파일
      • 시스템 전역이 아닌 유저 자신만의 PATH와 시작 프로그램을 추가적으로 설정
    4. ~/.bashrc
      • 유저 개인의 Alias 및 변수 설정 파일
      • 유저 자신의 개인적 명령어 앨리아스를 정의할 수 있으며, /etc/bashrc 파일에서 시스템 전역 변수를 읽은 다음, 특별한 프로그램을 위한 변수를 설정할 수 있음
    5. ~/.bash_logout
      • 로그아웃 설정 파일
      • 로그아웃 절차를 포함하고 있음. ex) 로그아웃하면 터미널 윈도우가 사라짐
    6. source 명령
      • 쉘 환경 설정 파일 즉시 적용하기. . 명령도 같은 기능을 수행
    7. zsh의 경우 ~/.zshrc 에 설정 파일이 존재!
  • 명령 라인 파싱
    1. 히스토리 치환
    2. 명령라인은 토큰 또는 단어 단위
    3. 히스토리 업데이트
    4. 인용 진행
    5. 앨리아스 치환 / 함수 정의
    6. 리다이렉션, 백그라운드, 파이프 설정
    7. 변수 치환이 수행
    8. 명령 치환이 수행
    9. globbing 이라는 파일명 치환이 수행
    10. 명령이 실행
  • 명령어 타입
    1. alias
    2. 키워드
    3. 함수
    4. 빌트인 내장명령
    5. 실행 파일

3. 프로세스와 쉘

  • 프로세스 : 유일한 PID 번호에 의해 식별될 수 있는 실행 프로그램
    • 실행 프로그램의 데이터와 스택, 프로그램 포인터와 스택 포인터 그리고 프로그램을 실행하기 위해 필요한 모든 정보들로 구성
    • 쉘 : 로그인 프로세스를 완료했을 때, 시작하는 특별한 프로그램으로 프로세스임
  • 커널 : 프로세스를 제어하고 관리

3.1 시스템 콜

  • 쉘 스크립트로부터 명령을 실행했을 때, 빌트인 내부 코드 / 디스크 저장장치에서 명령을 찾고 실행된 명령을 정렬
  • 커널 영역의 기능을 사용자 모드가 사용 가능하게,
    즉 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 해줌
  • fork 시스템 콜 : 콜프로세스의 복사본을 생성
    • 자식 프로세스는 fork가 호출된 다음 실행하고 두 프로세스는 CPU 공유. 자식 프로세스는 부모 프로세스의 환경, 오픈된 파일, 실제적 유저 ID, umask, 현재 작업 디렉터리, 시그널의 복사본을 가짐
    • 명령을 실행했을 때 아래와 같은 Flow를 가짐
      1. 쉘은 명령 라인을 파싱하고 첫 단어가 빌트인 명령인지, 디스크에 존재하는 실행 명령인지 판단
      2. 빌트인 명령 -> 곧바로 처리
      3. 디스크에 존재 -> 부모 쉘의 복사본을 만들기 위해 fork 시스템 콜 호출
      4. 자식 프로세스는 명령을 찾기 위해 PATH에 정의되어 있는 경로 검색하고 리다이렉션, 파이프, 명령 치환, 백그라운드 프로세싱을 위한 파일 디스크립터를 설정
      5. 자식 프로세스가 동작하는 동안 부모 프로세스는 잠시 멈춤
  • wait 시스템 콜 : 자식 프로 세스 하나가 종료될 때까지 부모 프로세스를 대기상태로 유지
    • wait가 성공하면 자식 프로세스가 종료되고, 종료상태를 가지고 있는 자식 프로세스의 PID를 리턴
    • 자식 프로세스가 종료되기 전 부모 프로세스가 종료된다면, init 프로세스는 자식 프로세스를 고아가 된 좀비 프로세스로 만듬
    • 부모를 대기상태로 만드는 것 + 프로세스가 정상적으로 종료하도록 보증하는 역할
  • exec 시스템 콜 : 터미널에 명령을 수행한 다음, 쉘은 새로운 쉘 프로세스를 fork. 자식 쉘은 타이핑된 명령을 수행
    • 쉘은 프로그램을 위해 PATH를 검색 -> 프로그램이 발견되면 명령의 이름과 함께 exec 시스템 콜을 호출
    • 커널은 이 프로그램을 메모리에 로드하며 자식 쉘은 새 프로그램으로 오버랩
    • 새 프로그램은 자식 프로세스가 되고 실행을 시작(모든 환경 변수, 오픈 파일, 유저 정보를 물려받음)
  • exit 시스템 콜 : 중지
    • 자식 프로세스를 종료할 때 자식 프로세스는 sigchild 시그널을 보내고 자식의 종료상태를 부모 프로세스가 받아들이도록 대기
    • 종료상태는 0~255의 숫자이며 0은 성공적으로 실행되었단 뜻
    • 0이 아닌 종료상태는 프로그램 실행 실패했다는 뜻
  • 프로세스 종료하기
    • CTRL-C 또는 CTRL-\\ 키를 이용해 종료할 수 있으며, kill 명령을 사용해 종료할 수 있음.
728x90

댓글()

[Linux] 쉘과 명령어 기초 #4

IT_Engineer/Unix & Linux (Bash)|2020. 11. 18. 09:00
728x90

! 시스템 관리자 명령어 정리

유저와 그룹

  • user : 현재 로그인하고 있는 유저들을 출력. who -q와 동일
  • groups : 현재 쉘에 접속해 있는 유저가 속해 있는 그룹을 출력. GROUPS 환경 변수를 출력, 그룹 이름이 아닌 그룹 번호만 가지고 있음
  • chown, chgrp : 소유자, 소유자 그룹 변경
  • useradd, userdel : 유저를 추가, 삭제할 때 사용하는 명령
    • adduser : useraddd에 심볼릭 링크되어 있음
    • 유저를 추가한 다음, passwd [유저 아이디]를 통해 패스워드 지정
    • 유저를 삭제할 때, 유저 디렉터리까지 삭제하고 싶으면 r 명령을 사용
  • usermod, groupmod : 그룹 이름이나 아이디 변경시 사용
  • id : 유저의 아이디, 그룹아이디, 소속된 그룹명 등을 출력
  • lid : 유저가 소속되어 있는 그룹 출력
  • who : 현재 로그인되어 있는 유저 목록 출력
  • `w`` : 모든 유저에 대한 정보 출력. who 명령의 확장
  • logname : 현재 유저의 로그인명
  • su : 한 유저가 다른 유저로 전환. 유저가 주어지지 않으면 기본적으로 슈퍼 유저(root)로 설정
  • sudo : 슈퍼 유저(root) 또는 다른 유저로 명령을 실행
    • /etc/sudoers 파일에 정의되어 있음
  • passwd : 유저의 패스워드를 생성/변경
  • ad : /var/log/wtmp 파일로부터 유저의 로그인 시간을 시간 단위로 출력
  • last : /var/log/wtmp로부터 모든 유저의 마지막 로그인 시간을 출력. reboot 아규먼트를 사용하면 reboot한 날짜, 시간을 출력
  • newgrp : 자신이 소속된 그룹을 새 그룹으로 변경/추가하지만 현재 쉘을 빠져나오면 초기화됨

터미널

  • tty : 현재 유저의 터미널 출력 -> /dev/ttys000 라고 나옴
  • stty : 터미널 설정을 출력하거나 변경할 수 있음
  • setterm : 터미널의 설정갑을 변경
  • tset : 터미널 설정을 초기화 하고 터미널 타입을 출력
  • mesg : 다른 유저가 자신의 터미널에 접근하는 것을 제어, mesg y : 자신의 터미널에 쓰기 허용, 기본 설정. mesg n : 자신의 터미널에 쓰기 불허
  • wall : 접속해 있는 모든 유저에게 메시지를 전송할 때 사용
  • write : 유저를 지정해 메시지를 발송할 경우 사용

정보와 통계

  • uname : 커널 정보와 같은 시스템 정보를 출력해 볼 수 있음
  • arch : 시스템 아키텍처를 출력. uname -m 명령과 동일
  • lastlog : /var/log/lastlog 파일을 참고해 모든 유저의 마지막 로그인 시간을 출력
  • lsof : 오픈된 파일의 목록을 출력. i 옵션을 사용하면 오픈되어 있는 네트워크 소켓 파일들을 출력할 수 있음
  • strace : 주어진 명령을 실행할 때 호출하는 시스템 콜과 시그널을 추적하는 명령
  • ltrace : 주어진 명령을 실행할 때 호출하는 라이브러리 콜을 추적하는 명령
  • nc : TCP와 UDP 포트 커넥션과 리슨을 출력. 포트 접속을 위해서는 호스트명과 포트번호를 아규먼트로 사용하면 되고, z 옵션과 포트번호 범위를 지정하면 포트로 접속이 가능한 상태인지 체크할 수 있으며, 검색할 포트 범위는 1-80 형식을 사용함
  • free : 메모리와 캐시 사용량을 Byte 단위로 출력
    • 해당 명령어를 사용하면 used free shared buffers cached이 나타남. 이와 관련된 내용은 링크를 참고
  • procinfo : /proc 파일 시스템에 대한 정보를 출력
  • lsdev : 설치된 디바이스 장치들의 목록을 출력
  • du : 디스크 파일 사용량을 출력. 재귀적으로 출력하며 특정 디렉터리를 지정 가능.
    • h : 킬로바이트 단위로 출력 / sh : 현재 디렉터리 아래의 전체 용량을 출력
  • df : 파일시스템의 파티션 사용량을 출력.
    • h : M, G 단위로 출력
  • dmesg : 부팅 시 콘솔에 출력된 메세지들을 출력
  • stat : 주어진 파일의 각종 정보를 출력
  • vmstat : 버추얼 메모리 통계 출력
  • netstat : 현재 네트워크 통계와 정보를 출력. 현재 오픈되어 있는 포트 목록을 출력하고자 한다면 lptu 옵션을 사용
  • uptime : 현재 시간과 시스템이 종료/재부팅되지 않고 계속 운영되고 있는 기간, 현재 접속자 수, 평균 부하를 출력. load average가 3 이상이면 시스템 성능이 현저히 떨어짐
  • hostname : 시스템의 호스트명을 출력
  • hostid : 호스트 머신을 32비트 16진수 숫자의 식별자로 출력
  • readelf : elf 바이너리 파일의 정보 출력
  • size : 바이너리 실행 파일 또는 아카이브 파일의 세그먼트 크기를 출력

시스템 로그

  • logger : 시스템 로그를 기록하는 명령이며, 로그는 /var/log/messages 시스템 로그 기록 파일에 저장
  • logrotate : 시스템 로그 파일을 관리하기 위해 사용하며, 로테이트, 압축, 삭제, 이메일 발송 등의 기능을 사용
    - 일반적으로 cron을 사용해 주기적으로 logratete를 실행해 로그 파일을 관리
    - 환경 설정 파일로는 /etc/logrotate.conf 파일을 사용

잡 컨트롤

  • ps : 현재 실행중인 프로세스 통계(PID, 프로세스 실행 시간, 실행 유저 등)를 출력.
          트리 형식으로 출력하기 위해선 -forest 옵션을 사용
    • ps -ef 를 자주 사용
  • pgrep, pkil : 이름 또는 다른 속성을 사용해 시그널 프로세스를 검색
  • pstree : 프로세스 목록을 트리 형식으로 출력, p 옵션을 사용하면 프로세스 아이디도 출력
  • top : 전반적인 시스템 상황을 출력하며 기본값으로 3초마다 refresh
  • nice : 스케줄링 우선권을 조정해 프로그램을 실행하는 명령
    • 아무런 옵션도 주어지지 않을 경우 nice는 상속받은 현재의 스케줄링 우선권을 출력
    • 조정수치가 생략되면 명령의 nice 값은 10이 됨. 음의 수치까지 부여할 수 있으며 -20 ~ 19까지 조정할 수 있음
    • renice 명령으로 실행 중인 프로세스의 우선권을 변경할 수 있으며, skill, snice 명령으로 시그널을 보내거나 프로세스 상황을 리포팅 할 수 있음
    • Ss, S<, Ss+, SN 등으로 표기
  • nohup : 적은 명령에 대해 Hangup(프로세스 중단) 신호를 무시한 채 수행하도록 하는 명령
    • nohup.out 파일에 출력 내용을 추가
    • 자동으로 백그라운드로 보내지 않기 때문에 명령행 뒤에 & 문자를 추가해 실행하거나 명시적으로 백그라운드로 실행
    • 실행 파일을 백그라운드로 실행(&)하고 현재 쉘을 종료해도 실행 파일의 수행이 중단되지 않음
    • bash 쉘 옵션 중 huponexit은 현재 쉘을 빠져나갈 때 SIGHUP 시그널(정지 신호)을 모든 job에게 보내는 옵션인데, 이 옵션의 기본값은 off라 현재 쉘을 종료하더라도 백그라운드로 실행된 프로세스는 종료되지 않고 계속 실행
    • nohup python execute.py > output & 등으로 사용
  • pidof : 실행중인 프로세스 아이디를 검색, 출력
  • fuser : 파일 또는 소켓을 사용하고 있는 프로세스를 출력
  • cron : 수퍼유저용/일반유저용 스케줄러
    • /etc/crontab 파일에 설정이 존재하며, 설정별 실행할 파일들은 /etc/cron.hourly 디렉터리에 위치

프로세스 관리와 부팅

  • init : 모든 프로세스의 부모 프로세스(PID 1번)이며 부팅시 /etc/inittab 파일에 런레벨을 결정
  • service : 시스템 서비스를 시작하고 중지하기 위해 사용
    • 리눅스 시작스크립트 원본 경로는 /etc/rc.d/init.d 또는 심볼릭 링크된 /etc/init.d이며, 부팅 시 7개의 런레벨별 시작 스크립트 위치는 /etc/rc.d 디렉터리 아래에 런레벨별 디렉터리 명으로 존재
    • service cron restart 등으로 사용

네트워크

  • ifconfig : 네트워크 인터페이스 환경을 출력하고 튜닝하는 유틸리티. eth0은 첫번째 이더넷 카드를 의미하고, lo는 로컬호스트 루프백을 의미
    • ifconfig eht0 down : 네트워크 사용 중지. 시작은 up
  • iwconfig : 무선랜 네트워크 인터페이스 환경을 출력해주는 명령이며, ifconfig와 유사하지만 무선랜 장치만 보여줌
  • ip : 라우팅, 디바이스, 라우팅과 터널 정책을 출력하고 조작할 때 사용
  • route : 커널 라우팅 테이블 정보를 출력하거나 변경. ip route list와 동일한 내용 출력
  • chkconfig : 시스템 서비스를 위한 런레벨 정보를 업데이트하고 검색
  • tcpdump : 네트워크 패킷을 실시간으로 출력해볼 수 있음
    tcpdump tcp port 21 을 실행하면 21번 포트로 통신하는 패킷들을 출력

파일시스템

  • mount : 파일 시스템을 마운트하기 위해 사용. 파일 시스템을 가지는 디바이스는 하드 디스크의 파티션, 플로피 디스크, CDROM, USB 같은 외장 디바이스, 램디스크 등이 해당
    • etc/fstab 파일을 보면 여러 설정 내용을 볼 수 있는데, 이 설정 파일을 부팅시 자동으로 읽어들여 마운트하고 부팅 후 파일 시스템과 디바이스를 지정하지 않고 수동으로 마운트하기 위해 사용
    • /etc/mtab 파일에는 현재 마운트되어 있는 파일 시스템 또는 파티션 정보가 저장되어 있음
    • mount -o loop -t iso9660 -r cd_image.iso /media/cdimg
  • umount : 마운트된 파일 시스템을 즉시 마운트 해제할 때 사용. 언마운트와 동시에 시디롬 드라이브에서 시디롬을 꺼내려면 eject 명령을 사용
  • sync : 업데이트된 모든 버퍼의 데이터를 강제로 하드 드라이버에 즉시 저장. 버퍼와 하드 드라이버 동기화 수행
  • losetup : 루프 장치를 정규 파일 또는 블럭 장치와 연결, 루프 장치와 분리, 루프 장치의 상태 파악을 하는 데 사용됨. 루프 장치 인자만 줄 경우에 해당하는 루프 장치의 상태를 보여줌
  • mkswap, dd : mkswap 명령은 스왑 파일 또는 스왑 파티션을 생성할 때 사용
    • dd if=/dev/zero of=swapfile bs=1024 count=8192
    • mkswap swapfile 8192
    • sync
    • swapon swapfile
  • swapon : 파일이나 파티션을 스왑으로 사용하도록 하는 명령
  • swapoff : 파일이나 파티션을 스왑으로 사용하지 않도록 하는 명령
  • mkfs.ext3 : 파티션이나 파일을 ext3 파일 시스템으로 만들 때 사용, mkfs 명령과 함께 t 옵션값으로 ext3를 지정해 파일 시스템을 생성
  • hdparam : 하드 디스크의 설정을 보여주거나 설정을 조정
  • fdisk [디바이스명] : 저장용 디바이스의 파티션 테이븡를 생성하거나 변경
    • /dev/hda : 첫 IDE 하드 드라이브
    • /dev/sda : 첫 SATA, SCSI 하드 드라이브
  • fsck.ext3 : ext3 파일 시스템을 체크, 수리, 디버그하는 명령. 단 mount된 파티션에 대해 파일 시스템 체크를 하면 해당 파티션에 문제가 발생할 수 있으므로 마운트를 해제한 다음, 파일 시스템 체크를 해야함!
  • badblocks : 저장 디바이스의 물리적인 배드 블록을 체크
  • lsusb : 장착되어 있는 USB 디바이스 목록 출력
  • lspci : 장착되어 있는 pci 디바이스 목록 출력
  • mkbootdisk : 시스템 구동을 위한 독립적인 부트 플로피 디스크를 만듬. iso 옵션을 사용해 부팅이 가능한 iso 파일로 만들 수 있음
  • mkisofs : iso9660 파일 시스템, 즉 CD 이미지를 만들 수 있음
  • chroot : root 디렉터리를 변경. 지정한 루트 디렉터리를 사용해 명령과 인터렉티브 쉘을 실행. 보안적 측면에서 유용함
  • lockfile : procmail 패키지에 포함되어 있음. lcokfile 명령으로 세마포어 잠금 파일, 디바이스, 리소스 등을 생성해 파일 접근을 관리할 수 있음. 잠금 파일이 존재하면 다른 프로세스의 접근이 제한됨
    • /var/lock 디렉터리에 잠금 파일을 생성하고 체크하며 rm -f [잠금파일명] 명령으로 삭제할 수 있음

백업

  • dump : 정교한 파일 시스템(ext2/ext3) 백업 유틸리티이며, -f 옵션을 사용해 네트워크 파일 시스템도 백업 가능
    dump 명령은 저수준 디스크 파티션을 읽고 바이너리 포맷의 백업 파일을 만듬. 이 파일들은 restore를 사용해 복원
  • fdformat : 플로피 디스크를 로우레벨 저수준으로 포맷

시스템 리소스

  • ulimit : 시스템 리소스 사용의 상한 제한값을 설정
    - f 옵션을 사용해 파일 크기 제한, c 옵션으로 코어덤프 크기를 제한
    - a옵션을 사용해 현재 시스템의 상한값을 출력해볼 수 있음

모듈

  • lsmod : 설치된 커널 모듈 목록을 출력. cat /proc/modules도 동일
728x90

댓글()

[Linux] 쉘과 명령어 기초 #2

IT_Engineer/Unix & Linux (Bash)|2020. 11. 16. 09:00
728x90

! 쉘(Shell) 이란?

  • 쉘(Shell)
    - 운영체제에서 제공하는 명령을 실행하는 프로그램,
    - 운영체제의 관리하에 있는 파일, 프린팅, 하드웨어 장치, 애플리케이션과의 인터페이스 제공
    - 키보드로부터 명령을 입력받아 OS가 그 명령을 수행하도록 하는 프로그램
  • 쉘 스크립트 : 인터프리터로서 리눅스 시스템 명령어들의 집합을 묶어서 프로그램화한 것
  • du -h * | sort -nr > $HOME/script.txt

! 쉘(Shell) 명령어

  • du : 용량을 알아보기 위한 명령어
  • | (shift + \) : 결과값을 다음 명령으로 연결해 다음 명령의 아규먼트로 사용
  • sort : 알파벳 또는 숫자 기준으로 정렬. -n : 숫자값을 기준으로 정렬, -r : 반대의 순서(내림차순)
  • > : 리다이렉션은 앞의 명령 결과를 다음에 나오는 파일명으로 저장
  • 리눅스 bash 쉘에서 $ 표시는 일반유저의 쉘을 의미하고 # 표시는 root 유저의 쉘을 의미
  • 쉘 스크립트를 작성할 때 스크립트의 최상단에 본 쉘인 경우 #!/bin/sh,
    배시 쉘인 경우 #!/bin/bash,
    파이썬일 경우 #!/bin/python 와 같이 실행할 언어를 지정
  • which 명령어 : 실행 파일의 위치
  • whereis는 명령의 실행 파일, 소스, 맨페이지의 위치를 검색하는 명령
  • 리눅스 파일 시스템
  • 쉘 스크립트 준비운동
  • 쉘 스크립트 구성요소
  • 리눅스 기본 명령어들의 형식
  • 다중 명령어 사용
  • 명령 히스토리

! 리눅스 디렉터리 여행

  • pwd : 현재 디렉터리 위치 보기
  • ls : 파일과 디렉터리 목록 보기
    • ls -l로 출력된 컬럼의 의미는 아래와 같음
    • [파일/디렉터리 퍼미션][하드 링크파일 수][소유자][그룹][파일 크기][수정 시간][파일명]
  • cd : 현재 쉘의 디렉터리 변경, 이동
  • less, more, cat : 텍스트 파일 보기
    • less는 q를 누르면 원래 셀 위치의 다음 라인으로 돌아오고, more는 q를 누르면 원래 쉘 위치로 돌아오지 않음, cat은 쉘 프롬포트를 리턴
  • file : 파일 타입 보기
  • tree : 디렉터리의 트리 구조 print
    • d : 디렉터리만 / a : 모든 것 / f : 파일만 / L : 디렉터리 깊이 지정
    • tree -L1 / : 최상위 root(/) 부터 깊이가 1인 디렉터리와 파일 출력

! 파일/디렉터리 퍼미션

  • 파일에 대한 접근 권한을 설정하는 것으로 `` 문자는 일반 파일, d 문자는 디렉터리, c 문자는 캐릭터 디바이스, b는 블록 디바이스, l 은 심볼릭 링크 파일, s는 소켓 파일
  • 그 다음 3개의 문자 단위는 파일 소유자의 read, write, execution, 그룹의 read, write, execution, 모든 사용자의 read,write,execution을 표시

! 하드 링크 파일 수

  • 하드 링크 : 리눅스상에서 동일한 파일시스템 내의 파티션에서 동일한 inode 정보를 가지는 파일
                    하드 링크가 복사는 아님!!!
  • ln 원본파일 하드링크파일명 명령을 사용해 하나의 링크 파일을 생성하면 원본 파일과 하드 링크 파일은 동일한 inode 정보를 가지게 되고, 어느 하나의 파일이 변경되면 두 파일 모두 동일한 내용과 크기로 변경
  • 심볼릭 링크 : ln -s 원본파일 심볼릭링크파일명을 사용하며 원본 파일의 이름만 링크. 원본 파일을 삭제하면
                      심볼릭 링크 파일은 가리킬 파일명이 삭제되었기 때문에 의미없는 파일이 됨

! 리눅스 기본 디렉터리 구성

  • / : 루트 디렉터리
  • /boot : 리눅스 커널과 부트로더가 위치하는 디렉터리
  • /etc : 시스템 환경 설정 파일이 위치한 디렉터리
    • /etc/passwd : 유저의 각종 정보 저장
    • /etc/shadow : 유저 패스워드를 암호화하여 저장
    • /etc/fstab : 시스템이 부팅될 때 참고하는 마운트할 디바이스 테이블을 저장
    • /etc/hosts : 네트워크 호스트 이름과 IP 주소
    • /etc/rc.d/init.d 또는 /etc/init.d : 부팅시 시작할 여러가지 시스템 서비스 스크립트
    • /etc/resolv.conf : 시스템에서 외부로 접속할 때 참고할 네임서버
    • /etc/sysconfig/i18n : 부팅시 언어셋 변수와 폰트 변수를 설정
    • /etc/sysconfig/iptables : 리눅스 방화벽 iptables 환경 설정
    • /etc/sysconfig/network : 부팅시 네트워크를 지우너할 것인지와 호스트명을 설정
    • /etc/sysconfig/network-scripts/ifcfg-eth0 : 부팅시 사용할 첫 이더넷 카드의 정보 저장
  • /bin, /usr/bin : 실행 프로그램들. /bin엔 기본적인 실행 프로그램, /usr/bin엔 사용자들이 사용할 실행 프로그램
  • /sbin, /usr/sbin : 시스템 관리자를 위한 프로그램. 대부분 root를 위한 프로그램
  • /usr : 사용자 애플리케이션을 지원하기 위한 다양한 파일이 위치
  • /usr/local : 소프트웨어 설치시 또는 로컬머신에서 사용할 파일들이 위치. 소스파일을 기본 옵션으로 컴파일하면 /usr/local 디렉터리에 기본 설치가 되며 이 때 실행 파일은 /usr/local/bin에 위치
  • /var : 운영 중인 시스템의 변화를 체크할 수 있는 로그 파일들이 위치
    • /var/log : 로그 파일이 위치하는 디렉터리
    • /var/spool : 메일 메세지와 프린트 작업과 같이 프로세스를 위한 큐를 잡아놓기 위해 사용되는 디렉터리
  • /lib : 공유 라이브러리 파일
  • /home : 유저별 홈디렉터리가 존재하는 개인 홈디렉터리. useradd(adduser) 명령을 사용해 유저를 생성하면 "/home/유저아이디 형식으로 유저 홈디렉터리가 생성. 이때 기본적으로 생성되는 파일들은 /etc/skel 디렉터리 아래의 파일들임
  • /tmp : 임시 파일들이 저장되는 디렉터리
  • /dev : 리눅스 시스템에서 사용하는 디바이스 장치 파일들
  • /proc : 이 디렉터리는 파일을 포함하지 않음. 현재 시스템 CPU 정보를 출력하기 위해 /proc/cpuinfo 파일을 출력
    • 현재 프로세스의 정보가 저장되어 있음
    • ps -ef를 입력하고 나오는 pid 이름으로 되어있는 폴더를 들어가보면 다양한 정보들이 나와있음
    • 해당 폴더에서 cat status를 입력하면 정보들이 나오는데 주로 봐야하는 것은 VmRSS, VmSwap 등이 있음. 스왑이 되면 어떻게 되는지 문서를 볼 것
  • /media, /mnt : 마운트 포인트를 위해 사용되는 디렉터리
    • 마운트 : 디바이스 장치를 사용하기 위해 프로세스와 연결하는 

 

728x90

댓글()

[Linux] 쉘과 명령어 기초 #1

IT_Engineer/Unix & Linux (Bash)|2020. 11. 13. 09:00
728x90

※ 사전 지식
리눅스
는 CLI (Command Line Interface - 명령어 기반 인터페이스),
그리고 그 명령어는 현재 머물고 있는 디렉토리를 대상으로 내려진다.

1. 디렉토리와 파일

현재 머물고 있는 디렉토리를 확인하기 위한 명령어는 pwd

$ pwd /root

 

'mkdir + 폴더이름' 명령어를 활용하여 폴더 생성

$ mkdir hello_gi

 

해당 디렉토리에 있는 내용 확인 명령어 : ls

  • 명령어 뒤에 '-' 기호를 붙여서 파라미터(옵션)를 줄 수 있음
$ ls
$ ls -l          #디렉토리 내용 자세히 확인
$ ls -al        #전체 내용 확인

 

디렉토리 이동 : cd (change directory) + 이동할 폴더명

$ cd hello_gi/  # 후 pwd 를 확인하면 디렉토리가 이동된 것을 확인할 수 있음
$ pwd         # Print Working Directory 의 약어, 현재 어떤 디렉토리경로에 있는가를 절대경로로 표시하는 명령어
$ cd ..         # 상위 폴더로 이동

 

디렉토리 삭제 : rm (remove directory)

$ rm 파일명        # 파일삭제 가능
$ rm -r hello_gi/    # 폴더를 삭제할 경우는 rm과 폴더명 사이에 -r 옵션 필요
$ ls                    # ls를 통해 디렉토리가 삭제된 것을 확인할 수 있음

 

커맨드창 정리

$ clear

 

매뉴얼은 '—help' 와 'man 명령어'를 통해서 확인 가능

$ rm --help   # 명령어 --help 를 사용하면 세부 옵션 및 매뉴얼 보기 가능
$ man rm     # man 명령어는 전용 매뉴얼 페이지로 이동 # 스크롤은 방향키로 조종할 수 있음

/explain       # 매뉴얼 페이지에서 /찾고싶은 단어를 입력하면, 해당 단어를 찾아 스크롤 이동 및 표시
/n              # n(next) 키를 누르면 다음 단어로 이동, p(previous) 키를 누르면 이전 단어로 이동

 

sudo

  • super user do 의 약자
  • 권한이 필요해서 실행이 안 되는 경우, super user의 권한으로 실행하게 함
$ apt-get install git    # git을 설치하는 명령어 입력해도 설치는 X, are you root?라고 물음
$ sudo apt-get install git       # 앞에 sudo를 붙여서 명령어를 입력하면 설치 가능

 

에디터

  • 정보를 저장한 파일을 만들기 위해선 에디터 사용 필요
  • vi가 많이 사용됨, 초심자에게는 nano 에디터를 추천
  • 터미널에 nano를 입력하면 nano 에디터 실행 > html 태그를 입력 후 파일 저장
  • 터미널에 'vi 파일명'을 입력하면 vi 에디터 실행
$ nano
$ vi g1         # g1 파일이 없는 경우, 하단에 new file이라고 뜨면서 에디터 실행
                # g1파일이 있는 경우, 내용을 가져오고 에디터 실행

 


패키지 매니저

기본적으로 내장되어 있지 않은 프로그램을 설치해야 할 때 사용

리눅스의 대표적인 패키지 매니저 : apt, yum

  • 레드햇(RedHat) 계열 or CentOS : yum (yellow dog updater. Modified)
  • 데비안(Debian) 계열 or 우분투(Ubuntu) : apt (Advanced Packing Tool)
  • apt 앞에는 sudo를 항상 붙여주어야 함
  • 설치에 앞서 항상 설치할 수 있는 목록을 최신화(update)
  • upgrade 와 update의 차이 (apt와 yum이 다름)
  • apt apt update : 단순히 패키지 업데이트가 존재하는지 저장소 경로를 통해 확인(저장소만 업뎃) apt upgrade : 실제로 패키지를 최신 패키지로 변경하는 작업
  • yum : update와 upgrade 명령어 모두 패키지의 실제 업데이트 작업 수행
  • yum upgrade = yum -obsoletes update
    (패키지 업데이트되면서 더 이상 사용되지 않는 관련 파일이나 패키지를 삭제)
# 패키지 매니저 별 최신화 명령어

$ sudo apt-get update
$ yum update                 # yum -y update : 현재 설치된 모든 패키지 업데이트, 모든 대답 : yes
$ sudo apt-get update      # 저장소 경로를 통한 업데이트 (저장소 업데이트만 진행)
$ sudo apt-get upgrade    # 실제로 패키지를 최신 패키지로 변경
$ yum update                 # 패키지 업데이트 여부 확인 후 새로운 파일로 갱신
$ yum upgrade               # yum update 하면서 더이상 사용하지 않는 파일/패키지 삭제

 

728x90

댓글()