
임베디드 리눅스 프로그래밍을 시작하기 전에 리눅스 기초 개념을 정리하는 중이다.
아주 어려운 내용은 없고, 개발 환경 세팅부터 Shell과 파일, 디렉토리까지만 작성할 예정이다.
수업 내용에 따라 생략된 내용이 있을 수 있다.
운영체제
컴퓨터 하드웨어와 소프트웨어를 연결해 주는 시스템 소프트웨어
User → Shell → Kernel → Hardware
리눅스
유닉스(Unix)를 기반으로 한 오픈소스 운영체제
서버, 데스크탑, 임베디드 시스템 등 다양한 환경에서 사용
운영체제의 구성 요소
커널(kernel)
운영체제의 핵심 부분으로 하드웨어를 직접 제어하고 초기화 등 작업으로 하드웨어를 쓸 수 있게 함
메모리 관리, 프로세스 관리, 네트워크 연결, 장치 드라이버 관리를 담당
셸(shell)
사용자가 입력한 명령어를 해석해 커널에 전달하는 인터페이스
CLI(커맨드 라인 인터페이스) 환경에서는 명령어로 시스템을 제어
파일 시스템
모든 것을 파일로 관리하는 리눅스 철학에 따름
저장장치에 데이터를 파일 형태로 저장하고 관리
장치 드라이버
커널의 일부로 하드웨어 장치를 컴퓨터가 인식하고 사용할 수 있도록 연결하는 소프트웨어
네트워크 시스템
TCP/IP 프로토콜 기반의 강력한 네트워크 기능을 제공하여 원격 접속, 서버 운영 등 가능
프로그램 실행과 멀티태스킹
CPU (Central Processing Unit)
컴퓨터의 두뇌 역할을 하는 핵심 하드웨어 부품
프로그램의 명령어를 해석하고 계산하는 등 연산과 제어를 담당
CPU는 주기적으로 명령어를 fetch(가져오고), decode(해석), execute(실행)하는 과정을 반복
프로세스 (Process)
프로그램이 메모리에서 실행 중인 상태를 의미
CPU 자원은 프로세스에 할당되며, 여러 프로세스가 동시에 CPU 사용을 위해 경쟁함
프로세스는 실행 중이거나 대기 상태일 수 있음
passive process : 하드디스크에 있는 실행 전 파일은 단순한 프로그램
active process : 메모리에 로드되어 CPU가 실행하는 상태
a.out @ HDD → 하드디스크에 저장된 실행하지 않은 파일 (프로그램)
a.out @ RAM → 메모리에 적재되어 실행되고 있는 프로세스 상태
프로세스 스케줄링
어느 프로세스에 CPU 코어를 할당할지 결정하는 작업
스케줄러라는 운영체제 구성요소가 프로세스를 선택하여 CPU에 할당
스케줄링 알고리즘에 따라 자원 분배가 이루어지고, 운영체제마다 알고리즘이 다름
인터럽트 (Interrupt)
하드웨어가 소프트웨어에 보내는 신호
메모리 관리
메모리는 RAM(주 메모리) 뿐만 아니라 가상 메모리를 포함한 넓은 개념
STM32 같은 임베디드 프로세서는 직접 물리 주소를 사용
리눅스는 가상 메모리를 이용해 유연한 메모리 관리 지원(MMU)
CPU는 프로그램이 참조하는 가상 주소(virtual address)를 MMU(Memory Management Unit)를 통해 실제 물리 주소(physical address)로 변환해 접근
사용자 인터페이스
GUI(Graphic User Interface) : 그래픽 방식으로 직관적인 상호작용 제공
CLI(Command Line Interface) : 텍스트 기반 명령어 입력 방식으로, 사용자가 키보드를 통해 명령어를 직접 입력해 시스템 제어
리눅스 배포판
운영체제의 목적에 맞게 리눅스 커널에 여러 프로그램을 묶어 제공하는 패키지
예: 우분투, 페도라, 센토스, 레드햇
PC에 리눅스 직접 설치 (멀티부팅 / 단독 설치)
실제 하드웨어 성능을 그대로 활용 가능
파티션 작업, 부트로더 설정 등으로 초보자에게 난이도가 있고 기존 OS 손상 위험
가상 머신에 리눅스 설치
윈도우를 유지한 상태에서 리눅스를 연습할 수 있고, 스냅샷으로 쉽게 되돌리기 가능
실제 성능보다 조금 느릴 수 있음
(예: VirtualBox, VMware)
클라우드 서비스로 리눅스 인스턴스 사용
별도 설치 없이 인터넷만 있으면 접속 가능, 서버 환경 연습에 적합
(예: AWS EC2, Azure, GCP)
Host (호스트)
OS : Windows
역할 : VirtualBox를 실행하고, 그 안에 리눅스(우분투)를 설치해 사용하는 PC
Virtualbox 버전 : 6.1.48 windows host
윈도우 위에 우분투 가상 머신을 만들기 위한 하이퍼바이저 역할
Guest (게스트, 가상머신)
OS : Linux (Ubuntu 20.04 64-bit Desktop)
역할 : 리눅스 학습 및 개발에 사용하는 환경
Linux 버전 : Ubuntu 20.04 64-bit PC (AMD64) Desktop Image
VirtualBox 가상 머신에 설치할 리눅스 OS ISO 이미지
Target (타깃 보드)
예 : Raspberry Pi (Raspbian / Raspberry Pi OS)
역할 : 임베디드 리눅스 타깃 장치, Host/Guest에서 빌드한 파일을 전송해 실행
우분투에서 설치할 패키지
네트워크/파일 공유/원격 접속을 위한 패키지 설치
TFTP 관련
패키지 : tftp, tftpd
부트로더/커널/이미지 등을 네트워크로 전송할 때 사용
SSH 서버
패키지 : openssh-server
Windows에서 ssh 계정명@IP주소 로 접속해 터미널 원격 조작
$ ipconfig
이더넷 어댑터 VirtualBox Host-Only Network:
연결별 DNS 접미사. . . . :
링크-로컬 IPv6 주소 . . . . : xxxx::xxxx:xxxx:xxxx:xxxx%xx
IPv4 주소 . . . . . . . . . : xxx.xxx.xx.x <- 이 값을 사용
서브넷 마스크 . . . . . . . : xxx.xxx.xxx.0
기본 게이트웨이 . . . . . . :
C:\Windows\System32\drivers\etc\hosts → 맨 아래에 IPv4 주소 별칭 추가
ssh 계정명@별칭 으로 접속 가능
Samba (윈도우와 파일 공유)
패키지 : samba
윈도우에서 리눅스 디렉토리를 네트워크 드라이브처럼 연결해 사용
Samba 기본 설정
설정 파일 수정
파일 : /etc/samba/smb.conf
sudo nano /etc/samba/smb.conf 후에 파일 맨 아래에 공유 설정 블록 추가
[root]
comment = root
path = /
writable = yes
browseable = yes
guest ok = yes
Samba 사용자 추가
sudo smbpasswd -a 리눅스계정_이름
Samba에서 사용할 암호를 별도로 지정해야 함
내 PC → 네트워크 드라이브 연결 → \\리눅스_IP\공유이름 폴더 설정
자격 증명에 리눅스계정_이름 계정 정보를 입력해 접속
참고 이미지


터미널
사용자와 컴퓨터의 상호작용을 위한 연결 장치 또는 소프트웨어 환경
키보드로 텍스트 명령어를 입력하고 그 결과를 화면에 출력하는 역할
w 명령어 또는 TTY 명령어를 통해 현재 터미널 정보를 확인 가능
셸
운영체제가 제공하는 명령어 기반 인터페이스
사용자가 입력한 명령어를 해석, 커널에 전달, 실행하는 프로그램
echo $SHELL 명령으로 현재 기본 셸을 확인할 수 있음
대표적인 셸 종류 : /bin/bash (많이 사용됨), sh, zsh, fish
터미널과 셸의 관계
터미널은 상호작용을 위한 장치이고, 이때 사용하는 도구 중 하나가 셸
터미널은 사용자가 명령어를 입력하고 출력 결과를 볼 수 있는 창(환경)
셸은 터미널 내부에서 사용자 명령을 해석하여 운영체제에게 전달하고 실행하는 실제 작업 프로세스
(터미널 → TV, 셸 → 방영되는 콘텐츠 느낌)
셸 스크립트
셸에서 실행할 수 있는 명령어를 모아놓은 파일
프로그램처럼 연속된 명령을 자동 실행할 수 있어 편리
셸 스크립트 파일은 일반 텍스트 파일로, 대부분 .sh 확장자를 사용
셸 스크립트 작성 방법
첫 줄에 반드시 shebang (#!/bin/bash) 작성
실행 권한 부여 (chmod +x)
상대 경로(./)로 실행
환경변수와 현재 디렉토리 경로 확인
셔뱅(Shebang)
스크립트 파일 첫 줄에 사용하는 문자열로, 스크립트를 처리할 인터프리터를 지정
#!/path/to/interpreter 형식으로 사용하고, Bash는 #!/bin/bash 로 설정
주석 (Comments)
`#`으로 시작하는 줄은 주석 처리 (실행되지 않음)
코드 설명, 작성자 정보, 수정 이력 등 기록
#!/bin/bash
# 간단한 시스템 정보 출력 스크립트
# 색상 변수 정의
RED='\033
## 실행 방법
### 1) 실행 권한 부여 후 실행
명령어 형식
리눅스 명령어의 기본 구조 : 명령어 [옵션] [인자값]
명령어 : 수행할 작업을 지정
옵션 : 명령어의 동작 방식을 변경 (예: l, a, 또는 -로 시작)
인자값 : 명령어가 처리할 대상 (파일명, 디렉토리 경로 등)
옵션과 인자는 생략 가능하며 공백으로 구분
# 예시
ls # 기본 사용
ls -l /home # 옵션 + 인자
ls -la --color=auto # 여러 옵션 + 긴 옵션 형식
man (Manual)
명령어의 사용법, 옵션, 예제를 자세히 알려주는 매뉴얼 도구
형식: man 명령어_이름
man ls # ls 명령어 매뉴얼 보기
man man # man 명령어 자체 매뉴얼
q # 매뉴얼 종
ls (List)
디렉토리의 파일과 폴더 목록을 표시
ls # 기본 목록
ls -l # 상세 정보 (권한, 크기, 날짜 등)
ls -a # 숨김 파일 (.) 포함
ls -la /home # 상세 + 숨김 파일
cd (Change Directory)
작업 디렉토리 변경
cd /home # 절대 경로로 이동
cd ~ # 홈 디렉토리로 이동
cd .. # 상위 디렉토리로 이동
cd - # 이전 디렉토리로 이동
pwd (Print Working Directory)
현재 작업 중인 디렉토리의 전체 경로 표시
pwd # /home/username 출력
cat (Concatenate)
파일 내용을 화면에 출력하거나 여러 파일 연결
cat 파일명 # 파일 내용 출력
cat 파일1 파일2 # 여러 파일 순서대로 출력
cat > 새파일.txt # 키보드 입력으로 새 파일 생성 (Ctrl+D로 종료)
exit / logout
현재 셸 세션 종료하고 로그아웃
exit
logout # 동일 기능
nano (텍스트 에디터)
간단하고 직관적인 텍스트 편집기
ping (네트워크 연결 확인)
네트워크 연결 상태를 확인하는 명령어
형식: ping [옵션] 대상
ping google.com # google.com까지 ping
ping -c 4 8.8.8.8 # 4회 ping 후 종료 (Google DNS)
리눅스 부팅 구성 요소
리눅스 시스템 부팅 시 필요한 핵심 파일들
bootloader (u-boot) → kernel → device tree → root file system
root file system
리눅스 시스템이 동작하는 사용자 공간의 모든 파일과 디렉토리를 포함하는 최상위 파일 시스템
/ (루트 디렉토리)부터 시작하며, /bin, /etc, /home 등 모든 디렉토리를 포함
디스크 기반 파일 시스템
물리적 저장장치에 실제 데이터가 저장되는 전통적인 파일 시스템
대표적인 형식: ext4, FAT32, NTFS 등
부팅 후 루트 파일 시스템이 디스크에 마운트되어 사용됨
영구 저장이 가능하며, 시스템 재부팅 후에도 데이터 유지
네트워크 기반 파일 시스템
원격 컴퓨터(서버)에 네트워크로 접속하여 로컬 컴퓨터에서 파일처럼 사용하는 방식
중앙 집중식 파일 관리로 여러 컴퓨터에서 동일한 파일 공유 가능
NFS(Network File System), Samba(CIFS), FTP 등이 대표적
(예: Windows에서 Samba로 Ubuntu 공유 폴더 접근)
가상 파일 시스템(Virtual File System)
실제 물리적 파일이 존재하지 않고, 파일처럼 보이게 만든 시스템 정보 데이터베이스
실시간 시스템 상태 정보를 파일 형태로 제공하여 읽기/쓰기로 시스템 제어 가능
(예: /proc, /sys, /dev )
/proc/meminfo # 메모리 사용량 정보
/proc/cpuinfo # CPU 정보
/proc/[PID] # 특정 프로세스 정보
/sys/class/gpio # GPIO 제어 (임베디드 리눅스)
/dev/sda1 # 디스크 장치 파일
루트 디렉토리
파일 시스템의 최상단에 위치하는 디렉토리로 모든 파일과 디렉토리의 부모
리눅스에서는 단 하나의 트리 구조로 모든 디렉토리가 / 아래에 계층화됨
절대 경로는 항상 /부터 시작하며, FHS(Filesystem Hierarchy Standard)에 따라 표준화된 구조
주요 디렉토리 목록
| 디렉토리 | 용도 및 특징 |
|---|---|
| /bin | 기본 실행 파일(ls, cat, cp 등 시스템 부팅/복구에 필수 명령어) |
| /dev | 장치 파일(하드웨어를 파일처럼 접근, 예: /dev/sda, /dev/tty) |
| /etc | 시스템 설정 파일(네트워크, 사용자 계정, 서비스 설정 등) |
| /home | 사용자 홈 디렉토리(각 사용자별 개인 파일 저장소) |
| /lib | 공유 라이브러리(/bin, /sbin 실행에 필요한 라이브러리) |
| /mnt | 임시 마운트 지점(USB, 외장하드 등 자동/수동 마운트) |
| /proc | 가상 파일 시스템(커널이 관리하는 실시간 시스템 정보 제공) |
| /root | 루트 사용자(관리자)의 홈 디렉토리(일반 사용자와 분리) |
| /sbin | 시스템 관리자 명령어(ifconfig, fdisk 등 루트 권한 필요) |
| /sys | 가상 파일 시스템(디바이스 드라이버들이 노출하는 정보) |
| /tmp | 재부팅 시 삭제되는 임시 파일(작업 중 임시 데이터 저장) |
| /usr | 사용자 프로그램 설치 위치 |
아이노드(Inode)
아이노드는 파일의 정체를 나타내는 고유 식별자
파일의 메타데이터(크기, 권한, 타임스탬프 등)와 데이터 블록 위치를 저장
ls -i 명령어로 파일명과 아이노드 번호 확인 가능
user@host:~$ touch a # 빈 파일 생성 (아이노드 할당)
user@host:~$ echo "hello" >> a # 내용 추가
user@host:~$ cp a ac # 복사본 생성 (새 아이노드)
user@host:~$ ln a al # 하드 링크 생성 (동일 아이노드)
user@host:~$ echo "world" >> a # a 파일 수정
user@host:~$ cat al # al도 동일 내용 (hello\nworld)
user@host:~$ cat ac # ac는 기존 내용만 (hello)
user@host:~$ ls -i
2490383 a 2490411 ac 2490383 al
user@host:~$ stat a
File: a
Size: 12 Blocks: 8 IO Block: 4096 regular file
Device: 805h/2053d Inode: 2490383 Links: 2
Access: (0664/-rw-rw-r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
# Links: 2 출력 -> 하드 링크 2개
덴트리(Directory Entry, Dentry)
덴트리는 파일명과 아이노드를 연결하는 디렉토리 엔트리 구조
파일 시스템에서 파일 경로(/home/username/a)를 실제 아이노드 번호로 변환하는 역할
디렉토리도 파일이므로 덴트리 구조로 계층 관리 (/ → home → username → a)
파일명은 덴트리에만 저장, 실제 데이터와 메타데이터는 아이노드에 저장됨
소프트 링크(심볼릭 링크)
원본 파일이나 디렉토리의 절대 또는 상대 경로를 가리키는 포인터(링크)
원본이 삭제되거나 이동되면 링크가 깨져서 참조 불가가 됨
생성 명령어: ln -s 원본 링크_이름
ln -s [-T] 원본 링크_이름
ln -s 원본
ln -s 원본1 원본2 ... 디렉토리
소프트 링크 사용 예시
username@host:~$ ln -s a as # 현재 디렉토리 내 'a' 파일을 가리키는 링크 생성
username@host:~$ ln -s /home/username/a as2 # 절대 경로 사용 예시
username@host:~$ ls -l
lrwxrwxrwx 1 username username 1 11월 26 16:17 as -> a
lrwxrwxrwx 1 username username 11 11월 26 16:17 as2 -> /home/username/a
username@host:~$ mkdir 1
username@host:~$ mv as 1
username@host:~$ cat 1/as # No such file or directory (깨진 링크)
# as는 현재 위치 기준 상대경로 a를 가리키고
# 이 링크를 다른 디렉토리로 옮기면 원본 위치를 계속 찾기 때문에 깨짐 발생
username@host:~$ mv as2 1
username@host:~$ cat 1/as2
hello world # 정상 작동
# as2는 절대 경로로 가리켜 다른 디렉토리에 옮겨도 원본을 참조 가능
하드 링크
원본 파일과 동일한 아이노드(데이터 블록)를 가진 또 다른 파일 이름
파일에만 가능하며, 디렉토리에는 사용 불가
원본과 하드 링크는 구분할 수 없으며, 원본이 삭제되어도 데이터는 살아 있음
생성 명령어: ln 원본 링크이름
하드 링크 사용 예시
username@host:~$ mv a am
username@host:~$ ls -l
-rw-rw-r-- 2 username username 12 11월 26 16:07 al
-rw-rw-r-- 2 username username 12 11월 26 16:07 am # Links: 2, a ↔ al ↔ am 공유
lrwxrwxrwx 1 username username 1 11월 26 16:17 as -> a # 소프트 링크 (사용 불가)
lrwxrwxrwx 1 username username 11 11월 26 16:17 as2 -> /home/username/a # 소프트 링크 (사용 불가)
# 원본 a를 am으로 이름 변경해도 하드 링크 al은 정상 작동
# 소프트 링크 as, as2는 원본 이름 변경으로 깨져서 사용 불가
| 구분 | 하드 링크 (ln 원본 링크) | 소프트 링크 (ln -s 원본 링크) |
|---|---|---|
| 아이노드 | 동일 아이노드 공유 | 별도 아이노드 (원본 경로 저장) |
| 원본 삭제 시 | 정상 동작(데이터 보존) | 깨짐(빨간색 표시) |
| 파일 크기 | 0바이트 아님(데이터 공유) | 몇 바이트(경로만 저장) |
| ls 표시 | -rw-rw-r--(일반 파일) | lrwxrwxrwx(l로 시작) |
| 디렉토리 링크 | 불가능 | 가능 |
리눅스를 써본 적은 있었지만 이렇게 이론이랑 같이 배우는 건 처음이라
익숙하면서도 새로운 내용이었다.
다음 포스팅에서는 사용자와 소유권, 프로세스와 시그널에 관해 다룰 예정이다.