대부분의 생명정보학 도구는 리눅스용으로 출시된다. 따라서 의생명정보학 연구를 위해서는 리눅스 환경에서의 작업이 필수적이다. 이는 리눅스 환경이 고성능 컴퓨팅과 대용량 데이터 처리에 최적화되어 있기 때문이며, 주로 다음과 같은 이유로 생명정보학 분야에서 널리 사용된다:
생명정보학을 공부하고 실무에 적용하기 위해서는 리눅스를 공부하는 것이 매우 중요하다.
자유 소프트웨어 재단은 1985년 리처드 스톨만(Richard Stallman, 일명 “RMS”)에 의해 창설되었다. 이 재단의 핵심 철학은 “자유(Free) 소프트웨어”의 개념이다. 여기서 말하는 “자유”란 누구나 자유롭게 소프트웨어를 공부하고, 변경하고, 배포할 수 있도록 그 소스 코드가 공개된 소프트웨어를 의미한다.
이는 소프트웨어를 무료로 제공해야 한다는 의미가 아니다. 리처드 스톨만의 유명한 말에 따르면 “자유 소프트웨어는 언론의 자유와 같은 자유를 의미하는 것이지, 무료 맥주를 의미하는 것이 아니다(Free in the sense of free speech, not free beer).”
자유 소프트웨어 재단은 일반 공중 사용 허가서(General Public License, GPL)를 통해 자유 소프트웨어의 권리를 보호한다. GPL은 자유 소프트웨어를 사용하여 개발한 소프트웨어도 반드시 자유 소프트웨어가 되어야 한다는 조건을 포함한다.
GNU(GNU is not UNIX!)는 자유 소프트웨어 재단의 주요 프로젝트 중 하나이다. 이 프로젝트의 목표는 당시 가장 인기 있었던 운영체제인 유닉스(UNIX)의 “클론”을 제작하는 것이었다. 유닉스는 커널(Kernel)과 다양한 유틸리티로 구성되어 있었다.
리처드 스톨만은 이를 위해 수많은 유틸리티를 개발했다:
한편, 지구 반대편 핀란드에서는 리누스 토발즈(Linus Torvalds)가 “재미로(just for fun)” 운영체제 커널을 개발하고 있었다. 이 커널은 후에 GNU 프로젝트의 일부로 편입되게 된다.

Figure 18.1 리누스 토발즈가 리눅스를 처음 발표한 역사적 순간 (1991년)
GNU 프로젝트의 유틸리티와 리눅스 커널의 결합으로 GNU/Linux 시스템이 탄생했다. 이 시스템은 유닉스와 완전히 호환되는 POSIX 준수 시스템으로, 현재 99% 이상의 서버 시스템이 리눅스를 채택하고 있다.
현재는 이 시스템을 간단히 “리눅스”라고 부르는 것이 일반적이다. 이는 시스템에 포함된 모든 소프트웨어가 GPL을 따르는 것은 아니기 때문이다. 물론 리처드 스톨만은 리눅스라는 명칭보다는 GNU/Linux라는 명칭을 선호한다.
리눅스 배포판은 각자의 취향과 목적에 맞는 소프트웨어를 기본으로 포함하는 리눅스 운영체제이다. 다양한 배포판이 존재하며, 이들은 웹사이트 https://distrowatch.com/ 에서 확인할 수 있다.
가장 널리 사용되는 두 카테고리의 배포판은 다음과 같다:
배포판의 주요 차이점 중 하나는 패키지 매니저이다:
이들은 비슷한 활용법을 가지고 있다:
apt install 패키지명 (데비안 계열)yum install 패키지명 또는 dnf install 패키지명 (레드햇 계열)패키지 매니저는 “루트(root)” 권한이 있는 사용자만 활용할 수 있다.
리눅스에서 “루트”는 두 가지 의미를 가진다:
디렉토리는 파일 및 다른 디렉토리를 포함할 수 있는 논리적 공간을 의미한다. 윈도우의 “폴더”와 같은 개념이다.

Figure 18.2 리눅스 파일 시스템의 경로 구조와 절대경로/상대경로
리눅스의 주요 디렉토리는 다음과 같다:
쉘은 커널과 사용자 간의 인터페이스 역할을 한다. 주로 CUI(Command-Line User Interface) 기반으로, 키보드를 통해 명령어를 입력하고 화면에 그 결과를 확인할 수 있다.
주요 쉘의 종류:
프로젝트별로 분리된 가상 환경을 구축하면 서로 다른 프로젝트에서 서로 다른 버전의 소프트웨어를 사용할 수 있다. 생명정보학에서는 주로 두 가지 도구를 상호 보완적으로 사용한다:
최근에는 Python 패키지 관리에 Conda를 사용하지 않는 추세이다. Python 패키지는 uv로 관리하고, R이나 기타 생명정보학 소프트웨어는 Micromamba로 관리하는 것이 효율적이다.
Micromamba는 Conda의 빠른 대안으로, R이나 생명정보학 도구를 설치하는 데 적합하다.
$ curl -Ls https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -xvj bin/micromamba
$ ./bin/micromamba shell init -s bash -p ~/micromamba
$ source ~/.bashrc
# R 환경 생성 및 R 설치
$ micromamba create -n r-env r-base r-tidyverse
$ micromamba activate r-env
(r-env) $ R --version
R version 4.x.x
# 생명정보학 도구 설치
$ micromamba create -n bioinfo samtools bwa bedtools
$ micromamba activate bioinfo
(bioinfo) $ samtools --version
# 환경 비활성화
(bioinfo) $ micromamba deactivate
# 설치된 환경 목록 확인
$ micromamba env list
uv는 Rust로 작성된 빠르고 현대적인 Python 패키지 매니저이다. 기존의 pip, conda보다 훨씬 빠른 속도를 제공한다.
$ curl -LsSf https://astral.sh/uv/install.sh | sh
uv는 uv run 명령어를 통해 가상환경을 명시적으로 활성화하지 않고도 Python 스크립트를 실행할 수 있다.
# 프로젝트 디렉토리 생성
$ mkdir project1
$ cd project1
# 가상환경 생성
$ uv venv
# 패키지 설치
$ uv pip install numpy pandas matplotlib
# Python 스크립트 실행 (가상환경 자동 사용)
$ uv run python script.py
# Python 버전 확인
$ uv run python --version
# 패키지 버전 확인
$ uv run python -c "import numpy; print(numpy.__version__)"
다음은 두 가지 프로젝트에서 서로 다른 버전의 Python을 사용하는 예제이다:
# project1 환경 생성 (Python 3.9)
$ mkdir project1 && cd project1
$ uv venv --python 3.9
$ uv run python --version
Python 3.9.x
# 필요한 패키지 설치
$ uv pip install numpy pandas matplotlib
$ uv run python -c "import numpy; print(numpy.__version__)"
1.xx.x
# project2 환경 생성 (Python 3.13)
$ mkdir ../project2 && cd ../project2
$ uv venv --python 3.13
$ uv run python --version
Python 3.13.x
# 필요한 패키지 설치 (동일한 패키지, 다른 버전)
$ uv pip install numpy pandas matplotlib
$ uv run python -c "import numpy; print(numpy.__version__)"
2.xx.x
두 도구는 각자의 강점이 있으므로 함께 사용하는 것이 효과적이다:
예를 들어, R과 Python을 함께 사용하는 프로젝트에서는 Micromamba로 R을 설치하고, uv로 Python 패키지를 관리할 수 있다.
Rosalind는 생명정보학 문제풀이 웹사이트(https://rosalind.info/)로, 생명정보학을 코딩테스트처럼 공부할 수 있게 해준다. 생명정보학 개념을 실습을 통해 배우고 싶다면 Rosalind의 문제를 풀어보는 것이 좋은 방법이다.

Figure 18.3 pwd 명령어를 통한 현재 작업 디렉토리 확인
cp 소스파일 {대상파일 또는 대상디렉토리}cp -r 소스디렉토리 대상디렉토리mv 소스파일 {대상파일 또는 대상디렉토리}mkdir 디렉토리명rmdir 디렉토리명rm 파일명rm -r 디렉토리명
Figure 18.4 htop을 이용한 시스템 리소스 모니터링

Figure 18.5 nano 텍스트 에디터의 인터페이스와 기본 사용법
ln -s 원본파일 링크파일리눅스에서는 프로그램의 입출력을 다른 파일이나 프로그램으로 연결할 수 있다. 이를 리다이렉션(Redirection)이라고 한다.
리눅스의 모든 프로세스는 세 가지 표준 스트림을 가진다:
# 표준 출력을 파일로 저장 (덮어쓰기)
$ ls > file_list.txt
# 표준 출력을 파일로 저장 (추가)
$ ls >> file_list.txt
# 표준 에러를 파일로 저장
$ command 2> error.log
# 표준 출력과 표준 에러를 모두 파일로 저장
$ command > output.txt 2>&1
# 또는
$ command &> output.txt
# 파일 내용을 표준 입력으로 사용
$ sort < unsorted.txt
파이프(|)는 한 명령어의 출력을 다른 명령어의 입력으로 연결한다:
# ls 출력을 grep으로 필터링
$ ls -la | grep ".txt"
# 파일 내용을 정렬하고 중복 제거
$ cat data.txt | sort | uniq
# 단어 개수 세기
$ cat document.txt | wc -w
# 여러 파이프 연결
$ zcat large_file.gz | grep "pattern" | sort | uniq -c | head -10
프로세스 치환 <()는 명령어의 출력을 임시 파일처럼 사용할 수 있게 한다:
# 두 명령어의 출력을 비교
$ diff <(sort file1.txt) <(sort file2.txt)
# 두 디렉토리의 파일 목록 비교
$ diff <(ls dir1) <(ls dir2)
grep은 파일에서 특정 패턴을 검색하는 명령어이다:
# 기본 사용법
$ grep "pattern" filename
# 대소문자 무시
$ grep -i "pattern" filename
# 줄 번호 표시
$ grep -n "pattern" filename
# 패턴이 없는 줄 출력
$ grep -v "pattern" filename
# 재귀적으로 디렉토리 내 모든 파일 검색
$ grep -r "pattern" directory/
# 일치하는 파일명만 출력
$ grep -l "pattern" *.txt
정규표현식은 문자열 패턴을 표현하는 방법이다:
.: 임의의 한 문자*: 앞 문자가 0번 이상 반복+: 앞 문자가 1번 이상 반복?: 앞 문자가 0번 또는 1번^: 줄의 시작$: 줄의 끝[abc]: a, b, c 중 하나[a-z]: a부터 z까지 중 하나[^abc]: a, b, c가 아닌 문자\d: 숫자 (0-9)\s: 공백 문자\w: 단어 문자 (알파벳, 숫자, 밑줄)# 확장 정규표현식 사용 (-E 옵션)
$ grep -E "^chr[0-9]+\s" genome.bed
# FASTA 파일에서 헤더 라인만 추출
$ grep "^>" sequences.fasta
# 특정 패턴으로 시작하는 줄 찾기
$ grep -E "^ATCG" dna_sequences.txt
# 이메일 패턴 찾기
$ grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" contacts.txt
쉘 스크립트는 여러 명령어를 파일에 저장하여 자동으로 실행할 수 있게 하는 프로그램이다.
#!/bin/bash
# 이것은 주석이다
echo "Hello, World!"
스크립트 파일의 첫 줄 #!/bin/bash는 셔뱅(shebang)이라고 하며, 이 스크립트를 실행할 인터프리터를 지정한다.
# 변수 선언 (= 양쪽에 공백 없음)
name="Bioinformatics"
count=10
# 변수 사용
echo $name
echo "Count is: $count"
# 명령어 결과를 변수에 저장
current_dir=$(pwd)
file_count=$(ls | wc -l)
#!/bin/bash
file="data.txt"
if [ -f "$file" ]; then
echo "파일이 존재한다."
elif [ -d "$file" ]; then
echo "디렉토리이다."
else
echo "파일이 존재하지 않는다."
fi
조건 테스트 연산자:
-f file: 파일이 존재하고 일반 파일인지-d dir: 디렉토리가 존재하는지-e path: 경로가 존재하는지-z string: 문자열이 비어있는지-n string: 문자열이 비어있지 않은지$a -eq $b: 숫자가 같은지$a -ne $b: 숫자가 다른지$a -lt $b: a가 b보다 작은지$a -gt $b: a가 b보다 큰지#!/bin/bash
# 리스트 순회
for fruit in apple banana cherry; do
echo "Fruit: $fruit"
done
# 파일 순회
for file in *.fastq; do
echo "Processing: $file"
# 파일 처리 명령어
done
# 숫자 범위 순회
for i in {1..10}; do
echo "Number: $i"
done
# C 스타일 for 루프
for ((i=0; i<5; i++)); do
echo "Index: $i"
done
#!/bin/bash
# 카운터 사용
count=1
while [ $count -le 5 ]; do
echo "Count: $count"
((count++))
done
# 파일을 줄 단위로 읽기
while read line; do
echo "Line: $line"
done < input.txt
#!/bin/bash
# FASTQ 파일들을 순회하며 품질 분석
for fastq in *.fastq.gz; do
echo "Analyzing: $fastq"
# 읽기 수 계산
read_count=$(zcat "$fastq" | wc -l)
read_count=$((read_count / 4))
echo "Total reads: $read_count"
done
리눅스는 생명정보학에서 필수적인 도구이다. 대부분의 생명정보학 소프트웨어와 데이터베이스는 리눅스 환경에서 개발되고 운영된다. 또한, 대용량 데이터 처리, 병렬 컴퓨팅, 자동화된 워크플로우 구축 등 생명정보학 연구에 필요한 다양한 작업을 리눅스 환경에서 효율적으로 수행할 수 있다.
리눅스의 명령줄 인터페이스(CLI)는 반복적인 작업을 자동화하고, 복잡한 데이터 처리 파이프라인을 구축하는 데 유용하다. 또한, 서버 환경에서의 원격 작업 및 배치 작업 실행에도 리눅스의 기능이 필수적이다.