로그인 및 사용자 세션 시작 과정
- CS
- 운영체제

개념 정리
터미널과 쉘의 차이
터미널 (Terminal)
쉘 (Shell)
인터럽트란?
하드웨어나 소프트웨어에서 긴급하게 CPU의 처리가 필요할 때, CPU의 현재 작업을 중단시키고 우선적으로 특정 작업을 수행하도록 하는 신호다.
- 장치 또는 소프트웨어가 인터럽트 신호를 발생시킴
- CPU는 인터럽트 신호를 감지하면, 현재 작업의 위치(상태)를 저장
- OS 커널에 미리 정의된
인터럽트 처리 루틴으로 이동하여 해당 이벤트를 처리 - 처리가 끝나면 저장해 두었던 위치로 돌아가 원래 작업을 계속 진행
전체 프로세스 흐름
1. 사용자 로그인 시도
↓
2. 계정 인증 (/etc/passwd, /etc/shadow)
↓
3. 인증 성공 → 로그인 기록
↓
4. 권한 설정 (UID/GID)
↓
5. 홈 디렉터리로 이동
↓
6. 최소 환경 변수 설정
↓
7. exec()로 로그인 쉘 실행 (login → bash)
↓
8. bash가 로그인 쉘로 시작 (-bash)
↓
9. 시스템 전역 설정 실행
- /etc/profile
- /etc/profile.d/*.sh
- /etc/bash.bashrc
↓
10. 사용자 설정 실행
- ~/.bash_profile (또는 ~/.bash_login, ~/.profile)
- ~/.bashrc
↓
11. 프롬프트 표시
↓
12. 사용자 작업 시작1. 계정 인증 (Authentication)
사용자 입력
사용자가 로그인 프롬프트에 사용자명과 비밀번호를 입력한다.
키보드 입력 처리 과정
- 키보드를 누르면 하드웨어 장치에 전기적 신호로 전달됨
- 하드웨어로부터 입력신호가 들어오면, 커널이 이를 인터럽트로 감지
- 프로세스는 입력 버퍼를 읽는 시스템콜을 사용하여 한글자(or 한 줄)씩 가져옴
- 입력 값을 실시간으로 출력
계정 확인 및 비밀번호 검증
/etc/passwd 파일 확인
username:x:1000:1000:Full Name:/home/username:/bin/bash/etc/shadow 파일 확인
username:$6$salt$hash:19000:0:99999:7:::인증 실패 시
/var/log/auth.log)인증 성공 시 로그인 기록
/var/run/utmp: 현재 로그인한 사용자 정보 (실시간, 휘발성)/var/log/wtmp: 모든 로그인/로그아웃 이력 (영구 보관)/var/log/lastlog: 각 사용자의 마지막 로그인 정보/var/log/auth.log (또는 /var/log/secure): 인증 관련 상세 로그로그를 기록하는 이유?
2. 인증 성공 시, 로그인 프로그램이 쉘 실행을 준비
로그인 쉘이란?
로그인 쉘이란 사용자가 시스템에 로그인했을 때 처음으로 실행되는 쉘 프로그램을 말한다. 사용자의 기본 로그인 쉘은 /etc/passwd 파일의 마지막 필드에 정의되어 있으며, 예를 들어 /bin/bash, /bin/zsh 등이 있다.
로그인 쉘은 사용자에게 명령어 입력을 받을 수 있는 환경을 제공하고, 로그인 시 환경 설정 파일들을 로드하여 사용자 세션을 초기화하는 역할을 한다.
프로세스 권한 설정
UID/GID 설정
setgid() 시스템 콜로 그룹 ID 설정setuid() 시스템 콜로 사용자 ID 설정보조 그룹 설정
/etc/group 파일을 읽어 사용자가 속한 모든 그룹 확인setgroups() 시스템 콜로 보조 그룹 권한 설정작업 디렉터리 변경
chdir() 시스템 콜로 사용자의 홈 디렉터리로 이동chdir("/home/username")최소한의 환경 변수 설정
로그인 프로그램이 기본적인 환경 변수만 설정한다.
HOME=/home/username # 홈 디렉터리
USER=username # 사용자 이름
LOGNAME=username # 로그인 이름
SHELL=/bin/bash # 기본 쉘
PATH=/usr/local/bin:/usr/bin:/bin # 기본 실행 경로
TERM=xterm # 터미널 타입세션 생성
3. 로그인 프로그램이 exec() 시스템 콜로 /etc/passwd 에 지정된 쉘을 실행
exec() 시스템 콜로 쉘 실행
// 의사 코드
char *shell = "/bin/bash"; // /etc/passwd에서 읽어온 쉘 경로
execl(shell, "-bash", NULL); // "-bash"는 로그인 쉘임을 의미프로세스 대체
exec() 시스템 콜은 현재 프로세스를 새 프로그램으로 완전히 대체login) 은 종료되고, 같은 PID 로 bash 가 실행됨로그인 쉘로 동작
bash, zsh, sh4. 로그인 쉘 (bash) 이 자동으로 환경을 초기화
시스템 전역 설정 파일 실행
1) /etc/profile 실행
# PATH 설정
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# 로케일 설정
LANG="ko_KR.UTF-8"
# 히스토리 크기
HISTSIZE=1000
HISTFILESIZE=20002) /etc/profile.d/ 디렉토리의 스크립트 실행
/etc/profile 이 이 디렉토리의 .sh 파일들을 자동으로 실행/etc/profile.d/color.sh, /etc/profile.d/java.sh 등3) /etc/bash.bashrc 실행
5. 로그인 쉘이 사용자의 홈 디렉터리에서 설정 파일들을 찾아 실행
Bash 로그인 쉘의 설정 파일 우선순위
로그인 쉘은 다음 파일들을 순서대로 찾아서, 가장 먼저 발견된 하나만 실행한다:
1) ~/.bash_profile (최우선)
# ~/.bash_profile 예시
# 환경 변수 설정
export EDITOR=vim
export PATH="$HOME/bin:$PATH"
# ~/.bashrc 호출 (일반적)
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi~/.bashrc 를 호출함2) ~/.bash_login (두 번째 우선순위)
~/.bash_profile 이 없을 때만 실행3) ~/.profile (세 번째 우선순위)
~/.bashrc 실행
일반적으로 ~/.bash_profile 이 ~/.bashrc 를 호출한다.
# ~/.bashrc 예시
# Alias 설정
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias grep='grep --color=auto'
# 함수 정의
mkcd() {
mkdir -p "$1" && cd "$1"
}
# 프롬프트 커스터마이징
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
# 쉘 옵션
shopt -s histappend # 히스토리 추가 모드
shopt -s checkwinsize # 윈도우 크기 확인
# 히스토리 설정
HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoredups:ignorespace~/.bashrc 의 역할
6. 초기화 완료 및 프롬프트 표시
모든 설정 파일 실행이 완료되면 다음이 실행된다.
CLI 환경
username@hostname:~$GUI 환경
로그인 쉘이 데스크탑 환경을 시작한다.
디스플레이 매니저가 설정 파일 실행
~/.xsession 또는 ~/.xinitrc데스크탑 환경 실행
gnome-session 실행startkde 실행startxfce4 실행윈도우 매니저 및 구성 요소 시작
~/.config/ 디렉터리의 사용자 설정 적용

