🔷 유닉스 운영체제를 위해 만들어진 화면 기반의 텍스트 편집기
1970년대 중반: 당시 유닉스 시스템에는 ed라는 라인 기반 텍스트 편집기가 기본
1976년, 빌 조이(Bill Joy)가 UC 버클리에서 ex(익스)라는 라인 편집기를 개발함
1979년 5월, Second BSD와 함께 배포된 ex 2.0부터 vi라는 이름으로 설치
오리지널 vi는 AT&T의 저작권에 묶여 자유롭게 배포 불가(상업적 UNIX만 사용 가능)
2000년대 초, 비로소 오리지널 vi 소스가 오픈소스 라이선스로 풀림
🔷 Vi IMproved(개선된 vi)의 약자
1991년, 브람 몰렌라가 처음 발표
vi와 호환되면서 훨씬 많은 기능 추가하는 것을 목표
vi와 100% 호환성을 유지하면서도 더 강력한 텍스트 편집 환경을 제공
서버나 터미널 환경에서 빠르고 가볍게 텍스트 파일을 만들고 수정하는 데 가장 널리 사용
🔷 모드 방식 에디터
명령 모드
, 입력 모드
, 명령줄 모드
세 가지로 나뉘어 있음🔷 키보드만으로 모든 조작이 가능
💡 모드형과 비모드형 편집기
🔷 모드형: 입력 모드와 명령 모드를 구분
- 입력 모드: 텍스트를 입력할 수 있는 모드
- 명령 모드: 텍스트 수정/삭제/복사/붙이기 등 편집 모드
🔷 비모드형: 모드 구분이 없음 (예: 한글, 워드 등)
- alt, ctrl, shift 등 특수 키를 이용하여 편집 명령 수행
🔷 명령 모드 (Command mode)
기본 모드 (vi를 실행하면 바로 이 상태!)
커서 이동, 삭제, 복사, 붙여넣기 등 명령을 입력
입력 모드로 전환: i, a, o
등
🔷 입력 모드 (Insert mode)
실제로 텍스트를 입력/수정하는 모드
명령 모드에서 i(insert), a(append), o(open line)
등 입력
명령 모드로 돌아가려면: Esc
🔷 명령줄 모드 (command-line mode)
저장, 종료, 검색, 교체 등 명령 입력
명령 모드에서 :(콜론) 입력 후 사용
저장: :w
종료: :q
강제종료: :q!
저장 & 종료: :wq
삭제 : dd
돌리기 : u
복사 : yy
븥여넣기 : p
행 번호 보이기 : :set nu
위에서부터 찾기 : /검색어
아래에서부터 찾기 : ?검색어
더 찾기 : /enter
or ?enter
맨 아래로 내려가기 : G (shift + g)
맨 위로 올라가기 : gg
열의 맨 뒤로 가기 : $ (shift + 4)
열의 맨 앞으로 가기 : ^ (shift + 6)
한 단어 단위로 앞으로 가기 : W
한 단어 단위로 뒤로 가기 : B
🔷 리눅스 시스템에서 운영체제와 쉘, 실행되는 프로그램이 참고하는 값(데이터)
🔷 시스템 환경변수
시스템 전체에 적용, 모든 사용자와 프로세스가 접근 가능
/etc/profile
, /etc/environment
등에서 지정
🔷 사용자 환경변수
개별 사용자에게만 적용
사용자의 홈 디렉토리에 위치한 ~/.bashrc
, ~/.profile
, ~/.bash_profile
등에서 지정
파일명 | 용도 및 동작 설명 |
---|---|
~/.bash_profile | 로그인 쉘에서 실행. 콘솔, SSH 등 로그인 시 한 번만 읽힘 |
~/.profile | 대부분의 로그인 쉘에서 실행. bash뿐 아니라 sh, dash 등에서도 읽을 수 있음 |
~/.bashrc | bash가 실행될 때 자동으로 run(commands) 하는 스크립트를 모아둔 파일 |
🔷 전체 환경변수 확인
printenv
또는 env
🔷 특정 변수 확인
echo $변수이름
🔷 환경변수 임시 설정 (한 세션(터미널)에만 적용)
export 변수이름=값
❗ 새 터미널에서는 안뜬다.
🔷 환경변수 영구 설정
특정 계정에 영구 적용
로그인/새 터미널 시 자동 적용
~/.bashrc
, ~/.bash_profile
, ~/.profile
등에 export 변수이름=값
형태로 추가
시스템 전체에 적용하고 싶으면
/etc/profile
이나 /etc/environment
파일 편집vi .profile
로 환경 변수 파일을 열어 안에 export 변수이름=값
작성
💡 다른 터미널에서는 바로 보이지만 수정 작업을 한 터미널에서는 바로 안보인다. 새 터미널을 열 필요 없이
source .profile
명령어로 반영시킨다.
🔷 시스템의 효율적인 운영과 모니터링, 문제 해결을 위해 꼭 알아야 할 필수 내용
🔷 프로세스는 실행 중인 프로그램의 인스턴스(작업 단위)
각 프로세스는 고유의 PID(Process ID)
를 가지며, 부모/자식 관계, 사용자, 상태, 자원 사용량 등의 정보를 가짐
리눅스에서 모든 작업(명령어, 서비스, 프로그램)은 프로세스로 동작함
명령어 | 주요 기능 및 설명 |
---|---|
ps , ps aux | 프로세스 목록, 상태, 상세 정보 확인 |
top , htop | 실시간 프로세스/자원 모니터링 |
pgrep , pidof | 프로세스 ID(PID) 찾기 |
kill , killall | 프로세스 종료 |
nice , renice | 프로세스 우선순위 변경 |
jobs , fg , bg | 현재 셸의 작업 관리 (백/포그라운드 전환) |
pstree | 프로세스를 트리 형태로 시각화 |
lsof -p PID | 해당 프로세스가 이용 중인 파일 목록 확인 |
💡
ps aux | grep 검색어
로 찾아kill
할 수 있다.
🔷 서버와 워크스테이션의 안정적인 통신, 보안, 문제 해결을 위해 필수적인 영역
🔷 네트워크: 여러 컴퓨터(서버, 클라이언트, 장치)가 서로 데이터를 송수신할 수 있도록 연결한 시스템
🔷 리눅스에서 네트워크 인터페이스(유선: eth0
, enp0s3
등 / 무선: wlan0
등)를 이용해 IP 주소, 게이트웨이, DNS 설정 등을 구성
🔷 주요 설정 파일
/etc/netplan/*.yaml
: 우분투 리눅스 네트워크 설정 파일
/etc/sysconfig/network-scripts/ifcfg-eth0
: 레드햇 계열 리눅스 네트워크 설정 파일
/etc/resolv.conf
: DNS 서버 설정 파일
💡 이 설정 파일의 들여쓰기는 중요하다.
🔷 네트워크 IP 확인
ipconfig
(Legacy)ip addr show
ip a
💡 ens33
inet "ip address"
🔷 라우팅 테이블 보기
route -n
💡 설치가 필요하다.
sudo apt install net-tools
netstat -rn
ip route
(보기 어려움)
🔷 대상 호스트의 작동 여부를 확인
ping "host"
🔷 Ubuntu에서 고정 ip 설정하는 코드
sudo vi /etc/netplan/50-cloud-init.yaml
network:
version: 2
#renderer: networkd
ethernets:
ens33:
addresses:
- "ip address"
routes:
- to: default
via: "route address"
nameservers:
addresses: ["address 1", "address 2"]
🔷 설정 적용
sudo netplan apply
🔷 테스트
ping "host"
ping google.co.kr
🔷 리눅스 시스템을 사용하는 개별 계정
각 사용자는 고유의 이름, UID(식별 번호), GID(그룹 ID), 홈 디렉토리, 쉘 정보를 가짐
리눅스에는 크게 일반 사용자와 관리자(root) 계정이 존재
🔷 사용자 정보 파일
파일 경로 | 설명 |
---|---|
/etc/passwd | 사용자 계정 정보 (이름, UID, 홈 디렉토리, 쉘 등) |
/etc/shadow | 사용자 암호화된 비밀번호 및 보안 정보 |
/etc/group | 그룹 정보 |
🔷 사용자 추가
sudo adduser [사용자명]
sudo useradd [사용자명]
→ adduser는 대화형(Interactive) 방식
→ useradd는 단순 명령어로 옵션 필요
sudo useradd -m -s /bin/bash -c "abc123d" -G sudo abc123d
🔷 비밀번호 설정
sudo passwd [사용자명]
🔷 다른 계정으로 로그인
su [사용자명]
🔷 사용자 삭제
sudo deluser [사용자명]
💡 삭제해도 기존의 작업 디렉토리는 남아있다.
deluser --remove-home [사용자명]
으로 디렉토리까지 삭제 가능하다.
sudo userdel [사용자명]
💡 마찬가지로 디렉토리가 남지만
userdel -r
옵션으로 메일 주소까지 전부 지워버릴 수 있다.
🔷 사용자 정보 수정
sudo usermod [옵션] [사용자명]
홈 디렉토리 변경:
sudo usermod -d /home/newdir 사용자명
로그인 쉘 변경:
sudo usermod -s /bin/bash 사용자명
sudo 권한 주기:
sudo usermod -G sudo 사용자명
기존 그룹을 유지하면서 새 그룹에 추가하기:
sudo usermod -aG sudo 시용자명
🔷 그룹 관리
그룹은 여러 사용자에게 동일한 권한을 부여할 때 사용
그룹 추가:
sudo addgroup [그룹명]
그룹 삭제:
sudo delgroup [그룹명]
사용자 그룹 추가:
sudo usermod -aG [그룹명] [사용자명]
🔷 일반적으로 파일 시스템은 파일/디렉토리에 대해 접근을 허용하거나 거부하는 권한 설정 존재
권한 설정은 주로 읽기, 변경, 탐색, 실행
등 기능별로 접근 제어
사용자별 또는 사용자 그룹별로 허용 여부 지정 가능
🔷 리눅스의 권한 설정은 누가 무엇을 할 수 있는지 제한하는 시스템
권한 설정을 제대로 이해하면, 시스템 보안과 효율적인 운영에 큰 도움이 됨
널리 쓰이는 관련 기술:
SetUID
, SetGID
, Sticky Bit
, 접근 제어 목록(ACL)
등
🔷 리눅스 권한 설정 기준
전통적으로 유닉스 기반 파일 시스템의 권한 설정은 POSIX.1-2017
에서 정의되어 있음
이 표준은 사용자(user), 그룹(group), 기타(others) 세 가지 범주를 지정하고 각 범주에 대해 읽기(read), 쓰기(write), 실행(execute) 권한을 부여하거나 거부할 수 있도록 설정
🔷 권한 대상 분류
owner(user)
: 해당 파일/디렉토리의 소유자
group
: 해당 파일이 속한 그룹의 사용자
others
: 그 외 모든 사용자 (소유자와 그룹에 속하지 않은 모든 사용자)
🔷 각 집단에 대해 부여할 수 있는 권한
기호 | 의미 | 설명 |
---|---|---|
r | read | 읽기 (파일 내용, 디렉토리 목록 보기) |
w | write | 쓰기 (수정, 생성, 삭제) |
x | execute | 실행 (파일 실행 또는 디렉토리 진입) |
🔷 기호(symbolic) 방식
예: -rwxr-xr--
2~4번째 문자: 소유자 권한 → rwx
5~7번째 문자: 그룹 권한 → r-x
8~10번째 문자: 기타 사용자 권한 → r--
기호 모드(chmod) 구성 요소:
chmod [사용자 카테고리 문자][연산자 기호][접근 권한 문자] 파일명
구성 요소별 설명
사용자 카테고리 문자
문자 | 의미 |
---|---|
u | 파일 소유자 |
g | 파일 소유 그룹 |
o | 소유자와 그룹 외 사용자 |
a | 전체 사용자 (all) |
연산자 기호
기호 | 의미 |
---|---|
+ | 권한 부여 |
- | 권한 제거 |
= | 권한 설정 |
접근 권한 문자
문자 | 의미 |
---|---|
r | 읽기 권한 |
w | 쓰기 권한 |
x | 실행 권한 |
#예시
chmod u+x script.sh # 소유자에게 실행 권한 추가
chmod go-r file.txt # 그룹과 기타 사용자에게 읽기 권한 제거
chmod a=rw file.txt # 모든 사용자에게 읽기/쓰기 권한만 부여
🔷 숫자(octal) 방식
각 권한에 숫자를 할당해서 세 자리 숫자로 표시:
읽기(read) = 4
쓰기(write) = 2
실행(execute) = 1
조합 예시
기호 권한 | 숫자 계산식 | 결과 |
---|---|---|
rwx | 4 + 2 + 1 | 7 |
r-x | 4 + 0 + 1 | 5 |
r-- | 4 + 0 + 0 | 4 |
→ -rwxr-xr--
권한은 754로 표현됨
🔷 자주 사용하는 권한 설정
퍼미션 | 의미 | 설명 |
---|---|---|
600 | 소유자만 읽기/쓰기 | 개인 설정파일 (.ssh/id_rsa 등) |
644 | 소유자: rw , 그룹/기타: r | 텍스트파일, HTML, 로그 등 |
700 | 소유자만 모두 가능 (rwx ) | 개인 스크립트, 실행파일 |
755 | 소유자: rwx , 그룹/기타: r-x | 공개 실행파일, 스크립트 |
777 | 모두에게 모든 권한 (보안상 거의 비추) | 테스트/임시폴더 (주의!), 공개용 임시폴더 (/tmp 등) |
🔷 chown
파일/폴더의 소유자(및 그룹)를 변경한다.
sudo chown [소유자][:그룹] 파일명
예시
소유자만 변경
sudo chown john test.txt
소유자와 그룹 변경
sudo chown john:staff test.txt
폴더와 그 하위 전체 소유자 변경
sudo chown -R john:john mydir/
🔷 개요
서비스(디몬, Daemon)
: 시스템 자동화, 보안, 안정성 유지에 중요한 역할
시스템 부팅 시 자동 실행되거나 수동으로 시작·중지되는 백그라운드 프로그램
대표적인 서비스
🔷 서비스 관리 도구
systemd (최신, 대부분의 배포판)
시스템의 부팅 과정, 백그라운드 서비스(데몬), 프로세스, 타이머, 소켓, 로그, 사용자 세션 등을 통합적으로 관리하는 핵심 소프트웨어
서비스, 타이머, 소켓, 타겟 등 다양한 단위 관리
명령어 | 설명 |
---|---|
systemctl | 서비스 및 유닛(단위) 관리 |
journalctl | 로그 확인 |
loginctl | 사용자 세션 및 로그인 관리 |
hostnamectl | 호스트네임(컴퓨터 이름) 관리 |
timedatectl | 시간/날짜 설정 관리 |
# 예시
systemctl status sshd # SSH 서비스 상태 조회
systemctl restart nginx # nginx 재시작
journalctl -u httpd # apache 서비스 로그 확인
systemctl enable docker # 부팅 시 docker 자동시작 등록
ps aux | grep -E 'd$' # 백그라운드 데몬 확인
# 시스템에서 실행중인 서비스 확인
systemctl list-units --type=service --state=running
SysVinit (구버전)
위치: /etc/init.d/
스크립트 기반 관리
service 명령어 지원
🔷 firewalld (CentOS, RHEL, Fedora 기본)
sudo systemctl status firewalld
sudo firewall-cmd --list-all
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload
🔷 ufw (우분투 등에서 간편)
sudo ufw enable # 방화벽 활성화
sudo ufw allow 22/tcp # 22번(tcp) 포트 허용하기
sudo ufw status # 상태보기
🔷 데이터 백업, 전송, 저장 공간 최적화 등에 꼭 필요한 필수 기술
🔷 아카이브 (archive)
파일과 디렉터리를 하나의 파일로 묶는 작업
대표 도구: tar
, cpio
🔷 압축 (compression)
파일 내용을 알고리즘으로 줄여 저장 공간을 절약
대표 도구: gzip
, bzip2
, xz
, zip
🔷 아카이브 + 압축
여러 파일을 묶고, 동시에 공간도 절약
예시: tar.gz
, tar.bz2
, tar.xz
형식 | 설명 | 주요 명령어 | 확장자 |
---|---|---|---|
tar | 아카이브 (압축 X) | tar | .tar |
tar+gzip | 아카이브 + 압축 | tar + gzip | .tar.gz , .tgz |
tar+bzip2 | 아카이브 + 압축 | tar + bzip2 | .tar.bz2 |
tar+xz | 아카이브 + 압축 | tar + xz | .tar.xz |
zip | 아카이브 + 압축 | zip , unzip | .zip |
gzip | 단일 파일 압축 | gzip , gunzip | .gz |
bzip2 | 단일 파일 압축 | bzip2 , bunzip2 | .bz2 |
xz | 단일 파일 압축 | xz , unxz | .xz |
📊 압축 방식 비교표
방식 | 압축 속도 | 압축률 (높을수록 좋음) | 사용 용도 |
---|---|---|---|
gzip | 빠름 | 보통 | 일반적인 백업, 전송 |
bzip2 | 느림 | 높음 | 고압축이 필요할 때 |
xz | 매우 느림 | 가장 높음 | 저장 공간이 매우 중요할 때 |
1) tar: 파일/디렉터리 묶기 및 압축
tar cvf archive.tar 파일1 디렉터리1
# c: 생성(create) v: 진행상황 표시(verbose) f: 파일명 지정
tar czvf archive.tar.gz 파일1 디렉터리1 # z: gzip 압축
tar cjvf archive.tar.bz2 파일1 디렉터리1 # j: bzip2 압축
tar cJvf archive.tar.xz 파일1 디렉터리1 # J: xz 압축
tar xvf archive.tar # 압축X
tar xzvf archive.tar.gz # gzip 압축 해제
tar xjvf archive.tar.bz2 # bzip2 압축 해제
tar xJvf archive.tar.xz # xz 압축 해제 # x: 해제(extract)
tar xvf archive.tar somefile.txt somefolder/
2) zip/unzip : 아카이브+압축
zip archive.zip 파일1 디렉터리1
unzip archive.zip
3) gzip, bzip2, xz (단일 파일 압축)
gzip filename # filename.gz 생성, 원본 자동 삭제
bzip2 filename # filename.bz2 생성, 원본 자동 삭제
xz filename # filename.xz 생성, 원본 자동 삭제
gunzip filename.gz bunzip2 filename.bz2 unxz filename.xz
tar tvf archive.tar.gz # 압축 파일 내부의 리스트 확인
tar cvf files.tar 파일1 파일2 디렉터리1
tar xvf files.tar
tar czvf - largefolder/ | split -b 700M - archive.tar.gz.part
# 700MB씩 분할
🔷 패키지란?
.deb
, .rpm
등의 형식으로 존재🔷 Ubuntu 계열 (Debian 계열)은 주로 APT (Advanced Package Tool) 이용
apt
apt-get
apt-cache
dpkg
🔷 RHEL 계열 (Red Hat 계열, CentOS 포함)
yum
: RHEL/CentOS 7 이하
dnf
: RHEL/CentOS 8 이상
rpm
: 패키지 파일 직접 설치/삭제 등에 사용
🔷 apt
sudo apt update # 패키지 목록(인덱스) 최신화
sudo apt upgrade # 설치된 모든 패키지 업그레이드
sudo apt install 패키지명 # 패키지 설치
sudo apt remove 패키지명 # 패키지 삭제(설정 파일은 남김)
sudo apt purge 패키지명 # 패키지와 설정 파일까지 삭제
sudo apt search 검색어 # 패키지 검색
sudo apt show 패키지명 # 패키지 상세 정보
sudo dpkg -i 패키지파일.deb # .deb 직접 설치
sudo dpkg -r 패키지명 # 패키지 제거
sudo dpkg -l # 설치된 패키지 목록 표시
sudo dpkg -L 패키지명 # 패키지의 파일 목록 확인
wget https://corretto.aws/downloads/latest/amazon-corretto-21-x64-linux-jdk.deb
sudo apt update && sudo apt install -y java-common
sudo dpkg -i amazon-corretto-21-x64-linux-jdk.deb
java --version
sudo apt install curl gnupg2 \
ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update && sudo apt install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
systemctl status nginx
sudo vi /usr/share/nginx/html/index.html
curl localhost
sudo apt-get install -y apt-transport-https curl
sudo mkdir -p /etc/apt/keyrings
sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
sudo vi /etc/apt/sources.list.d/mariadb.sources
# repository 관련 텍스트 붙여넣기
sudo apt update && sudo apt install -y mariadb-server
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo mariadb-secure-installation
# mariadb 각종 설정 진행
mariadb -u root -h localhost -p mysql
create database cloud2025;
create user cloud2025 identified by 'cloud2025';
grant all privileges on cloud2025.* to cloud2025@'%';
flush privileges;
exit
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.24/bin/apache-tomcat-10.1.24.tar.gz
sudo useradd -m -d /opt/tomcat \
-U -s /bin/false tomcat
sudo tar zxf apache-tomcat-10.1.24.tar.gz \
-C /opt/tomcat --strip-component=1
sudo chown -R tomcat:tomcat /opt/tomcat
sudo chmod -R u+x /opt/tomcat/bin
# 테스트용 코드 - 실무에서는 제외!
sudo chmod -R o+rx /opt/tomcat/bin
cd /opt/tomcat/bin
sudo ./startup.sh
sudo ./shutdown.sh