본문 바로가기

Contact English

【운영체제】 각론 1강. 리눅스(Linux)

 

각론 1강. 리눅스(Linux)

 

추천글 : 【운영체제】 운영체제 목차


1. 개요 [본문]

2. 설치 [본문]

3. 명령어 [본문]


a. 리눅스 서버

b. 리눅스 유용 함수 모음

c. 리눅스 주요 트러블슈팅 [01-20]


 

1. 개요 [목차]

⑴ 맥OS, 우분투(ubuntu)는 리눅스 계열

⑵ 리눅스 환경에 익숙치 않을 시 Terminus 프로그램 이용 : 학생에게는 무료로 제공됨

 

 

2. 설치 [목차]

방법 1. Ubuntu

① 우분투(Ubuntu) 등은 원래부터 리눅스를 운영체제로 하여 작동하므로 터미널을 켜면 리눅스를 조작할 수 있음 

방법 2. MacOS

2-1. 터미널로 ssh 명령어를 이용하면 리눅스 서버에 원격으로 접속할 수 있음

2-2. M1 MacBook에 Parallels로 Linux 설치 

 M1 맥북은 AMD64 desktop image를 사용하는 게 아니고 64-bit ARM desktop image를 사용해야 함

Ryzen 7은 AMD-V enabling을 지원하지 않음 : ARM desktop image를 사용해야 할 듯

맥북에서 Parallels 삭제하는 법 

방법 3. Windows

3-1. 리눅스 서버에 접속하는 방법은 다음과 같음 

○ mobaXterm

○ PowerShell

FireZilla

3-2. Windows에 VMware로 Linux 설치

 virtual environment를 만들어서 Linux를 설치함 

○ mobaXterm을 써서 파일 전송을 할 수 있음

AMD-V enable을 명시적으로 해야 할 수 있음 : GIGABYTE에서 AMD-V enable을 명시적으로 하는 방법은 아래 예시와 같음 

예시 1 

○ 1st. PC 전원을 켠 뒤 바이오스 화면이 나올 때까지 Del 키를 빠르게 여러 번 누름  

○ 2nd. 'M.I.T.' 탭으로 간 뒤 'Advanced 주파수 설정'으로 이동

○ 3rd. 'Advanced CPU 코어 설정'으로 이동

○ 4th. 'SVM Mode'에서 '사용 안 함'에서 '사용'으로 전환 

예시 2 

○ 1st. 바이오스 화면으로 이동

○ 2nd. 'Tweaker' 탭으로 간 뒤 'Advanced CPU Settings'로 이동

○ 3rd. 'SVM Mode'에서 'Disabled'를 'Enabled'로 전환

 

 

3. 명령어 [목차]

※ 명령어를 기초부터 심화까지 순차적으로 정렬

 ctrl + shift + v : 코드 붙여넣기 

○ 리눅스 비상 탈출 

 ctrl + c : 코드 실행 강제 종료

 ctrl + d 

 ctrl + \ 

 ctrl + z : 코드 일시 중지

○ 리눅스 터미널 clear

ctrl + l : 완벽하게 clear 되지 않아 잘 안 쓰게 됨

clear

reset 

echo -e '\033c'

tput reset 

○ 변수

 $변수명 : 해당 변수의 값

export $변수 : environment variable을 다른 process에 넘겨 주기 위해 사용

export -f $함수 : 함수를 다른 process에 넘겨 주기 위해 사용

 string 변수 : 따옴표 없이 string 변수를 선언할 수 있고 $변수명도 붙일 수 있음

 \ : 여러 줄에 걸쳐 하나의 명령어를 실행할 수 있음. 코드의 가독성을 높이기 위해 사용

○ 단, \ 뒤에 스페이스가 들어가면 escape로 해석됨

 ; : 한 줄 안에 쓰여져 있는 여러 명령문을 구분해 주는 기호

 | : 앞 프로세스의 출력 결과를 뒤 프로세스의 입력으로 연결

 ls : 현재 디렉토리 내 파일 리스트를 보여줌

history : 과거 커멘트 히스토리

history | tail -20 : 과거 커멘드 히스토리 20개만 출력

ssh-keygen : RSA 공개키, 개인키 생성. 맥북의 경우 ~/.ssh 디렉토리에 id_rsaid_rsa.pub 파일이 생성

chmod 

○ change mode의 약자로 permission 관리

○ 사용자 종류 : user (u), group (g), others (o)

○ 권한 종류 : read (r; 4), write (w; 2), execute (e; 1), rw- (4+2=6), r-x (4+1=5), rwx (4+2+1=7)

방법 1. symbolic mode

예 1. chmod u+x filename : user에게 execute 권한 부여

예 2. chmod g-w filename : group에게 write 권한 제거

예 3. chmod o=r filename : others의 권한을 read only로 설정 

방법 2. numeric mode 

예 1. chmod 755 filename : user에게 7, group에게 5, others에게 5의 권한 설정 

응용 1. 디렉토리 전체의 permission 설정 

예 1. chmod -R 755 directory_name : directory_name 전체에 755 권한 설정

chown

○ change ownership의 약자 

chown [user]:[user] [Directory] 

○ 텍스트 에디터 

open 

nano : sudo apt-get install nano으로 설치 (ref

vim 

emacs

zsh

bash 

○ 디렉토리 명령어

open [DIR_NAME] : 특정 디렉토리로 이동

cd : 홈 디렉토리로 이동 

cd [DIR_NAME] : 특정 디렉토리로 이동

cd .. : 현재 디렉토리의 상위 디렉토리로 이동

ls -lh [FILE_NAME] : 특정 파일의 용량 확인

du -sh [DIR_NAME] : 디렉토리의 용량 확인

 mkdir [DIR_NAME] : 특정 폴더 생성

mv [SOURCE] [DESTINATION] : 파일 이동, 파일 교체, 이름 변경 등에서 사용하는 명령어. mv는 move의 줄임말

cp [OPTION] [SOURCE] [DESTINATION] : 파일을 복사하여 붙여넣기

-r : 하위 디렉토리와 파일 전체를 복사

-p : 소유주, 그룹, 권한, 시간 정보를 보존하여 복사

rm [OPTION] [NAME] : 삭제

rm -d [DIR_NAME] : 빈 디렉토리 삭제

rm -r [DIR_NAME] : 비어있지 않은 디렉토리 삭제

○ 파일 압축 명령어

zip -r test.zip ./* : 특정 디렉토리에 모든 파일(./*)을 하위 폴더까지 포함하여 test.zip으로 압축

unzip FILE.zip : 현재 폴더에 FILE.zip 압축 해제

 gzip [FILE_NAME] : gz로 압축하기 

 gzip -d [FILE_NAME].gz : gz 압축 파일을 압축 풀기

 gunzip [FILE_NAME].gz : gz 압축 파일을 압축 풀기

tar [OPTION] [FILE.tar.gz]

[OPTION] : -f, -c, -x, -v, -z, -j, -t, -C, -A, -d, -r, -u, -k, -U, -w, -e 등이 있음 

 

tar [OPTION...] [FILE]...
    -f     : 대상 tar 아카이브 지정. (기본 옵션)
    -c     : tar 아카이브 생성. 기존 아카이브 덮어 쓰기. (파일 묶을 때 사용)
    -x     : tar 아카이브에서 파일 추출. (파일 풀 때 사용)
    -v     : 처리되는 과정(파일 정보)을 자세하게 나열.
    -z     : gzip 압축 적용 옵션.
    -j     : bzip2 압축 적용 옵션.
    -t     : tar 아카이브에 포함된 내용 확인.
    -C     : 대상 디렉토리 경로 지정.
    -A     : 지정된 파일을 tar 아카이브에 추가.
    -d     : tar 아카이브와 파일 시스템 간 차이점 검색.
    -r     : tar 아카이브의 마지막에 파일들 추가.
    -u     : tar 아카이브의 마지막에 파일들 추가.
    -k     : tar 아카이브 추출 시, 기존 파일 유지.
    -U     : tar 아카이브 추출 전, 기존 파일 삭제.
    -w     : 모든 진행 과정에 대해 확인 요청. (interactive)
    -e     : 첫 번째 에러 발생 시 중지.

 

예 1. 압축하기 : tar -zcvf archive.tar.gz ./MyFolder

예 2. 압축 풀기 : tar -xzvf spaceranger-2.0.1.tar.gz

○ .tar.gz 파일뿐만 아니라 .tar 파일도 동일한 명령어를 적용할 수 있음 : 단, .tar에 적용하는 경우 -z를 해제해야 함

xz -z filename : 압축률은 상당히 좋지만 속도가 느림. LZMA, LZMA2 알고리즘 사용

xz -d filename.xz : .xz 파일 압축 풀기

7z a outputfile.7z inputfile : 압축률은 상당히 좋지만 속도가 느림. LZMA 등 사용. Linux에서는 p7zip 패키지를 통해 사용 가능

7z x outputfile.7z : .7z (7-Zip) 파일 압축 풀기

zstd filename : 압축률과 속도 간의 균형을 갖춘 느낌 

zstd -d filename.zst : .zst 파일 압축 풀기 

brotli -Z filename : Brotli를 이용한 압축 

brotli -d filename.brotli : .brotli 파일 압축 풀기 

pigz filename : PIGZ를 이용한 압축 

unpigz filename.gz : .gz 파일 압축 풀기

echo 

echo [STR] : 지정한 문자열을 출력하는 명령어

echo $(($(find . -type d -maxdepth 1 | wc -l) - 1)) : 특정 디렉토리 내 폴더 개수 출력

find  

find . -type d -maxdepth 1 | wc -l : 특정 디렉토리 내 폴더 개수 출력

○ 폴더 동기화 (symbolic link, soft link) 

ln -s [Source_Directory] [Target_Directory]

ln -sf [Source_Directory] [Target_Directory]

unlink [Target_Directory] : 동기화 해제

ifconfig : ip 주소 확인

traceroute [IP_ADDRESS] : 특정 ip 주소에 도달하는 데 있어 거쳐가는 ip 표시

○ 시스템 스펙 보기

 lshw | less : CPU, RAM 등 시스템 스펙에 대한 정보를 알 수 있음

lshw -C display : GPU 정보를 알 수 있음

nvidia-smi : GPU 정보 및 GPU 사용 현황을 알 수 있음 

watch -d -n 0.5 nvidia-smi : GPU 사용 모니터링 

sudo : 리눅스 유저가 다른 유저의 권한으로 커멘드를 실행할 수 있도록 함

○ 유저별로 선택적으로 sudo 권한을 부여할 수 있음

su [User_ID] : 리눅스 유저가 다른 유저 계정으로 전환하는 명령어. sudo su와 같이 많이 씀

reboot : 재부팅

○ 상태창 명령어

free -h : 메모리(memory) 및 swap 확인

top : 명령 실행 및 thread 사용 현황 확인 

 htop : 설치해야 함. top의 상위 호환

df : 시스템 상태 보기 명령어

df -h : 시스템 용량 보기 명령어 

원격 데이터 이동 명령어

방법 1. scp : 파일이 깨질 가능성이 낮음

 scp -P ${port} ${srcFile} ${id}@${destIP}:${destPath}

${port} : destination의 포트 번호

${srcFile} : source에서 옮기고자 하는 파일의 경로. 예 : "~/Downloads/file.txt"

${id} : destination에서 한 사용자의 ID

○ ${destIP} : destination의 ip 주소. 예 : #.#.#.# (IPv4)

${destPath} : destination에서 파일을 저장할 디렉토리 주소. 예 : ~/DATA1/1.txt

코드 자동생성기

방법 2. rsync (remote sync) : 속도가 좀 더 빠름

rsync --rsh=’ssh -p ${port}’ -avzhP ${srcFile} ${id}@${destIP}:${destPath} 

${port} : destination의 포트 번호 

${srcFile} : source에서 옮기고자 하는 파일의 경로.  : "~/Downloads/file.txt"

${id} : destination에서 한 사용자의 ID

${destIP} : destination의 ip 주소.  : #.#.#.# (IPv4)

${destPath} : destination에서 파일을 저장할 디렉토리 주소. 예 : ~/DATA1/1.txt 

코드 자동생성기 

방법 3. sftp

 

## Install NCFTP
sudo apt-get install ncftp


## Connect to the FTP Server
ncftp -u [username] [host address]


## Navigate and Manage Files
# List files and directories.
ls 

# Change directory.
cd [directory] 
lcd [directory] 

# Download a file from the FTP server to your local machine.
get [filename] 

# Upload a file from your local machine to the FTP server.
put [filename] 

# Create a new directory on the FTP server.
mkdir [directory_name]

# Remove a directory on the FTP server.
rmdir [directory_name]

# Delete a file on the FTP server.
rm [filename]

# Exit NCFTP
quit


## Use the ncftpput Command
ncftpput -R -u [username] -p [password] [host] [remote-dir] [local-dir]

# Example 
ncftpput -R -u username -p password ftp.example.com /remote/directory /local/directory

 

방법 4. SFTP를 위한 클라이언트용 소프트웨어 : FileZilla, Cyberduck 등

○ 파일 실행 명령어 

.sh 파일 : .sh 파일을 실행하려면 ./[My_File].sh, sh [My_File].sh, 혹은 bash [My_File].sh와 같이 할 수 있음 

.py 파일 (ref

ctrl + z → bg : 백그라운드 실행 

[명령어] + & : 백그라운드 실행 (ref

이 방식은 세션이 종료되면 (예 : 터미널 종료) 프로세스가 같이 종료되는 문제점이 있음 

nohup을 이용한 백그라운드 실행

step 1. .sh 파일 혹은 .py 파일 준비 

step 2. 터미널 실행

step 3. 환경 구동 후 실행할 .sh 파일 혹은 .py (예 : app.py) 파일이 있는 경로로 이동

step 4. 권한 부여 : chmod 755 app.py

step 5. nohup python app.py \ 

step 6. 엔터를 한 번 더 쳐야 실행됨

step 7. (optional) 실행 확인 : ps -ef | grep app.pynohup.out 확인. "app.py"라는 키워드 인식

step 8. (optional) 백그라운드 실행 강제 종료 : kill {ProcessID} 

tmux를 이용한 백그라운드 실행 

○ tmux → 리눅스 커멘드 → 터미널 창 / mobaxterm 끄기 

도커(docker) : 백그라운드 실행을 할 수 있음 

 while 명령어

 while read

 while ··· do ~ done 

 cat 명령: 파일 출력과 관련

 cat FILE : 파일 내용 출력

 cat > FILE : 파일 생성

 cat -n FILE : 라인마다 번호 출력

 cat -E FILE : 라인 끝에 $ 문자 출력

 cat -T FILE : 탭을 ^I로 출력

 cat -s FILE : 반복된 공백 라인 무시

cat FILE1 FILE2 > FILE_merge : FILE1, FILE2를 합쳐서 FILE_merge로 만들기 

 cat FILE1 - FILE2 : 파일 사이에 내용 추가

 cat FILE | more : 파일 내용을 페이지 단위로 출력

 cat FILE | grep "STR" : 파일 내용 필터링

 cat * : 모든 파일 내용 출력

 cat *.txt : 특정 확장자를 가진 파일 내용 출력

 qsub [-OPTION STR] [SCRIPT] : 큐에 PBS job을 제출

 [SCRIPT] : .sh 파일

○ .sh 파일 뒤에 .sh 파일에 입력할 argument를 기입 

qsub [-e STR] [SCRIPT] : batch job의 표준 에러 스트림이 저장될 경로를 정의 

 qsub [-o STR] [SCRIPT] : batch job의 표준 출력 스트림이 저장될 경로를 정의

 qsub [-N STR] [SCRIPT] : job의 이름을 정의

 grep [STR] : 입력으로 전달된 파일의 내용에서 특정 문자열을 찾고자 할 때 사용

 $ sudo 실행할 명령어

 이렇게 실행하면, root 권한을 가진 채 명령어를 실행하게 되어 오류가 발생하지 않음

 md5sum

 파일 송신부와 파일 수신부 간의 파일 정합성을 확인하기 위한 코드를 생성 

 

$ md5sum /home/parallels/Downloads/metadata.xlsx

 

 보안 관련 : MD5 collision pair를 쉽게 찾을 수 있지만 MD5에 second-preimage attack을 하는 방법이 알려져 있지 않음

sed

netcat

awk

ssh : 리눅스 서버에 원격 접속 시 사용하는 프로토콜 

트러블슈팅 1. ssh를 입력했을 때 command not found가 뜨면 맥북 터미널을 켠 뒤 다음 절차에 따라야 함

○ ssh가 설치됐을 때 보여지는 화면

 

○ 윈도우에서는 Windows 10부터 Windows powershell로 터미널을 활용할 수 있음 (ref)

트러블슈팅 2. ssh: connect to host #.#.#.# port §: Connection refused 

○ 단, #.#.#.#은 ip 주소

원인 1. 맥북에서 원격 로그인 설정이 막혔기 때문

해결 방법 : 시스템 환경설정 > 공유 > 원격로그인 > ON (ref

원인 2. openssh가 설치돼 있지 않기 때문 (ref)

원인 3. host ip 주소가 바뀐 경우

트러블슈팅 3. key_exchange_identification: read: Connection reset by peer Connection reset by #.#.#.# port §

○ 원인 : 서버의 일시적 오류 

○ 해결방법 : 코드를 다시 입력

트러블슈팅 4. 윈도우에서 VPN 접속을 하고자 하는 경우

○ 넷사랑에서 Xshell을 깔면 윈도우에서도 VPN 접속을 할 수 있음

트러블슈팅 5. Can't operate. Failed to connect to bus: Host is down

○ ssh server에 적합하지 않은 경우

○ 혹시 ssh client를 설치하려고 한 건데 ssh server를 설치한 건 아닌지 검토 

curl : 특정 url의 파일을 다운로드 받을 수 있음

 

curl -o my.sh "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-x86_64.sh"

 

 wget 명령어 : 거의 모든 다운로드를 가능하게 함 

: wget https://raw.githubusercontent.com/jdblischak/singleCellSeq/master/code/run-md5sum.sh

 wget이 없다고 나오는 경우 : $ sudo apt-get install -y wget

 보통 명령어 전체를 다 받아옴 :  $git clone https://github.com/jdblischak/singleCellSeq.git 

sudo netstat -lntp : port 별 PID, protocol 등을 알 수 있음 

GNU Parallel을 통한 병렬 처리

 

## install for Devian/Ubuntu
sudo apt-get update
sudo apt-get install parallel

## run 
process() {
	... 
}
parallel process

 

입력: 2021.11.04 23:23

수정: 2023.06.02 14:21