리눅스 하드디스크 관리와 사용자별 공간 할당, 셸 스크립트 프로그래밍 (4일차)

Tyun_Record·2023년 8월 11일
0
post-custom-banner

RAID 정의 및 개념

  • RAID

    • 여러 개의 디스크를 하나의 디스크처럼 사용
    • 비용 절감 + 신뢰성 향상 + 성능 향상
  • 하드웨어 RAID

    • 하드웨어 제조업체에서 여러 개의 하드디스크를 가지고 장비를 만들어 그 자체를 공급
    • 안정적이지만 비쌈
  • 소프트웨어 RAID

    • 고가의 하드웨어 RAID의 대안
    • 운영체제에서 지원하는 방식
    • 저렴한 비용, 안전하게 데이터 저장

  • RAID 1은

    • active + stanby 로 유지
  • VMware 서버에 디스크 9개 추가

  • fdisk를 통한 파티션 설정

  • command : t > hex code는 디스크 타입 변경, fd는 레이어드 구성에 사용하는 파일 시스템

레이드 구성

  • linear 레이드 구성도 (level=linear, 0, 1, 5 )

  • mdadm 명령어를 사용하여 sdb1과 sdc1을 linear raid로 묶는다

  • 파일시스템으로 포맷 후 새로 생성한 디렉토리에 마운트!!

  • fstab을 활용하여 저장, 부팅후에도 유지될 수 있게!!

참고하면 좋은 링크

레이드 복구

  • 고장난 하드디스크 교체
  • 교체한 하드디스크 파티션 재설정
  • 마운트 해주기 전 RAID 작동 멈춘 후 마운트
  • 완전히 제거된 RAID는 처음부터 다시 생성하면 되지만 RAID 1 or 5는 존재하고 있으므로 새로운 하드디스크만 추가해준다
  • 예) mdadm /dev/md1 --add /dev/sdg1

LVM ( Logical Volume Manage )

  • 기능

    • 여러 개의 하드디스크를 합쳐 한 개의 파일시스템으로 사용
    • 상황에 따라 다시 나눌 수 있음
    • 2TB를 2개 합쳐서 4TB, 다시 1TB와 3TB로 나눌 수 있음
  • 용어

    • Physical Volume : /dev/sda1, /dev/sdb1 등의 파티션
    • Volume Group : 물리 볼륨을 합쳐 1개의 물리 그룹으로 만드는 것
    • Logical Volume : 볼륨 그룹을 1개 이상으로 나누어 논리 그룹으로 나눈 것
  • 흐름도

  • 디스크 2개 추가 (2GB, 3GB)

  • 파티션 할당, 타입은 LVM 타입 ( Hex code : 8e )

  • 물리 볼륨, 볼륨 그룹 생성

  • 이후 논리 볼륨으로 용량 할당, 이후 포맷

  • 디렉토리 생성 후 마운트하면 끝

CentOS의 bash 셸

  • 기본 셸은 bash ( Bourne Again SHell : '배시 셸' )

  • 특징

    • Alias 기능 (명령어 단축 기능)

    • History 기능 (위/아래 화살표키)

    • 연산 기능

    • Job Control 기능

    • 자동 이름 완성 기능 (tab)

    • 프롬프트 제어 기능

    • 명령 편집 기능

    • 셸의 명령문 처리 방법

    • (프롬프트) 명령어 [옵션..][인자..]

    • 예) rm -rf /mydir

  • 환경변수

    • "echo $환경변수이름" 으로 확인 가능
      • echo = print 느낌
    • "export 환경변수=값" 으로 환경 변수의 값 변경
    • 주요 환경변수

셸 스크립트 프로그래밍

  • C언어와 유사
  • 변수, 반복문, 제어문 등의 사용
  • 별도의 컴파일 필요없이 텍스트 파일 형태로 바로 실행
  • vi나 gedit으로 작성 가능
  • 리눅스의 많은 부분이 셸 스크립트로 작성되어 있음!!

셸 스크립트의 작성과 실행

  • vi나 gedit으로 작성.. vi 익숙해지자!
  • 실행 방법
    • sh 스크립트 파일 로 실행
    • chmod로 스크립트 파일 권한 준 후에 ./스크립트파일 명령으로 실행

변수의 기본

  • 변수 사용 전 미리 선언하지 않음, 변수에 처음 값이 할당되면서 자동으로 변수 생성
  • 모든 변수는 '문자열(string)'로 취급
  • 변수 이름은 대소문자 구분
  • 변수 대입 시 '=' 좌우에 공백 없어야함!!

변수의 입력과 출력

  • '$' 들어간 글자 출력하려면 ' '로 묶어주거나 앞에 '\'를 붙임
  • 또는 " "로 변수를 묶어줘도 된다
    • #!/bin/sh
      myvar="Hi Woo"
      echo myvarecho"myvar echo "myvar"
      echo 'myvarecho$myvarecho값입력:readmyvarechomyvar' echo \$myvar echo 값 입력 : read myvar echo 'myvar' = $myvar
      exit 0

숫자 계산

  • 변수에 대입된 값은 모두 문자열 취급
  • 따라서 연산을 위해서 expr을 사용
  • 단, 수식에 괄호 or 곱하기( * )는 앞에 역슬래쉬 ( \ ) 붙이기!!
  • 여기서 나오는 '는 ` Backtick 임
    • #!/bin/sh
      num1=100
      num2=$num1+200
      echo $num2
      num3='expr &num1 + 200'
      echo $num3
      num4='expr ( $num1 + 200 ) / 10 * 2'
      echo $num4
      exit 0

파라미터 변수

  • 파라미터 변수는 $0, $1, $2...의 형태
  • 전체 파라미터는 $*
    • #!/bin/sh
      echo "실행파일 이름은 <$ 0>이다"
      echo "첫번째 파라미터는 <$ 1>이고, 두번째 파라미터는 <$ 2>다"
      echo "전체 파라미터는 <$*>다"
      exit 0

기본 if문

  • 형식 ([조건] 사이의 각 단어에는 모두 공백이 있어야함)
    if [조건]
    then
    참일 경우 실행
    fi
    • #!/bin/sh
      if [ "hi" = "hi" ]
      then
      echo "안녕"
      fi
      exit 0

if~else 문

  • 형식 ( 중복 if 문을 위해 elif문도 사용할 수 있음 )
    if [조건]
    then
    참일 경우 실행
    else
    거짓인 경우 실행
    fi
    • #!/bin/sh
      if [ "hi" != "hi" ]
      then
      echo "참"
      else
      echo "거짓"
      fi
      exit 0

조건문에 들어가는 비교 연산자


  • #!/bin/sh
    if [ 100 -eq 200 ]
    then
    echo "100과 200은 같음"
    else
    echo "100과 200은 다름"
    fi
    exit0

파일과 관련된 조건

  • #!/bin/sh
    fname=/lib/systemd/system/sshd.service
    if [ -f $fname ]
    then
    head -5 $fname
    else
    echo "sshd 서버 미설치!!"
    fi
    exit 0

  • fname 경로에 해당 파일이 존재하므로 head -5 만큼 출력!!

case~esac문 (1)

  • if 문은 참과 거짓의 두 경우만 사용 (2중분기)
  • 여러 가지 경우의 수가 있다면 case문 (다중분기)
  • 형식
    case 문자열 in
    경우1)
    명령 명령 명령;;
    경우2)
    명령 명령 명령;;
    *)
    명령 명령 명령;;
    esac
  • #!/bin/sh
    case "$1" in
    start)
    echo "시작!";;
    stop)
    echo "멈춰!";;
    restart)
    echo "다시 시작!";;
    *)
    echo "뭔지 모름!";;
    esac
    exit 0
  • *) 는 위의 조건 외 나머지라는 뜻!!

case-esac문 (2)

  • #!/bin/sh
    echo "샤브샤브편백나무찜 맛있었나요? (yes/no)"
    read answer
    case $answer in
    yes | y | Y | Yes | YES)
    echo "그렇군요";;
    [nN])
    echo "다른 음식은 어떤가요?";;
    )
    echo "yes 아니면 no만 입력하세요"
    exit 1;;
    esac
    exit 0
  • exit(0)은 return과 같은 의미, 코드 실행이 완료되면 종료!
  • exit(1)은 실행중 강제 종료 하는 것
  • [nN]*) 는 n 또는 N으로 시작하는 모든 단어

AND, OR 관계 연산자

  • and는 '-a' 또는 '&&' 사용

  • or는 '-o- 또는 '||' 사용

  • #!/bin/sh
    echo "보고 싶은 파일명을 입력하세요"
    read fname
    if [ -f $fname ] && [ -s $fname ];then
    head -5 $fname
    else
    echo "파일이 없거나, 크기가 0입니다"
    fi
    exit 0

반복문 - for문 (1)

  • 형식
    for 변수 in 값1 값2 값3...
    do
    반복할 문장
    done
  • #!/bin/sh
    hap=0
    for i in 1 2 3 4 5 6 7 8 9 10
    do
    hap='expr $hap + $i'
    done
    echo "1 to 10 합:" $hap
    exit 0
  • 3행은 for((i=1;i<=10;i++)) 또는 i in 'seq 1 10'으로 변경 가능

반복문 -for문 (2)

  • 현재 디렉터리에 있는 셸 스크립트 파일(*.sh)의 파일명과 앞 3줄을 출력하는 프로그램
  • #!/bin/sh
    for fname in (ls.sh)doecho"(ls*.sh) do echo "----------fname----------"
    head -3 $fname
    done
    exit 0

반복문 - while문 (1)

  • 조건식이 참인 동안 계속 반복
  • [ 1 ] 또는 [ : ]가 오면 항상 참이 되므로 실행줄을 계속 반복
  • #!/bin/sh
    while [ 1 ]
    do
    echo "리눅스... 재밌나?"
    done
    exit 0

반복문 조건 명령어

반복문 - while문 (2)

  • 1에서 10까지의 합계를 출력 ( 반복문 - for문 (1) 과 동일 )
  • #!/bin/sh
    hap=0
    i=1
    while [ $i -le 10 ]
    do
    hap='expr hap + $i' i='expr $i + 1' done echo "1 to 1o 합 : "hap
    exit 0

반복문 - while문 (3)

  • 비밀번호 입력받고, 맞을 때까지 계속 입력받는 스크립트
  • #!/bin/sh
    echo "비밀번호 입력하세요 : "
    read mypass
    while [ $mypass != "1234" ]
    do
    echo "error! Try again!"
    echo "비밀번호 입력하세요 : "
    read mypass
    done
    echo "Good!"
    exit 0
  • 실제로는 비밀번호를 스크립트 안에 작성하면 안됨!! 해킹 위험!

Until 문

  • while문과 용도는 거의 같으나, Until문은 조건식이 참일 때까지 = 거짓인 동안) 계속 반복한다
  • 반복문 - while문 (2)을 until문으로 바꾸려먼 4행을 until [ $i -gt 10 ]으로 바꾸면 된다

break, continue, exit, return 문

  • break는 주로 반복문 종료할 때 사용

  • continue는 반복문의 조건식으로 돌아가게 함

  • exit는 해당 프로그램을 완전히 종료

  • return은 함수 안에서 사용할 수 있으며 함수를 호출한 곳으로 돌아가게 함

  • #!/bin/sh
    echo "무한반복 입력을 시작(b : break, c : continue, e : exit)"
    while [ 1 ];do
    read input
    case $input in
    b | B )
    break;;
    c | C )
    echo "continue를 누르면 while의 조건으로 돌아감"
    continue;;
    e | E )
    echo "exit를 누르면 프로그램(함수)를 완전히 종료함"
    exit 1;;
    esac;
    done
    echo "break를 누르면 while을 빠져나와 지금 이 문장이 출력됨"
    exit 0

사용자 정의 함수

  • 형식
    함수이름 ( ) { → 함수를 정의
    내용들 ...
    }
    함수이름 → 함수를 호출

    • #!/bin/sh
      myFunction () {
      echo "함수 안으로 들어 왔음"
      return
      }
      echo "프로그램을 시작합니다"
      myFunction
      echo "프로그램을 종료합니다"
      exit 0

함수의 파라미터 사용

  • 형식
    함수이름 () { → 함수를 정의
    $1, $2 ... 등을 사용
    }
    함수이름 파라미터1 파라미터2 ... → 함수를 호출
  • #!/bin/sh
    multi () {
    echo 'expr $1 * $2'
    }
    echo "10 곱하기 20을 실행합니다"
    multi 10 20
    exit 0

eval

  • 문자열을 명령문으로 인식하고 실행

  • #!/bin/sh
    str="ls -l test.sh"
    echo $str
    eval $str
    exit 0

export

  • 외부 변수로 선언해 준다. 즉, 선언한 변수를 다른 프로그램에서도 사용할 수 있도록 해줌

  • extest.sh

  • #!/bin/sh
    echo $var1
    echo $var2
    exit 0

  • test.sh

  • #!/bin/sh
    var1="지역변수"
    export var2="외부 변수"
    sh extest.sh
    exit 0

printf

  • C언어의 printf() 함수와 비슷하게 형식을 지정해서 출력
  • #!/bin/sh
    var1=10.2
    var2="리눅스 재밌나?"
    printf " %5.2f\n\n \t %s \n " var1"var1 "var2"
    exit 0

set과 $(명령어)

  • 리눅스 명령어를 결과로 사용하기 위해서는 $(명령어) 형식을 사용
  • 결과를 파라미터로 지정하고자 할 때는 set과 함께 사용
  • #!/bin/sh
    echo "오늘 날씨는 $(date) 입니다."
    set $(date)
    echo "오늘은 $2 월 $3 일 입니다."
    exit 0

shift

  • 파라미터 변수를 오른쪽으로 한 단계식 쉬프트 시킴

  • #!/bin/sh
    myfunc() {
    str=""
    while [ "$1" != "" ];do
    str="$str $1"
    shift
    done
    echo $str
    }
    myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
    exit 0

post-custom-banner

0개의 댓글