[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

댓글()