리눅스
리눅스(Linux)는 리누스 토르발즈에 의해 1991년부터 개발되는 운영체제의 커널 소프트웨어이다.
이 커널을 사용해 개발된 운영체제를 리눅스 계열 운영체제라고 부르며, GNU에서 개발한 각종 OS 차원 프로그램과 결합한 경우 GNU/Linux라고 한다.
역사[편집 | 원본 편집]
1991년 핀란드 헬싱키 공대에 재학 중이던 리누스 토르발즈가 i386 미닉스 컴퓨터를 이용해 제작했다. 초기부터 오픈 소스 프로젝트로 진행하며 기여자들을 명시하는 등 회사가 아닌 개별 개발자에 친근하게 다가간 결과 기여자가 많아지며 성장세가 빨랐고, 리처드 스톨먼이 주도하는 GNU가 이 프로젝트에 주목하여 Hurd를 사실상 버리고 리눅스에 GNU 유틸리티를 붙이면서 오늘날과 같은 규모가 되었다.[1]
구조[편집 | 원본 편집]
리눅스는 기본적으로 모놀리식 커널로 분류되어 커널 자체에 핵심적인 프로세스 스위칭 및 메모리 관리, 시스템 콜, 장치 통신 기능에 더해 장치(디바이스) 드라이버, 네트워킹 기능 등의 추가 기능까지 모조리 합친 구조이다. GNU는 Hurd라는 프로세스 스위칭 및 메모리 관리, 장치 통신 기능만 구현하는 마이크로커널 구조의 커널 개발이 지연되자 Linux를 대용으로 쓰려다가 이 조합이 아예 본진이 되어버렸다(Hurd는 현재 개발이 명목 상으로만 이어지며 Debian 적용 버전을 제외하고 사실상 프로젝트 중단 상태에 가깝다).
리눅스는 원래 태스크라 하여 프로세스에 해당하는 프로그램 실행 흐름 단위만 있었다가 추후에 스레드에 대응하는 경량 프로세스(Lightweight Process) 개념이 이식되었다. 다만 스레드 개념을 적극적으로 쓰는 Windows와 달리 리눅스는 대부분의 응용 소프트웨어가 프로세스 개념만 쓰는 경우가 많다. 리눅스는 PID 숫자로 이들 프로세스를 구분한다. 프로세스 간 데이터를 주고 받을 때에는 IPC(Inter-Process Communication) 기능으로 시그널(OS 차원의 신호, CPU 연산 과정에서 발생한 에러 등을 소프트웨어에게 보낸다), 파이프(부모-자식 종속이 걸린 프로세스들에서 하는 단방향 데이터 통신), FIFO 파이프(종속 없는 프로세스 간의 양방향 데이터 통신), 세마포어(Semaphore)를 걸은 공유 메모리, 메세지 큐 등을 사용하며 서로 다른 컴퓨터 간의 프로세스들과 한 컴퓨터 내의 프로세스들 사이의 통신을 모두 지원하는 POSIX 호환 소켓 통신도 있다.
리눅스의 장치 드라이버는 dev 폴더 안에 있다. 하나의 파일이 하나의 장치 제어에 쓰인다. 응용 소프트웨어는 sys 폴더의 장치 정보 및 설정 파일을 이용해 장치를 제어한다. 커널의 각종 핵심 동작(CPU 정보, 프로세스 스케줄링 정보, 메모리 관리 상태 등 각종 시스템 정보)은 proc 폴더에서 확인/처리할 수 있다.
다른 모놀리식 커널처럼 리눅스도 최하위에 아키텍처 의존 코드(리눅스 소스 코드의 arch 폴더나 include 폴더의 asm 폴더의 내용물 같은 특정 CPU 아키텍처의 어셈블리 코드)를 두고 그 위의 커널 코드로 하드웨어를 제어하며 응용 소프트웨어와 시스템 콜 인터페이스에 따라 기능을 넘겨준다.
POSIX의 영향을 받아 파일 입출력이나 장치 제어를 위한 데이터 통신 시에 다음과 같은 함수를 호출한다.
- open: 파일은 열기, 장치 통신은 초기화
- close: 파일은 닫기, 장치 통신은 종료
- read: 파일/장치에서 데이터 읽어오기
- write: 파일/장치에 데이터 쓰기
- ioctl: 장치와의 통신에서 메타데이터가 되는 정보에 접근/조작하는 식으로 장치 동작 제어
- poll: 장치와의 통신에서 응답을 감시
주요 쉘 명령어들[편집 | 원본 편집]
다음은 busybox[2]에서 지원하는 기본적인 쉘 명령어들이다. 출처
acpid, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, basename, beep, blkid, brctl, bunzip2, bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cryptpw, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg, dnsd, dnsdomainname, dos2unix, dpkg, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fgrep, find, findfs, flash_lock, flash_unlock, fold, free, freeramdisk, fsck, fsck.minix, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, gunzip, gzip, hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, inotifyd, insmod, install, ionice, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, last, length, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lzmacat, lzop, lzopcat, makemime, man, md5sum, mdev, mesg, microcom, mkdir, mkdosfs, mkfifo, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modprobe, more, mount, mountpoint, mt, mv, nameif, nc, netstat, nice, nmeter, nohup, nslookup, od, openvt, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, popmaildir, printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readlink, readprofile, realpath, reformime, renice, reset, resize, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setarch, setconsole, setfont, setkeycodes, setlogcons, setsid, setuidgid, sh, sha1sum, sha256sum, sha512sum, showkey, slattach, sleep, softlimit, sort, split, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, true, tty, ttysize, udhcpc, udhcpd, udpsvd, umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip
리눅스 커널의 컴파일[편집 | 원본 편집]
리눅스의 커널은 소스 코드가 공개되어 있기 때문에 직접 컴파일하여 자신만의 리눅스 커널을 만들 수 있다. 커널이 운영체제의 핵심 동작을 제어하는 심장부인 만큼 자작이 대단히 어렵기 때문에 타이젠 같은 절대 다수의 오픈 소스 운영체제가 결국 변종 리눅스 운영체제인 것도 이와 관련이 있다.
리눅스 커널 컴파일은 보통 GCC, GNU make, libstdc, bison, flex 정도의 개발 프로그램/라이브러리 패키지를 모든 변종 리눅스들이 요구한다. 우분투나 데비안에서는 GCC와 GNU make 같은 핵심 프로그램을 apt를 통해 build-essentials이라는 패키지로 제공한다.
그 외에 화면 입출력용 ncurses 라이브러리(libncurses)나 암호화 알고리즘 지원을 위한 OpenSSL(libssl-dev) 같은 라이브러리를 요구하니 인터넷에서 검색하다 보면 무엇이 필요한지 대충 감이 올 것이다.
사전에 필요한 컴파일 도구들이 준비되었고 리눅스 소스 코드를 받았다면 작업 디렉토리를 소스 코드가 있는 최상위 폴더로 하고 make menuconfig를 터미널에 입력한다. 그러면 다음 목록이 TUI[3] 형태로 뜬다.
- General Setup: 아래에 별도 항목으로 분리되지 않은 기능들은 다 여기 들어있다. 배터리 및 전원 관리 기능 같은 것이 여기 들어 있다.
- Code maturity level options: 실험적인 기능(베타 버전인 기능들)을 추가한다. 커널 컴파일이 실패했는데 이유를 알 수 없을 경우 가장 먼저 끄게 되는 옵션이다.
- Loadable Module Support: 모듈 기능 지원 옵션. 리눅스용 디바이스 드라이버 제작에 필수적인 옵션이므로 보통 반드시 켠다.
- Processopr type and features: 어떤 CPU를 써서 돌릴 것인지 결정하는 옵션
- Multi-device support: RAID나 LVM 같이 여러 저장 장치를 묶는 기능에 관한 옵션이다. 서버용 리눅스에서는 대단히 중요하다.
- Character devices: 그래픽 카드 같은 보조 연산 장치나 마우스/키보드/조이스틱 등의 입력 장치는 여기서 지원 여부를 결정한다.
- Block Devices: 대부분의 보조 기억 장치(HDD, 플로피 디스크, CD/DVD, SSD, 램 디스크)의 지원 여부를 결정하는 옵션.
- Plug and Play Support: USB 메모리 같은 것을 꽂았을 때 바로 인식(Mount)할 수 있는 기능을 제공하는 옵션. Plug&Play는 21세기에는 대중화되었지만 20세기에 만들어진 장치에서는 지원하지 않는 경우가 절대 다수다. 박물관으로 가야 할 컴퓨터가 이걸 끄는 경우가 많다.
- Parallel port support: 2010년 이전에 만들어진 프린터들은 병렬 포트라는 것으로 PC에 연결하는 경우가 있다. 당연히 요즘에는 병렬 포트가 PC에서 없어지는 추세기 때문에 특수한 목적으로만 켜게 된다(예: 조선컴용 리눅스, 공장 설비 제어 컴퓨터용 리눅스 등)
- Memory Technology Devices: 플래시 메모리나 흔하지 않은 비휘발성 메모리를 사용하는 장치들(SSD나 SD 카드, 특수한 RAM 등)을 이 옵션을 건드리는 경우가 있다. 주로 임베디드 시스템용 리눅스가 이걸 활성화하는 경우가 많다.
- Networking Options: 인터넷을 하려면 이 옵션을 켜고 컴파일을 해야 한다. IP 프로토콜 지원 관련 옵션이 여기 있다.
- File Systems: ext 같은 파일 시스템 지원 여부다. ext2랑 ext3, FAT32랑 exFAT 같은 파일 시스템은 기본으로 켜고 컴파일을 하게 될 것이다. 여기에 마이크로소프트 윈도우가 깔린 컴퓨터를 위해 NTFS 지원을 추가하는 정도면 PC에서 쓰기 무난하다.
- ATA/IDE/MFM/RLL Support 및 IDE, ATA and ATAPI Block devices: 구닥다리 하드디스크를 쓰는 PC에서 활성화하면 된다.
- SCSI Support: SCSI가 거의 서버에서만 쓰기 때문에 PC에서는 꺼도 문제가 생길 일이 적다
- USB, Bluetooth는 별도로 지원 여부를 결정하는 옵션이 있다.
- 커널 디버깅 옵션은 커널 자체를 변경할 때 잠깐 켜는 것이 좋다.
- 그 외에 비디오 옵션이나 터미널 같은 콘솔 화면 관련 옵션, 사운드 카드 관련 옵션이 있다. 그 외 옵션은 2020년대 이후에는 활성화를 안 해도 PC에서는 무난한 희귀한 장치(예: 모뎀, IEEE1394 등)들의 지원 여부라 신경 꺼도 된다.
그 다음 make modules -> make modules_install -> make install 순으로 입력하면 makefile 파일에 명시된 대로 커널 설치가 이루어진다. 데비안/우분투 등에서는 make kpkg로 dpkg 툴을 이용해 커널 이미지를 만드는 추가 기능을 제공한다. 만일 부트로더를 포함한다면 LILO나 GRUB을 포함하게 될 것인데, 현대에는 GRUB을 보통 쓴다.
지원 CPU[편집 | 원본 편집]
기타 및 도보시오[편집 | 원본 편집]
- 리눅스 계열 운영체제의 Shell에 로그인할 때 뜨는 문구(Message of the day, MOTD)는 /etc/motd 파일을 수정하여 변경할 수 있다.
- 작은숲:위키노트/리눅스: 위키노트의 리눅스 관련 문서들
- Yocto 프로젝트
각주
- ↑ 동시기 경쟁작이자 정통 UNIX를 표방한 BSD 계열 프로젝트들은 UNIX를 개발한 벨 연구소 담당 회사인 AT&T와의 소송전 힘겨루기 과정에서 시간과 인력을 소모해버렸고, NEXTSTEP이 맥 OS X가 된 이후 FreeBSD 개발 커뮤니티가 애플과의 공생을 통해 LLVM 프로젝트 등을 지원 받으며 활력을 되찾을 때까지 암흑기를 보내야 했다.
- ↑ 임베디드 리눅스를 위해 필수 유닉스 유틸리티들을 단일 실행 파일로 줄인 유틸리티 프로그램
- ↑ Text User Interface, 윈도우 명령 프롬프트나 리눅스 터미널 같은 글 형태의 CUI가 아니라 일정한 레이아웃을 가진 콘솔 창 화면을 가리킨다