Developer's Development

3.4.2 [Linux] A to Z (includes VirtualBox & Ubuntu) 본문

AI 활용 애플리케이션 개발/Linux

3.4.2 [Linux] A to Z (includes VirtualBox & Ubuntu)

mylee 2025. 10. 3. 21:47
운영체제란

 

컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램들의 모임이다. 운영체제는 컴퓨터 하드웨어와 사용자 간의 인터페이스로서 동작하는 시스템 소프트웨어의 일종으로, 다른 응용프로그램이 유용한 작업할 수 있도록 환경을 제공해 준다.

 

리눅스란

1991년 8월 리눅스 토발스가 어셈블리어를 이용하여 Kernel 버전 0.0.1을 제작한 것이 시초다. 유닉스를 기반으로 한 Minix 보다 좋은 운영체제를 제작하는 것이 목적이었다. 1992년 Kernel 버전 0.0.2가 제작되었고 이를 인터넷에 오픈소스로 코드를 공개하면서 리눅스가 탄생하게 되었다. 그로부터 지금까지 다양한 기업들이 Kernel을 기반으로 컴파일러, 쉘, 기타 응용 프로그램을 포함시켜 배포판에 자신들의 이름을 붙여 배포하고 있다.

 

  • 리눅스의 특징

1. 오픈소스 운영체제이다.

2. 멀티 유저(다중 사용자), 멀티 태스킹(다중 작업) 운영체제이다.

3. 다중 스레드를 지원하는 네트워크 운영체제이다.

4. 여러 종류의 파일 시스템을 지원하는 운영체제이다.

 

  • 리눅스의 종류

1. Debian 계열: Debian, Ubuntu, Linux Mint

2. RedHat 계열: Fedora, CentOS

3. Slackware 계열: openSUSE

 

 

VirtualBox, Ubuntu Install & Setting

 

  • Windows에 VirtualBox 설치

버전: 7.2.2

https://www.virtualbox.org/

 

Oracle VirtualBox

Powerful open source virtualization For personal and enterprise use VirtualBox is a general-purpose full virtualization software for x86_64 hardware (with version 7.1 additionally for macOS/Arm and with version 7.2 also for Windows/Arm), targeted at laptop

www.virtualbox.org

 

  • VirtualBox에 Ubuntu 설정

버전: Ubuntu 22.04.5 LTS (Jammy Jellyfish) → Desktop image로 다운

https://releases.ubuntu.com/

 

Ubuntu Releases

There are 2 types of Ubuntu releases: Interim and LTS. Each Ubuntu LTS is maintained for 10 years total: 5 years of standard support + 5 years of ESM. Interim releases are maintained for 9 months. For the Ubuntu release cycle please see: The Ubuntu lifecyc

releases.ubuntu.com

 

👉🏻 가상머신 생성

[ VM VirtualBox ]

새로 만들기 → 이름 설정 → 기본값으로 세팅

설정 → 저장소 > 컨트롤러:IDE > 비어있음 > 디스크 모양 클릭 > 가상 광학 디스크 → 추가(다운로드한 Ubuntu ISO 파일) 및 선택

시작 (Ubuntu ISO 파일을 이용하여 Ubuntu로 부팅이 진행됨)

 

 

Linux 파일 시스템

 

리눅스는 윈도우와 달리 EXT(Extended File System)을 사용한다. EXT부터 발전되어 현재는 EXT4를 주로 사용한다.

 

  • 리눅스 파일 구조

 

/

: 리눅스 파일 체제의 최상의 디렉토리

dev

: 시스템 디바이스 파일을 저장하고 있는 디렉토리

sbin

: bin 디렉토리와 유사하지만 오직 root user만 실행할 수 있는 프로그램들이 있는 디렉토리

boot

: 부팅에 핵심적인 커널 이미지와 부팅 정보 파일을 담고 있는 디렉토리

bin

: 리눅스의 기본 명령어(binary)들이 들어있는 디렉토리

etc

: 시스템 환경 설정 파일이 있는 디렉토리

home

: 리눅스 사용자의 홈 디렉토리(사용자 계정명과 동일)가 만들어지는 디렉토리

media

: CD-ROM이나 USB 같은 탈부착이 가능한 장치들의 마운트포인트로 사용되는 디렉토리

mnt

: media 디렉토리와 비슷한 용도로 탈부착이 가능한 장치들에 대하여 일시적인 마운트 포인트로 사용되는 디렉토리

root

: 시스템 관리자의 홈 디렉토리

sys

: 리눅스 커널 관련 정보가 있는 디렉토리

tmp

: 일명 "공동 디렉토리"이며 시스템을 사용하는 모든 사용자들이 공동으로 사용하는 디렉토리

usr

: 기본 실행 파일과 라이브러리 파일, 헤더 파일 등의 파일이 저장되어 있는 디렉토리

var

: 시스템 운용 중에 생성되었다가 삭제되는 데이터를 일시적으로 저장하기 위한 디렉토리

기능 Windows Linux
root C:\ /
사용자 폴더 C:\Users\{username} /home/{username}
설정 폴더는 숨겨져 있지만 제어판으로 접근 /etc
시스템 파일 C:\Windows\ /bin, /sbin, /lib
설치 프로그램 C:\Program Files /usr
CD-ROM D:\ (또는 E, F, 등) /media/cdrom (또는 mnt/cdrom, /cdrom)
# 현재 위치(현재 경로) 확인 → Linux에서 자주 활용
pwd

# 홈 디렉토리로 이동
cd ~

# 디렉토리 하나 밖으로
cd ..

# 현재 내가 있는 위치에서의 디렉토리와 파일 목록 조회 → Linux에서 자주 활용
ls

# ls에 관한 도움말
ls --help

# ls -long: 뭔가 만들고 생성하고 처리한 user, 일자, directory 정보 등을 상세 제공
ls -l

# ls -all: 실행 결과로 나온 파일들(숨김파일까지) 등 현재 위치에 있는 모든 것을 확인 가능
ls -a

# 통합: 숨겨진 파일까지 전부, 상세 정보를 가져오기
ls -a -l 또는 ls -al

# ls -F: 이름에 해당하는 것이 무엇에 해당하는지 종류도 같이 보여줌
ls -F

# ls /etc: 절대경로로 접근 → 해당 경로에 뭐가 있는지를 볼 수 있게 해줌
ls /etc

# 파일에 관한 상세 정보 확인
ll

 

Ubuntu 개발 환경 설정

 

  • apt 명령어

apt install

: 패키지 설치 명령어이다. 패키지명을 공백으로 여러 개 지정해서 한 번에 설치하는 것도 가능하다.

apt remove

: 패키지 제거 명령어이다. remove 명령은 저장한 패키지만을 제거한다. 설정 파일은 자동으로 삭제되지 않는다.

apt purge

: remove와 달리 패키지와 설정 파일 모두 제거하는 명령어다.

apt autoremove

: 현재 사용하지 않는 패키지를 제거한다.

apt search

: apt 툴을 이용하여 설치할 수 있는 패키지 검색 명령이다.

apt list

: 레퍼지토리에 등록된 패키지 목록을 조회하는 명령어다.

apt update

: 현재 사용 가능한 패키지 리스트를 업데이트해주는 명령어다.

# 일단 홈 디렉토리로 이동
cd ~

# cat을 통해서 cat 뒤의 디렉토리에 있는 파일 설치
cat /etc/apt/sources.list

# sudo update
sudo apt update

# 이후에 내 계정 비밀번호 입력 창 뜸 -> 보이진 않으나 입력되고 있으니 틀리지 않도록!
# update 확인 코드: apt list --upgradable

# ubuntu에서 curl 패키지 검색(apt search)
apt search curl

# install curl
apt install curl  # 이걸 할 경우, permission error가 발생할 확률 높음. 발생한다면
sudo apt install curl  # sudo를 통해 관리자 권한으로 실행(패키지 전체 영역에 설치해서)

# 도움말을 확인해보자
curl --help

 

 

Ubuntu 기본 명령어

 

  • Directory 관련 명령어

pwd (print woring directory)

: 현재 디렉토리 경로를 확인하는 명령어 (절대경로 출력)

ls (List Segments)

: 현재 위치의 파일 목록을 조회하는 명령어

cd (Change Directory)

: 경로 이동 시 사용하는 명령어 (~:홈 디렉토리로 이동, /:절대경로로 이동)

mkdir (Make Directory)

: 새로운 디렉터리를 생성하는 명령어

rm (Remove)

: 파일이나 디렉터리를 삭제하는 명령어

~$ mkdir test 
# test라는 디렉토리 만들기

~$ ls 
# 해서 만들어졌는지 확인. 현재경로의 파일 확인하는거니까.

~$ rm test
# rm이 remove 제거. 근데 test가 디렉토리라서 지울 수 없다고 로그가 뜸. 
# 디렉토리 지울때는 옵션을 붙여줘야 함.

~$ rm -r test
# ls 해보면 test가 지워진 걸 확인할 수 있음.

 

[실습]
~$ ~/test1/test2/test3 생성
~$ 파일 목록 찍어보기
test1 > test2 보기
test2 > test3 보기 (pwd)
/test1/test2/test3 삭제 

~$ mkdir -p test1/test2/test3
# -p가 상위부터 차례대로 만들어 주는 역할

~$ rm -r test1
# 이거만 해주면 recursive한 삭제니까 하위도 다 삭제됨

 

  • 파일 관련 명령어

touch

: 파일을 생성할 때 사용하는 명령어

mv (move)

: 파일이나 디렉터리를 이동시킬 때 사용하는 명령어

cp (copy)

: 파일이나 디렉터리를 복사할 때 사용하는 명령어 (복사할 때 새로운 이름을 지정해 복사 가능)

cat, more

: 파일 내용을 출력하는 명령어

tail

: 파일의 뒷부분 내용을 출력하는 명령어 (기본적으로 뒷부분 10행을 출력)

~$ mkdir test

~$ cd test

~/test$ touch hello.txt
# touch는 존재하지 않으면 생성하고 존재하면 변경은 안하는데 최종 수정시간만 바꿔줌.

~/test$ ls

~/test$ cd ..
# 상위로 빠져나옴

~$ rm -d test 
# -d는 빈 디렉토리만 삭제하게 해주는 것.
# -r은 빈거 아닌거 다 지워주니까 위험함. 그래서 -d를 사용.

 

  • 그 외 매우 유용한 명령어

grep

: 입력으로 전달된 파일의 내용에서 특정 문자열을 찾을 때 사용하는 명령어

| (파이프 라인)

: 파이프 라인 자체는 어떤 동작을 할 명령을 실행시키지 못하지만, 여러 명령어를 한 번에 실행할 수 있도록 돕는 역할을 한다. 이전 명령어의 결과를 다음 명령어의 입력 값으로 사용하고 싶을 때 사용한다.

 

  • vim 편집기 setting

sudo apt install vim

: vim 편집기를 설치하는 명령어다. (중간에 설치 여부 y 입력)

~$ ls
~$ ls test
~$ cd test

~/test$ ls
~/test$ cat hello.txt
~/test$ vim hello.txt
~/test$ sudo apt install vim
~/test$ vim hello.txt
# vim은 파일을 편집할 수 있도록 편집모드. I누르면 Insert로 파일 내부 내용 수정할 수 있음
i 눌러서
hello world
i am maeenggu
nice to meet you
thank you! 
(열줄정도띄우고)
from your best friend maeenggu
# 내용수정해보기
esc 누르면 insert 모드에서 나옴.
:wq  
# insert 해 준 내용을 저장하면서 빠져나오는 방법
~/test$ cat hello.txt  
# cat 명령어 쓰면 아까 쓴 내용 출력해서 볼 수 있음
~/test$ more hello.txt  
# more은 전체 출력이 아니라 한 페이지를 보여줌. 엔터나 space 눌러서 다음페이지 보고 빠져나올 수 있음
~/test$ cat -b hello.txt 
~/test$ cat -n hello.txt  
# cat으로 파일 전체 출력하는데 옵션을 뭐로 주느냐의 차이.

~/test$ ls
~/test$ cp hello.txt copyhello.txt  
# cp는 copy하는 명령어. hello.txt는 복사할 대상 파일. copyhello.txt는 복사해서 넣어줄 파일 이름
~/test$ ls
~/test$ cat copyhello.txt
~/test$ cd ..
~$ cp test test2  # 디렉토리 복사하려고 하니까 -r 옵션 필요하다는 안내 나옴.
~$ cp -r test test2  # -r 붙여서 재귀에 대한 옵션 세팅. 지울 때와 마찬가지
~$ ls
~$ ls test2  
# 디렉토리 자체를 복사해 준 것이기 때문에 copyhello.txt, hello.txt를 그대로 갖고 있음
# 옆에 파일 아이콘 눌러서 볼 수도 있음
~$ rm -r test2
~$ cd test

~/test$ mkdir test2
~/test$ ls
~/test$ mv copyhello.txt test2  # mv는 move. copyhello.txt를 test2로 옮긴다는 의미
~/test$ ls
~/test$ cd test2
~/test/test2$ ls
~/test/test2$ mv copyhello.txt helloworld.txt  # mv를 파일에서 파일로 씀. 
~/test/test2$ ls
~/test/test2$ mv helloworld.txt hello.txt
~/test/test2$ ls
~/test/test2$ mv hello.txt ../  # hello.txt를 상위 디렉토리로 이동시키라는 것.
~/test/test2$ ls
~/test/test2$ cd ..
~/test$ ls
~/test$ cd test2
~/test/test2$ touch hello.txt
~/test/test2$ ls
~/test/test2$ vim hello.txt
i눌러서 인서트 모드
An nyeong ha se yo

I am harry e-yo
(열 줄 정도 띄워서)
esc해서 모드 해제 후 :wq
~/test/test2$ cat hello.txt  # 해서 내용 확인
~/test/test2$ mv hello.txt ../  # 상위 경로로 이동시킴
~/test/test2$ ls
~/test/test2$ cd ..
~/test$ ls
~/test$ cat hello.txt  # 하면 원래 있던 내용아니고 새로만든 내용이 보여짐.
# mv로 파일이 옮겨지는 과정에서 동일한 이름의 파일이 존재하면 덮어쓴다는 것을 알 수 있음.
~/test$ cd test2
~/test/test2$ touch hello.txt
~/test/test2$ ls
~/test/test2$ cat hello.txt  # 빈 파일이라 아무것도 없음
~/test/test2$ mv -i hello.txt ../  # -i 옵션을 붙여주면 overwrite할거냐고 물어봄
# n을 선택하면 
~/test/test2$ cat ../hello.txt  # 상위 경로에 있는거 읽어보면 덮어쓰지 않고 그대로 있음
~/test/test2$ ls  # 빈 파일도 안 옮겨지고 그대로 있음
~/test/test2$ cat hello.txt
~/test/test2$ vim hello.txt
# i로 인서트 모드
아무거나 쓰기.....
fjskdjfajgbjkfvnfkhgruifd이런거 20줄정도 근데 중간중간 멀쩡한 문자열
hello everyone
maenggu
esc :wq
~/test/test2$ cat hello.txt
~/test/test2$ more hello.txt
~/test/test2$ tail hello.txt  # 아래에서부터 10줄만 끊어옴
~/test/test2$ tail -3 hello.txt  # 마지막 세 줄만 끊어서 봄
~/test/test2$ grep "hello" hello.txt  # grep 하고 ""로 찾고 싶은 문자열 넣고 탐색대상 파일명 넣어주기
~/test/test2$ grep "hi" hello.txt  # 아무것도 안나옴. hi가 없으니까... 
~/test/test2$ grep "hello" *  # *를 붙이면 전체 파일 대상으로 검색.
~/test/test2$ grep "HELLO" hello.txt  # 아무것도 안나옴
~/test/test2$ grep -i "HELLO" hello.txt # hello everyone 찾아옴
~/test/test2$ grep -A 5 "hello" hello.txt  # -A 5 하면 해당 열 뒤로 5줄이 더 나옴
~/test/test2$ grep -B 5 "hello" hello.txt  # -B 5 하면 해당 열 앞으로 5줄이 더 나옴
~/test/test2$ grep [0-3] hello.txt  # [0-3] 0부터 3까지의 숫자들 빨간글자로 해서 포함하고 있는 열 다 가져옴
~/test/test2$ ls -al  # 전체에 대한 상세정보 가져옴. a는 전체, l은 long
~/test/test2$ ls -al | grep hello  # list를 전체 다 길게 갖고 오는데 hello라는 이름이 있는걸 찾으라는 의미.

 

 

Ubuntu 계정 및 권한 명령

 

  • 개요

1. Speruser

- 시스템 운영 관리자 계정이며, 일반적으로 리눅스에선 root 사용자를 의미한다.

- 일반 사용자 계정의 권한과 Superuser의 권한을 구분하여 사용해야 하며, 우분투의 경우 기본적으로 root 사용자를 비활성화한다.

 

2. whoami

- 현재 로그인되어 있는 사용자 계정을 확인하는 명령어이다.

 

3. id

- 현재 사용자가 가지고 있는 권한(그룹 포함)을 확인하는 명령어이다.

- UID는 사용자의 아이디로 0~32767 사이의 숫자로 나타내며, 0은 슈퍼(root) 유저를 의미한다.

- GID는 사용자가 속한 그룹의 ID를 나타낸다.

 

4. cat /etc/passwd

- 현재 리눅스에 등록되어 있는 모든 계정을 확인하는 명령어이다.

- passwd 파일은 ":" 을 기준으로 데이터들을 구분한다.

ex) root:x:0:0:root:/root:/bin/bash

- 각각의 필드를 왼쪽부터 설명하면 아래와 같다.

계정 ID

패스워드

사용자 UID

그룹 GID

계정 정보(보통은 사용자 이름)

홈 디렉터리

셀 환경

 

5. cat /etc/shadow

- 사용자 암호 정보를 확인하는 명령어이다.

 

6. 접근 권한 정리

- 접근 권한은 크게 사용자 본인, GROUP, OTHER에 대해 설정할 수 있다.

- 맨 앞 d를 제외하고 차례대로 세 단어씩 소유자의 권한, 소유주가 속한 그룹의 권한, 그 외 모든 이들의 권한이다.

ex)

maeenggu의 디렉터리 접근 권한은 755이다.

소유자(4+2+1), 그룹(4+1). 그 외(4+1)와 같이 계산한다.

r: read 권한. w: write 권한, x: execute 권한

 

7. 권한 대여 명령어

- 사용자의 권한을 대여 즉, 해당 사용자로 로그인 한 효과를 내는 명령어이다.

~$ whoami
~$ id # 접속 해 있는 유저에 대한 권한 정보
~$ cd /etc
~/etc$ cat passwd
~/etc$ sudo cat shadow
~/etc$ cd ~ # 홈 디렉토리로 이동
~$ pwd
~$ ls -l

 

  • 계정 관련 명령어

adduser

: 사용자 계정을 추가하는 명령어

useradd

: 사용자 계정을 추가하는 명령어 (계정만 생성하며, 암호와 유저 디렉터리 설정은 자동으로 해주지 않음)

usermod

: 사용자 계정 정보를 변경할 수 있는 명령어

userdel

: 사용자 계정을 삭제하는 명령어

~$ sudo su- # switch user
# root 계정으로 전환됨. exit하면 원래대로.

~$ sudo adduser dotori 
# dotori라는 유저를 추가.

~$ cat /etc/passwd  # 열어서 유저 추가 잘 됐는지 확인.
~$ sudo su dotori  # switch user 해보기
exit로 돌아온 후
~$ sudo userdel -r dotori  # dotori 지우기
~$ cat /etc/passwd  # 해보면 dotori 지워진거 확인 가능

 

  • 그룹 관련 명령어

groupadd

: 그룹을 추가하는 명령어

groupdel

: 그룹을 삭제하는 명령어

 

  • 파일 권한 관련 명령어

umask

: 파일/디렉터리 생성 권한을 확인하는 명령어

chmod

: 파일 또는 디렉터리의 권한을 변경하는 명령어

chown

: 파일 또는 디렉터리의 소유권을 변경하는 명령어

 

 

Ubuntu 프로세스 명령

 

  • 프로세스 상태 관련 명령어

ps

: 프로세스의 현재 상태를 출력하는 명령어

pstree

: 실행 중인 프로세스들을 트리 구조로 보여주는 명령어

kill

: 프로세스 종료 시 시그널을 커널에 보내는 명령어 (시스템에 이상이 생겨 종료시켜야 할 때 사용)

top

: 현재 실행되고 있는 Task 들을 유동적으로 관찰 가능한 명령어 (윈도우의 작업 관리자와 비슷함)

~$ ps  # 각 프로세스의 현재 상태 출력
~$ ps -e  # 연결되어 있는 것들 다 나옴 
~$ ps -ef  # 추가로 더 나옴
~$ ps -ef | grep bash  # 전체 프로세스 중에 bash 포함된 것만 나옴.
~$ pstree  # 프로세스를 트리구조로 출력 해 줌
~$ sudo apt install apache2 -y  # -y는 설치 여부 응답까지 미리 넣는 것
~$ ps -ef | grep apache2
~$ ps | grep apache2
~$ ps sudo service apache2 status
~$ ps -e | grep apache2
~$ kill -9 2968 -n  # -9는 강제종료에 해당하는 옵션

 

 

Vim 편집기

 

  • vim 개요

1. vi

: 유닉스 환경에서 사용되는 텍스트 편집기

 

2. vim

"Vi IMproved"의 약어로 Bram Moolenaar가 만든 vi 호환 텍스트 편집기

vi, vim에는 크게 명령 모드, 입력 모드의 두 가지 모드가 있다.

 

 

SSH(Secure Shell Protocol)

 

네트워크 프로토콜의 하나로, 컴퓨터와 컴퓨터가 인터넷과 같은 Public Network를 통해 서로 통신을 할 때 사용하는 프로토콜

원격에 있는 컴퓨터를 제어하기 위해서 직접 가지 않고, 해당 프로토콜을 통해 간편하게 원격 제어를 할 수 있다. 또한 데이터 전송도 가능하다.

 

  • SSH 세팅

1. apt를 이용한 SSH 설치

2. SSH 포트 관련 설정

3..SSH 서비스 실행

4. SSH 상태 확인

5. IP 확인

~$ sudo apt install openssh-server  # 설치
~$ sudo vim /etc/ssh/sshd_config  # ssh 서버로 쓰이는 것에 대한 설정
:q 하면 닫고 나와짐.
~$ sudo service ssh start
~$ sudo service ssh status
ctrl+C 하면 빠져나와짐.
~$ ps -ef | grep ssh  # ssh가 프로세스 올라와있는지 확인
~$ sudo ufw enable  # ufw가 우분투 firewall 방화벽 켜준 것
~$ sudo ufw allow 22  
# 우분투 방화벽 22번 포트 접속 가능하게 승인
# 이 세팅 안 해주면 내부 방화벽 때문에 접근이 안 됨.
~$ hostname
~$ hostname -I  # 10.0.2.15 나옴. 이게 host의 IP

 

6. 포트 포워딩

VirtualBox 설정에서 진행

설정 > 네트워크 > 고급 > 포트포워딩: 포트포워딩 규칙 추가

- 이름: 자유

- 프로토콜: TCP

- 호스트 IP: 윈도우 cmd > ipconfig > 이더넷 어댑터 이더넷 IPv4 주소

- 호스트 포트: 9999

- 게스트 IP: 10.0.2.15

- 게스트 포트: 22

 

7. PuTTY로 접속

PuTTY를 다운로드하여 ubuntu에 접속 테스트

https://putty.softonic.kr/

 

PuTTY - 다운로드

PuTTY - 개발자에게 꼭 필요한 도구 PuTTY은 개발자들에게 매우 유용한 기능을 포함한 무료 및 오픈 소스 Windows 프로그램입니다. 이 도구는 중요한 정보를 안전하게 전송하기 위해 여러 네트워크 프

putty.softonic.kr

 

putty.exe로 putty를 실행하여 PC와 설정에 맞게 입력 후 Open

- 호스트 이름: 포트포워딩에서 설정한 호스트 IP

- 포트: 포트포워딩에서 설정한 호스트 포트

- 연결 방식: SSH

 

Ubuntu 로그인 ID와 PW를 입력하면 접속 가능