initial commit

This commit is contained in:
Bitdori (Admin) 2026-08-29 22:09:51 +09:00
commit 9ca2767d48
259 changed files with 21528 additions and 0 deletions

View file

@ -0,0 +1,532 @@
---
title: '리눅스 입문 - Cygwin'
description: 'Cygwin으로 리눅스/유닉스의 기능을 사용한다.'
image: '/assets/blog/01-cygwin/00-xfce.png'
authors: [bitdori]
---
[우분투][우분투] [그누/리눅스][그누/리눅스] 및 [유닉스][유닉스] 처럼 말로만 들어보고
사용해 본 적이 없는 타 운영체제 또는
[Bash][Bash] 나 [노드][노드] 등 소프트웨어 개발을 하면서 잠깐씩만 접해 본
비(非) MS Windows 환경을 [시그윈][시그윈] 을 통해
구동시킬 수 있다.
[가상머신][가상머신]이나 네이티브 환경에서 [X][X] 를 구동하면 리눅스도 MS Windows처럼 마우스를
이용한 그래픽 환경을 띄울 수 있다.
### [git-bash][git-bash], [msys2][msys2], [WSL][WSL] 대신 Cygwin을 사용하는 이유
TL;DR Cygwin은 검증된 마이너이기 때문이다.
[git for windows][git for windows], msys2, WSL 모두 각각 유명하다보니
이미 설치해서 해 놓은 작업이 매달려 있는 경우가 보통인데 입문자가 이런 환경에다가
연습 삼다가 기존 환경이 꼬여버리면 아주 번거로워질 수 있다.
반면에 처음부터 Cygwin내에서 실습을 하면 잘못 건드려서 꼬여버려도
[실패 격리][실패 격리]를 할 수 있다.
2020년대가 지나면서 입문자가 Cygwin을 소개 받는 경우는 거의 없기 때문에 Cygwin 내에서만
이것저것 건드린다면 최악의 경우에도 그저 Cygwin을 삭제하고 다시 설치하는 것으로 원래상태를
복구할 수 있다.
_사양, 호환성_
WSL은 가상화 기능 위에서 돌아가는데, Cygwin은 [가상머신][가상머신]에 비해서
시스템 요구 사항이 낮아 32비트 등 더욱 다양한 환경에서 사용할 수 있다.
입문하는 입장에서 실습 환경 깔아두기가 용이하다는 것이다.
비교적 최근부터 사용률이 올라가고 있는 [docker][docker] 는 시스템 요구 사항이 가상머신보다 낮기는
하지만 Cygwin보다 배우기 어렵고 Windows 버전 도커는 완성도가 타 플랫폼 버전에 비해서
떨어진다.
{/*
```markdown
또한, Cygwin은 처음 설치할 때에만 인터넷에 연결하면 되는데 도커는 docker hub
및 해당 이미지의 패키지 매니저에서 필요할 때 마다 지속적으로 인터넷 연결을
해야 구동되는 행위가 있기 때문에 사용자의 인터넷 연결성 요구사항이 Cygwin보다 높다.
2020년대 이후에 인터넷에 연결하는 것이 힘든 일은 아니지만
https://ko.wikipedia.org/wiki/KT_아현지사_통신구_화재,
https://ko.wikipedia.org/wiki/SK_C%26C_데이터_센터_화재
처럼 물리적인 이유로든
https://github.blog/2015-03-27-large-scale-ddos-attack-on-github-com/
같은 의도적 공격, 그 외 https://blog.cloudflare.com/tag/outage/ 같은
기타 이유로 서비스를 이용하지 못 하는 경우는 일어나기 마련이다.
이유가 어찌되었건 사용자에게 필요한 전제조건이 하나라도 줄어들면 그만큼 접근성은
좋아지는 것이다.
```
*/}
msys2가 Cygwin으로부터 시작한 프로젝트이기 때문에 이미 msys2 경험이 있어서 신뢰하고 있다면
Cygwin도 비슷한 수준으로 신뢰할 수 있을 것이다.
터미널 환경 자체가 익숙하지 않은 경우 https://www.busybox.net/live_bbox/live_bbox.html
에서 무설치로 체험해 볼 수 있다.
## 설치
https://cygwin.com/install.html - _Installing and Updating Cygwin Packages_
섹션에서 [setup-x86_64.exe][setup-x86_64.exe] 다운로드
![Cygwin installer download](/assets/blog/01-cygwin/01-cygwin-com.png)
Internet으로부터 다운로드 -> 설치 경로 확인 -> 연결 설정 확인
![Cygwin from internet](/assets/blog/01-cygwin/02-from-internet.png) 다음
![Cygwin install directory](/assets/blog/01-cygwin/03-inst-path.png) 다음
![Cygwin install connection](/assets/blog/01-cygwin/04-inst-next.png)
사이트는 .jp, .tw 중에서 선택하면 지리적으로 가깝기 때문에 비교적 속도가 빠르다.
그럼에도 다운로드 해야 할 개체가 워낙 많기 때문에 끝날 때 까지 잠시 기다려야 한다.
![Cygwin package site](/assets/blog/01-cygwin/05-pkg-server.png)
한국 https://ftp.kaist.ac.kr 에서도 서비스를 제공하지만 간혹 문제가 발생하는
경우가 있다.
![Cygwin download error](/assets/blog/01-cygwin/06-download-error.png)
▲ https:/ftp.kaist.ac.kr에서 패키지 정보를 불러오지 못 하고 있다.
![Cygwin downloading list](/assets/blog/01-cygwin/07-get-pkg-info.png)
Select Packages에서 설치할 패키지 목록을 볼 수 있는데 기본값으로 두고 다음으로 넘어간다.
![Cygwin packages](/assets/blog/01-cygwin/08-pkg-list.png) 다음
![Cygwin confirm changes](/assets/blog/01-cygwin/09-confirm-inst.png) 다음
![Cygwin package install](/assets/blog/01-cygwin/10-pkg-inst.png) 다음
![Cygwin installation complete](/assets/blog/01-cygwin/11-inst-complete.png)
## 첫 구동
_이미 msys2 등을 사용하면서 각종 시스템 설정을 해 봤다면 PATH에 연동하는 팁을 적용해보고 싶을 수도 있겠지만 DLL 충돌로 문제가 발생할 수 있으므로 여기에서는 해당 팁을 안내하지 않는다._
설치가 끝난 뒤 바탕 화면에 생성된 _Cygwin64 Terminal_ 을 실행
`exit`를 입력하고 엔터를 입력하면 터미널이 종료된다.
![Cygwin first launch](/assets/blog/01-cygwin/13-exit.png)
## [커맨드 (명령어)][커맨드 (명령어)]
다시 _Cygwin64 Terminal_ 을 실행
다음 각 명령어를 하나씩 입력하고 엔터를 쳐서 실행해 본다.
`cal`: 달력을 출력한다. (Calendar)
`pwd`: 현재 탐색 중인 위치를 출력한다. (Print Working Directory)
`ls`: 숨김 파일을 제외하고 현재 위치의 파일 목록을 출력한다. (List)
`ps`: 현재 실행 중인 프로세스 목록을 출력한다. (Process Status)
`uname`: 현재 시스템의 운영체제 정보를 출력한다 (unix name)
`man`: 설명서 (manual)
![Command set](/assets/blog/01-cygwin/14-16-command-set.png)
`man` 을 실행하면 어떤 실행 결과가 나오는 대신 도움 문구가 출력되는데 이번에는
`man man` 이라고 입력 해 본다.
![man man](/assets/blog/01-cygwin/17-man-man.png)
실행한 결과 나오는 본문이 `man` 커맨드에 대한 설명서이다. 즉, man을 어떻게 사용해야 하는지
man 커맨드로 보고 있는 것이다.
![man content](/assets/blog/01-cygwin/18-man-content.png)
실수로 man   man 사이에 공백이 여러 개 들어갔어도 똑같이 실행되기 때문에
공백을 다시 한 칸으로 줄이려고 굳이 삭제하지 않아도 된다.
`q` 를 누르면 man에서 나갈 수 있다.
다시 `man man` 을 실행 해 본다.
man에서 `f` 를 누르면 다음 페이지로, `b` 를 누르면 이전 페이지로 올라갈 수 있다.
사용 예시(EXAMPLES)란을 보면 `man ls` 항목이 있는데 man 커맨드로 ls에 대한 설명을 보는 방법을
안내하고 있는 부분이다.
![man man examples](/assets/blog/01-cygwin/20-man-man-examples.png)
q를 눌러서 종료하고 다시 `man ls` 를 띄워보면 **SYNOPSIS** 단락에
`ls [OPTION]... [FILE]...` 형식이 있는데 [OPTION] 자리에 `-` 로 시작하는 각종 flag를
대입할 수 있다.
바로 아래 **DESCRIPTION** 단락에서 `-a` 옵션 확인
![man synopsis](/assets/blog/01-cygwin/21-man-ls-synopsis.png)
![man description](/assets/blog/01-cygwin/22-man-ls-description-a.png)
`q` 를 입력해서 설명서를 빠져 나온 후 `ls` 를 한 번 입력해보고 `ls -a` 를 다시 입력해 본다.
![ls -a](/assets/blog/01-cygwin/23-option-ls-a.png)
ls만 입력 했을 땐 보이지 않았던 파일도 나오는데, 리눅스에서는 파일이름이 없이 `.` 으로
시작하는 파일은 숨김처리를 한다. ls의 `-a` 옵션은 이런 숨김파일도 함께 출력하도록 한다.
- 다시 `man ls` 실행
`f` 를 눌러 아랫쪽으로 더 내려가면 `-l` 옵션이 있다.
![man-ls-description](/assets/blog/01-cygwin/man-ls-description.png)
- `q` 를 입력해서 나온 뒤 `ls -al` 실행
`-l` 옵션까지 추가해서 실행한 결과 각 목록의 상세한 정보도 함께 표시하고 있다. 이처럼
몇몇 옵션을 함께 조합할 수도 있다.
![ls-complex-option](/assets/blog/01-cygwin/ls-complex-option.png)
{/* 간혹 어떤 커맨드는 mandb가 없어서 설명서를 볼 수 없는 경우도 있는데,
맨 처음 Cygwin을 설치할 때 실행했던 `setup-x86_64.exe` 를 다시 실행해서
해당 mandb를 마저 설치해주면 된다. */}
## [vi][vi]
[`vimtutor`][`vimtutor`] 를 실행한다.
위에서 `f` 키와 `b` 키로 man 페이지를 탐색해 보았는데 vi 또한 비슷한 키맵으로 커서를
이동할 수 있다.
단, Ctrl 키를 조합해서 `Ctrl f` / `Ctrl b` 로 페이지를 이동할 수 있다.
![vimtutor](/assets/blog/01-cygwin/vimtutor.png)
vimtutor에서 빠져나가려면 우선 `:` 를 입력한다.
그러면 하단에 `:` 이 표시되는데 `q` 를 마저 입력해서 `:q` 로 만들고 엔터를 입력해
빠져나갈 수 있다.
![vimtutor-quit](/assets/blog/01-cygwin/vimtutor-quit.png)
vimtutor는 man과는 별도로 vim에서 제공하는 vim 학습서이다.
엄밀히 따지면 [vim][vim]과 vi는 서로 다른 개발자의 개별 프로그램이지만
[BSD vi][BSD vi] 이든 vim이든 핵심적인 부분을 공유하기 때문에 vimtutor로도 vi 사용법을
익힐 수 있다.
`man` 과 vi의 키 조합이 비슷한데, [Unix 계열][Unix 계열] 운영체제에서는
비슷한 [인터페이스][인터페이스]를 여러 상황에서 반복적으로 적용하기 때문에
한 가지 개념을 학습하고나면 지속적으로 응용 할 수 있다.
## 커맨드 Part 2
커맨드 첫 장에서는 여러 번 실행해도 시스템에 아무 변화를 주지 않고 몇 가지 정보를 출력하기만 하는
명령어를 소개했다.
`man` 으로 각 명령어의 사용법을 익히고 `vimtutor` 의 내용까지 이해했다면 이제부터
시스템에 변화를 주는 커맨드도 하나씩 사용해 보도록 한다.
- `mkdir ~/cygwin-test` 로 디렉토리 생성
Windows 탐색기에서 `%userprofile%` (보통 C:\Users\사용자명) 로 들어가보면
방금 생성한 디렉토리를 볼 수 있다.
![mkdir](/assets/blog/01-cygwin/mkdir.png)
Unix 계열에서는 `~` 를 사용자 홈 디렉토리로 사용한다.
리눅스재단에서는 [FHS][FHS] 라는 계층구조를 제안하고 있는데, 이는 MS Windows에서
`C:\Program Files\` 로 들어가면 설치된 프로그램 목록을 볼 수 있는 것과 마찬가지로
리눅스 운영체제 간 일정하게 사용하기로 합의된 디렉토리 규격이다.
앞뒤로 아무 문자 없이 `/` 로 시작하는 _루트 디렉토리_ 는 운영체제가 설치된
디스크에 배치되는 것이 원칙이지만, 이 실습장에서는 Cygwin으로 FHS를 탐색하고
있기 때문에 `/` 의 실제 위치는 C:가 아니라 `C:\cygwin64` 이다.
탐색기에서 `%homedrive%\cygwin64\home\사용자\cygwin-test` 로 이동해보면
위에서 mkdir로 생성한 `~/cygwin-test` 디렉토리로 들어갈 것이다.
---
`rmdir` 커맨드로는 디렉토리를 삭제할 수 있다.
- `ls`
- `rmdir ~/cygwin-test` 로 디렉토리 삭제
- `ls ~` 로 삭제 여부 확인
![rmdir](/assets/blog/01-cygwin/rmdir.png)
- `mkdir ~/cygwin-test` 로 다시 디렉토리 생성
- `cd ~/cygwin-test` 를 입력해 방금 생성한 디렉토리로 이동
- `touch testfile` 로 빈 파일 생성
- `vi testfile` -> `i` 입력 -> `first testfile` 이라고 입력 -> `esc` 키 입력
-> `:wq` 를 입력하여 저장 & 종료
![wq](/assets/blog/01-cygwin/wq.png 'vi first test')
`touch` 는 원래 파일의 타임스탬프를 바꾸는 명령어이지만 지금처럼 파일을 생성하기 위해
사용할 수도 있다.
---
> `Failed to source defaults.vim` 메세지가 나오는 경우
> ![vi Failed to source](/assets/blog/01-cygwin/vi-failed-to-src.png)
> Cygwin 설치 프로그램 (setup-x86_64.exe)을 다시 실행 ->
> **Select Packages** 단계에서 Search란에 `vim` 검색
> ![vim installation 1](/assets/blog/01-cygwin/cyg-pkg-vim-1.png)
> ![vim installation 2](/assets/blog/01-cygwin/cyg-pkg-vim-2.png)
> ![vim installation 3](/assets/blog/01-cygwin/cyg-pkg-vim-3.png)
> Skip 부분 더블클릭하여 버전번호 선택 ->
> 다음으로 넘어가서 설치
---
- `cat testfile` 로 testfile의 내용물 확인
`vi` 를 쓰는 대신 곧바로 내용물을 출력하고 싶을 때 cat을 사용하면 된다.
![cat](/assets/blog/01-cygwin/cat.png 'concatenation')
- `echo "new string" >> testfile && cat testfile` 실행
`echo 문자열`: 문자열 출력
`&&`: 연속해서 다음 명령 실행. `명령어1 && 명령어2 && 명령어3` 처럼 연결해서 여러 명령어를
한꺼번에 실행시킬 수 있다.
위 명령을 실행한 결과 testfile의 두 번째 줄에 `new string` 이 붙었다.
![multiple-commands](/assets/blog/01-cygwin/multiple-commands.png)
`>>``new string` 을 testfile로 보내줬는데, [리다이렉션][리다이렉션]을 시킨 것이다.
`항1 >> 항2` 과 같이 두 번 쓰면 원래 내용을 보존하면서 첫 번째 항을 덧붙여주고
`>` 을 하나만 쓰면 원래 내용을 삭제하고 새 데이터를 넣는다.
![redirection-overwrite](/assets/blog/01-cygwin/redirection-overwrite.png)
- `cp testfile testfile2 && ls` 로 파일 복사 후 목록 출력
- `rm testfile2 && ls` 로 파일 삭제 후 목록 출력
`cp 원본 복사본` 명령어는 파일을 복사하고
`rm 삭제될대상` 명령어는 파일을 삭제한다
![rm](/assets/blog/01-cygwin/rm.png)
- `cp testfile testfile2` 로 다시 파일 복사
- `ls ~/cygwin-test` 로 복사 여부 확인
![cp](/assets/blog/01-cygwin/cp.png)
지금까지와 달리 `ls 절대경로` 형식으로 복사 여부를 확인해 보았다.
파일시스템에서 [디렉토리][디렉토리]는 계층적으로 이루어져 있는데, 기존처럼 단순 `ls`
실행하면 `pwd` 가 현재 잡고 있는 위치에서 명령을 실행한다. 반면에,
절대경로를 ls의 인자로 전달하면 현재 pwd가 어떻게 잡혀있든 상관 없이
절대경로에 대해서 작업을 수행한다.
다음을 실행해 본 뒤 계층구조를 확인해 보도록 한다.
- `cd .. && pwd` 로 상위 디렉토리로 이동 후 현재 위치 출력
`mkdir ~/cygwin-test` 를 했을 때 디렉토리 구조는
home
  └─ 사용자
    └─ cygwin-test
로 구성됐다.
마지막에 `~/cygwin-test` 에 있었기 때문에 여기에서 상위로 이동하면 `~` 로 이동하는 것이다.
![cd](/assets/blog/01-cygwin/cd.png)
`rm cygwin-test/testfile2 && ls cygwin-test` 까지 실행하고나면 해당 내용이 이해됐을
것이다.
- `rmdir cygwin-test` 실행
- `ls` 실행
rmdir은 디렉토리를 삭제하는 명령어인 것으로 위에서 소개를 했는데 삭제를 거부하고 있다.
cygwin-test 내부가 비어있지 않고 파일이 들어있기 때문인데, `rm -rv cygwin-test`
다시 시도해보라.
ls로 삭제 여부를 확인할 수 있다.
![rm-r](/assets/blog/01-cygwin/rm-r.png)
rm으로 삭제를 수행하고나서 이 명령이 실행이 된 건지 아닌지 알려줬으면 좋겠다는 생각이 들
수 있는데, rm에 `-v` 옵션을 넣어서 `removed` 라고 출력하도록 조치하였다.
---
`clear` 로 이전 기록을 화면에서 지울 수 있다.
다음을 실행한다
- `mkdir ~/opt && cd ~/opt`
- `touch testfile`
- `echo "test string" >> testfile`
- `cp testfile testfile2`
- `mkdir subdir`
- _`mv testf* subdir`_
- `cd subdir && ls`
![mv](/assets/blog/01-cygwin/mv.png)
`mv` 는 파일을 이동시키는 커맨드이지만 파일명을 변경할 때에도 사용할 수 있다.
- `mv testfile testfile.test && mv testfile2 testfile3.test && ls`
testfile은 testfile.test로,
testfile2는 testfile3.test로 이름이 바뀌었다.
이 두 파일을 삭제하려면 `rm testfile.test testfile3.test` 를 실행할 수도 있다.
하지만, 이렇게 삭제해야 할 파일이 20개, 30개씩 있다면 작업이 번거로워지기 때문에
`*` 를 사용해서 나머지 뒷 부분을 생략할 수 있다.
상단에서 실습해 본 `mv testf* cygwin-test` 명령이 그렇게 실행된 것이다.
- `rm -v *.test && ls` 실행
![rm-wildcard](/assets/blog/01-cygwin/rm-wildcard.png)
삭제 옵션으로 `-v` 를 또 넣었는데 어차피 계속 사용할 것이므로 자동으로 붙이면
편리하게 쓸 수 있을 것이다.
- `vi ~/.bash_aliases`
- `alias rm='rm -v'` 입력
- `:wq` 를 입력해서 vi 종료
- `source ~/.bash_aliases`
- `touch ~/opt/testfile`
- `rm ~/opt/testfile`
![vi-alias](/assets/blog/01-cygwin/vi-alias.png)
![rm-v-alias](/assets/blog/01-cygwin/rm-v-alias.png)
존재하지 않는 파일에 대해선 `vi` 에서 `:w` 로 저장할 때 파일이 생성되기 때문에
미리 `touch ~/.bash_aliases` 로 만들어 둘 필요가 없다.
`rmdir` 에 대해서도 alias를 추가해 보도록 한다.
- `echo "alias rmdir='rmdir -v'" >> ~/.bash_aliases`
- `echo "alias ls='ls -F'" >> ~/.bash_aliases`
- `echo "alias ln='ln -v'" >> ~/.bash_aliases`
- `source ~/.bash_aliases`
- `cat ~/.bash_aliases`
![aliases](/assets/blog/01-cygwin/aliases.png)
ls에 `-F` 옵션을 사용하면 디렉토리는 이름 끝에 `/` 가 붙어서 다른 파일과 쉽게
구분할 수 있다.
![ls-F](/assets/blog/01-cygwin/ls-F.png)
`ln` 명령어는 곧 이어 설명을 하겠다.
어떤 옵션을 alias로 지정할 것인지 전부 외울 순 없기 때문에 man으로 추가할
옵션을 참고하도록 한다.
## 유틸리티
- `cat /var/log/setup.log`
![setup-log](/assets/blog/01-cygwin/setup-log.png)
[FHS][FHS] 에 의하면 내용이 수시로 바뀌는 기록은 `/var/log` 에 저장하도록
되어 있는데 cygwin을 설치하면서 `setup.log` 가 저장된다.
각종 설치 내역이 저장되어 있기 때문에 cat으로 본문을 뽑았을 때 아주 길게
화면에 나오는데 `head``tail` 로 이 길이를 조절할 수 있다.
- `head /var/log/setup.log`: 내용 시작점 일부를 출력
- `tail /var/log/setup.log`: 내용 끝점 일부를 출력
![head](/assets/blog/01-cygwin/head.png)
![tail](/assets/blog/01-cygwin/tail.png)
기본으로 10줄씩 출력을 하고 있는데 이 길이를 바꾸려면
- `head --lines=3 /var/log/setup.log` 또는
- `head -n 7 /var/log/setup.log`
형식으로 지정하면 되고 tail 또한 마찬가지이다.
![head-line](/assets/blog/01-cygwin/head-line.png)
- `rm -r subdir`
- `mkdir -p ~/opt/cygwin-test/subdir && cd $_ && touch test-origin`
하위 디렉토리를 연쇄적으로 만들 때 `-p` 옵션을 붙이면 하나 만들고 cd로 들어가서
또 다시 만드는 일 없이 곧바로 처리할 수 있다.
이런 다단계 디렉토리를 생성하고나서 그 안쪽으로 이동하기 위해 cd로 또 다시
하위 경로까지 입력하는 대신 `cd $_` 를 입력하면 곧장 이동할 수 있다.
![mkdir-p](/assets/blog/01-cygwin/mkdir-p.png)
방금 `~/opt/cygwin-test/subdir` 안에 새로 생성한 test-origin에 대해서
- `echo "line1" >> test-origin && cat test-origin` 을 실행
예상대로 `line1` 이라는 문자열이 test-origin 안에 들어 있다.
![ready-to-ln](/assets/blog/01-cygwin/ready-to-ln.png)
- `ln -s test-origin test-symlink && cat test-symlink` 실행
cp로 복사한 파일이 아닌데도 `line` 이라는 문자열이 `test-symlink` 안에 들어있다.
![ln-s](/assets/blog/01-cygwin/ln-s.png)
이어서 아래 명령도 실행해 본다.
- `echo "line2" >> test-origin`
- `cat test-origin`
- `cat test-symlink`
분명히 `line2` 라는 문자열은 `test-origin` 에만 넣었는데 `test-symlink`
로부터도 같은 내용물이 출력되고 있다.
![ln-s2](/assets/blog/01-cygwin/ln-s2.png)
이것은 [심볼릭 링크][심볼릭 링크] 라고 불리며 MS Windows의 `바로 가기` 기능과
유사하다.
`test-symlink` 파일이 원본인 `test-origin` 을 가리키고 있기 때문에
test-origin을 바꾸고서 test-symlink를 출력하더라도 결국 원본인 test-origin의
내용을 보여주는 것이다.
반대로 `test-symlink` 안에 내용물을 추가하고나서 `test-origin` 을 출력해도
마찬가지로 반영된 결과를 볼 수 있다.
![ln-s3](/assets/blog/01-cygwin/ln-s3.png)
---
[우분투]: https://ubuntu.com/download/alternative-downloads#bittorrents 'Ubuntu'
[그누/리눅스]: https://www.gnu.org/gnu/gnu-linux-faq.html#osvskernel 'GNU/Linux'
[유닉스]: https://en.wikipedia.org/wiki/UNIX_System_V 'Unix'
[Bash]: https://tiswww.case.edu/php/chet/bash/bashtop.html 'Bourne Again Shell'
[노드]: https://github.com/nodesource/distributions/blob/master/README.md#using-ubuntu-4 'Node.js'
[시그윈]: https://cygwin.com/install.html 'Cygwin'
[가상머신]: https://en.wikipedia.org/wiki/Full_virtualization '전가상화'
[X]: https://x.org/ '디스플레이 서버'
[git-bash]: https://git-scm.com/downloads '깃'
[msys2]: https://www.msys2.org/docs/what-is-msys2/ 'minimal system 2'
[WSL]: https://github.com/Microsoft/WSL 'Windows Subsystem for Linux'
[git for windows]: https://git-for-windows.github.io/
[실패 격리]: https://en.wikipedia.org/wiki/Fail-safe 'Fail safe'
[docker]: https://www.docker.com/ '도커'
[setup-x86_64.exe]: https://cygwin.com/setup-x86_64.exe
[커맨드 (명령어)]: https://en.wikibooks.org/wiki/Guide_to_Unix/Commands
[vi]: https://ex-vi.sourceforge.net/ 'visual'
[BSD vi]: https://docs.freebsd.org/44doc/usd/12.vi/paper.pdf
[vim]: https://www.vim.org/viusers.php 'Vi IMproved'
[`vimtutor`]: https://github.com/vim/vim/blob/master/runtime/tutor/tutor
[Unix 계열]: https://en.wikipedia.org/wiki/Unix-like 'unix-like'
[인터페이스]: https://en.wikipedia.org/wiki/Interface_(computing) 'Interface'
[디렉토리]: https://en.wikipedia.org/wiki/Directory_(computing)
[FHS]: https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard 'Filesystem hierarchy standard'
[리다이렉션]: https://en.wikipedia.org/wiki/Redirection_(computing) 'Redirection'
[심볼릭 링크]: https://en.wikipedia.org/wiki/Symbolic_link 'Symbolic link'

View file

@ -0,0 +1,341 @@
---
title: "리눅스 입문 part 2"
description: "1장에 이어서 명령어, 이론, 요령을 알아본다."
image: "/assets/blog/02-linux-begin-02/Standard-unix-filesystem-hierarchy.svg"
authors: [bitdori]
---
### 권한
![ln-s3](/assets/blog/01-cygwin/ln-s3.png)
ls에 `-l` 옵션을 붙여서 파일 목록을 출력하면 여러 가지 정보가 나오는데
소유자명, 시각, 파일명 및 링크 [포인터][포인터]로 구성돼 있다는 건 대충
알아볼 수 있으나 첫 번째로 나오는 `-rw-r--r--` 와 같은 문자는 어떤 뜻인지
알아보지 못 할 수도 있다.
이는 [Symbolic notation][Symbolic notation]라고 불리는 읽기/쓰기/실행 권한 표기문자
이다.
총 10글자로 돼 있는데, 맨 왼쪽 한 개를 뺀 아홉 개는 3개씩 끊어서 각각
소유자(u)/그룹(g)/기타(o)의 권한을 표시한다.
`-rw-r--r--` 인 경우
- 소유자: 읽기/쓰기 (read/write)
- 해당 파일이 지정된 그룹: 읽기만 (read)
- 소유자도 파일의 그룹도 아닌 기타 사용자: 읽기만 (read)
할 수 있는 상태인 것이다.
예를 하나 더 들어 `lrwxrwxrwx` 인 경우 파일소유자/그룹/기타 모두 모든 권한을
보유하고 있는 것이다. (read/write/execute)
맨 왼쪽 `l`_Symbolic link_ 임을 알려주고 있는데, 다른 [표현형][표현형]으로는
- `-`: 일반 정규 파일
- `d`: 디렉토리
- `p`: [기명 파이프][기명 파이프]
- `s`: [소켓][소켓]
- `c`: Character device
- `b`: Block device
가 있다.
- `cd ~/opt/cygwin-test`
- `ls -l`
![file-type-directory](/assets/blog/02-linux-begin-02/file-type-directory.png)
Symbolic notation의 r/w/x/- 문자는 각각 4/2/1/0 이 대입되는 [8진수][8진수]로
이루어져 있다.
따라서 예로 들고 있는 `-rw-r--r--`_644_ 권한이 들어가 있는 것이다.
같은 방식으로 `lrwxrwxrwx`_777_ 권한으로 치환할 수 있다.
### 유틸리티 part 2
`cat /var/log/setup.log` 로 Cygwin 설치 중 기록된 메세지를 확인할 수 있었는데,
내용이 길어서 head와 tail로 끊어보았다.
- `less /var/log/setup.log` 실행
![less](/assets/blog/02-linux-begin-02/less.png)
head/tail은 한 번만 출력하고 끝내는 명령인데, `less``man`과 마찬가지로
`f` / `b` 키를 누르면서 계속 본문을 탐색할 수 있다.
- `q` 를 눌러서 less 종료
`less` 커맨드가 개발되기 전에 `more` 라는 명령어가 먼저 나왔는데 less가 기능이 더
좋지만 [more][more]는 도스에서도 기본 탑재하던 커맨드이기 때문에 less를 쓸 수 없는
아주 제한적인 환경에서는 more를 less 대신 사용할 수도 있을 것이다.
---
- `cat /var/log/setup.log | wc -l` 실행
![wc](/assets/blog/02-linux-begin-02/wc.png)
어떤 숫자가 출력됐는데 setup.log 속 내용이 몇 줄이나 들어있는지 [wc][wc]에 `-l` 옵션을
줘서 계산한 것이다.
cat과 wc 사이를 [파이프라인][파이프라인]으로 이어줬는데 서로 다른 프로그램이
마치 한 개로 합쳐진 것처럼 명령을 수행한다.
&&는 따로따로 실행하는 명령을 표기만 한 줄로 엮을 때 사용하기 때문에 위 명령을
`cat /var/log/setup.log && wc -l` 로 실행하면 예상과는 다른 결과가 나올 것이다.
![and](/assets/blog/02-linux-begin-02/and.png)
- [`Ctrl c`][`Ctrl c`] 를 눌러서 종료
### [Shell script][Shell script]
다음과 같은 명령을 실행한다고 해 보자
- `mkdir -p ~/opt/cygwin-test && touch testfile && echo "line1" >> testfile && cp testfile testfile2 && cat testfile2 && ls -l`
특별할 것 없는 명령이긴하나
1. 같은 커맨드를 또 다시 입력하고 싶지 않을 때
2. 내용을 깔끔하게 작성하고 싶을 때
3. 외우고 싶지 않을 때
세울 수 있는 대안책으로 shell script를 작성할 수 있다.
`vi test-script.sh` 를 실행해서 해당 내용을 입력한다.
```sh
#!/usr/bin/env bash
mkdir -p ~/opt/cygwin-test
touch testfile
echo "line1" >> testfile
cp testfile testfile2
cat testfile2
ls - l
```
![shell-script-1](/assets/blog/02-linux-begin-02/shell-script-1.png)
![shell-script-2](/assets/blog/02-linux-begin-02/shell-script-2.png)
- `ls -l`
- `chmod +x test-script.sh`
- `ls -l`
![shell-script-3](/assets/blog/02-linux-begin-02/shell-script-3.png)
- `./test-s` 까지만 입력하고 [`Tab`][`Tab`] 키를 눌러서 나머지 자동완성
- Enter를 눌러서 실행
![shell-script-execute](/assets/blog/02-linux-begin-02/shell-script-execute.png)
위에서 입력한 명령을 연쇄적으로 실행하였다.
FHS에서 `..` 으로 dot을 두 개 입력하면 상위 디렉토리를 가리키고,
_`.` 한 개만 입력하면 현재 디렉토리_ 를 가리킨다.
`./test-script.sh` 라고 입력한 부분은 현재 위치(pwd)에 있는 test-script.sh 파일을
실행하겠다는 뜻이 된다.
- `chmod -x test-script.sh`
- `./test-script.sh`
![permission-denied](/assets/blog/02-linux-begin-02/permission-denied.png)
실행을 거부하고 있다.
[chmod][chmod] 는 rwx 권한을 변경할 때 사용한다.
맨 처음 shell script를 저장하고 곧바로 `chmod +x` 라는 것을 실행했는데
`x` 권한을 덧붙여서 실행할 수 있는 상태로 만들었던 것이다.
이후 `-x` 를 하여 다시 실행권한이 없어졌기 때문에 _Permission denied_
출력하면서 실행을 거부했다.
`./test-s` 까지만 입력하고 탭 키를 눌렀을 때 나머지 `./test-script.sh` 까지
[자동완성][자동완성]이 됐는데,
"" 사이에 문자열을 입력할 때 처럼 자동완성을 할 수 없는 경우가 있지만 대부분
경우에는 지원을 해 주고 있다.
chmod -x 로 실행권한이 빠졌을 때 자동완성이 되지 않았을텐데 이러한 동작으로
[실행 가능 파일][실행 가능 파일]인지 아닌지 짐작해 볼 수 있다.
스크립트 첫 줄에 입력한 `#!/usr/bin/env bash` 라인은 hashbang 또는
[shebang][shebang] 이라는 부분이며 _이 스크립트를 어떻게 실행할 것인가_
결정하는 부분이다.
![env](/assets/blog/02-linux-begin-02/env.png)
`ls /usr/bin` 을 해 보면 `env` 라는 프로그램이 있는데 이 프로그램으로
bash가 있는 위치를 탐색하도록 조치한 것이다.
[애플 맥OS에서는 zsh][zsh for mac] 을 기본 인터프리터로 설정해 놓았기 때문에
`#!/usr/bin/env zsh` 로 작성하게 될 것이다.
[`/usr/bin/env`][env] 가 없거나 이를 사용하지 않는 경우 어떤 스크립트에는 `#!/bin/sh`
입력되어 있는 경우도 있는데 /bin/sh는 [POSIX sh][POSIX sh]이며 bash나 zsh이
아니기 때문에 동작방식이 다를 수도 있다.
### 파일 탐색
`/usr/bin``env` 가 있다는 사실은 해당 문서를 통해서 또는 경험적으로
알게된 것이지만 경험해 본 적 없는 새로운 파일, 새로운 커맨드가 있는 위치를
찾아보는 명령어로 [`which`][`which`] 와 [`whereis`][`whereis`] 가 있다.
![command search](/assets/blog/02-linux-begin-02/command-search.png)
`which env``whereis env` 로 env의 위치를 탐색해보면 둘 다 env 위치를
출력하긴 하지만 which는 출력값이 단 하나인 것에 비해 whereis는 다른 값도
보여주고 있다.
- `which 찾는대상`: 실행가능파일(executable)이 있는 위치 출력
- `whereis 찾는대상`: [이진 파일][이진 파일], 소스, 매뉴얼이 있는 위치 출력
근데, which와 whereis는 커맨드를 어디에서 찾아야 할지 어떻게 알고 있는 걸까?
이들을 실행하면 [PATH][PATH]라는 [환경 변수][환경 변수]로부터 경로값을
읽고 명령을 수행한다.
`echo $PATH` 를 실행하면 _PATH_ 에 어떤 값이 들어있는지 볼 수 있는데,
여기에서 _/usr/bin_ 을 볼 수 있다.
커맨드의 위치를 찾아주는 which / whereis와 달리 [`find`][`find`]로는
특정 파일을 어떤 경로 내에서 찾을 수 있다.
- `cd /opt/cygwin-test`
- `ls`
- `find . -name "test*"`
_test_ 로 시작하는 파일 내역을 현재 위치에서부터 하위 디렉토리 내부까지
탐색했다.
![find](/assets/blog/02-linux-begin-02/find.png)
### bash 활용
다음과 같은 명령을 실행하려고 한다.
`mkdir`_-p_ `~/opt/cygwin-test/subdir && cd $_ && touch newfile && echo "line1" >> newfile && ls && cat newfile`
전체 커맨드의 앞 단계에서 띄어쓰기를 빼먹어서 에러를 발생시킬 것이다.
커서를 앞 부분으로 하나씩 하나씩 옮겨서 띄어쓰기를 넣고 다시 실행하면 정상적으로 진행이
되겠지만 [Readline][Readline] 단축키로 커서를 더 빠르게 이동시킬 수 있다.
- 잘못된 커맨드 우선 실행
- 윗 화살표로 커맨드 다시 표시
- `Ctrl a` 로 커서 맨 앞으로 이동 후 잘못된 부분 수정
위/아래 화살표로 이전 커맨드를 찾는 대신 전체 내역을 보고 싶어질 수 있는데
[`history`][`history`] 커맨드로 예전 기록을 확인할 수 있다.
![history-1](/assets/blog/02-linux-begin-02/history-1.png)
history가 출력되면 원하는 내용을 복사 후 붙여넣기해서 Readline 단축키로
수정하려는 부분을 바꾸면 된다.
- `Ctrl e`: 커서를 맨 뒤로 이동 (end)
- `Alt b`: 커서를 한 단어 왼쪽으로 이동 (backward)
- `Alt f`: 커서를 한 단어 오른쪽으로 이동 (forward)
Readline 단축키는 [`info`][`info`]와 [emacs][emacs]에서도 활용하고 있다.
이미 실행했던 커맨드가 많아서 하나하나 찾기 힘든 경우 `history | grep -i 검색어`
형식으로 [`grep`][`grep`]을 이용해서 찾아낼 수도 있다.
grep의 `-i` 옵션은 대소문자에 상관 없이 같은 알파벳이면 결과를 보여주도록
하는 옵션이다 (case insensitive)
![hist-grep](/assets/blog/02-linux-begin-02/hist-grep.png)
## Cygwin 환경설정
Cygwin은 [mintty][mintty]라는 터미널 위에서 돌아가는데, 이 mintty 설정을
통해서 폰트 등을 변경할 수 있다.
https://fonts.google.com/download?family=Noto%20Sans%20Mono
에서 Noto Mono 계열 폰트를 받은 뒤 압축을 해제하면
`NotoSansMono-VariableFont_wdth,wght` 와 static 폴더가 있는데
VariableFont는 모든 폰트를 한 번에 설치하지만 용량이 그만큼 크다.
static에서는 필요한 폰트를 하나씩 설치하도록 되어 있다.
![noto](/assets/blog/02-linux-begin-02/noto.png)
Cygwin 우클릭 - Options...
![cygwin-context-menu](/assets/blog/02-linux-begin-02/cygwin-context-menu.png)
Text 항목에서 Font를 Select...
![cygwin-font-select](/assets/blog/02-linux-begin-02/cygwin-font-select.png)
Font Size도 좀 더 크게 바꾸어 보았다.
![cygwin-font-applied](/assets/blog/02-linux-begin-02/cygwin-font-applied.png)
https://fonts.google.com/specimen/Roboto+Mono
https://github.com/naver/d2codingfont/releases
https://github.com/be5invis/Sarasa-Gothic/releases
{/*
Options - Text - Font: Noto Mono
Font smoothing: default
.minttyrc
FontChoice=CJK:5;Hangul:9
Font5=Sarasa Fixed K
Font9=Sarasa Fixed K
Emojis=noto
CursorType=block
CursorBlinks=no
Font=Noto Mono
Locale=C
Charset=UTF-8
FontSmoothing=default
FontHeight=12
Scrollbar=none
Language=en_US
BoldAsColour=no
BoldAsFont=no
Transparency=off
OpaqueWhenFocused=yes
Term=xterm-256color
*/}
[포인터]: https://en.wikipedia.org/wiki/Pointer_(computer_programming) "Pointer"
[Symbolic notation]: https://en.wikipedia.org/wiki/File-system_permissions#Symbolic_notation
[표현형]: https://en.wikipedia.org/wiki/Unix_file_types "Representations"
[기명 파이프]: https://en.wikipedia.org/wiki/Named_pipe "Named pipe"
[소켓]: https://en.wikipedia.org/wiki/Unix_domain_socket "socket"
[8진수]: https://en.wikipedia.org/wiki/Octal
[more]: https://en.wikipedia.org/wiki/More_(command)
[wc]: https://en.wikipedia.org/wiki/Wc_(Unix) "Word Count"
[`Ctrl c`]: https://en.wikipedia.org/wiki/Signal_(IPC)#SIGINT "Signal Interrupt"
[Shell script]: https://en.wikipedia.org/wiki/Shell_script
[파이프라인]: https://en.wikipedia.org/wiki/Pipeline_(Unix) "Pipeline"
[`Tab`]: https://en.wikipedia.org/wiki/Tab_key "탭 키"
[chmod]: https://en.wikipedia.org/wiki/Chmod "change mode"
[자동완성]: https://en.wikipedia.org/wiki/Command-line_completion "completion"
[실행 가능 파일]: https://en.wikipedia.org/wiki/Executable "Executable"
[shebang]: https://en.wikipedia.org/wiki/Shebang_(Unix)
[zsh for mac]: https://support.apple.com/en-us/HT208050
[env]: https://en.wikipedia.org/wiki/Env "env"
[POSIX sh]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html "sh"
[`which`]: https://carlowood.github.io/which/ "GNU which"
[`whereis`]: https://en.wikipedia.org/wiki/Whereis
[이진 파일]: https://en.wikipedia.org/wiki/Binary_file "Binary file"
[PATH]: https://en.wikipedia.org/wiki/PATH_(variable)
[환경 변수]: https://en.wikipedia.org/wiki/Environment_variable "Environment variable"
[`find`]: https://en.wikipedia.org/wiki/Find_(Unix)
[Readline]: https://en.wikipedia.org/wiki/GNU_Readline "GNU Readline"
[`history`]: https://en.wikipedia.org/wiki/History_(command)
[`info`]: https://en.wikipedia.org/wiki/Info_(Unix)
[emacs]: https://en.wikipedia.org/wiki/Emacs "이맥스"
[`grep`]: https://en.wikipedia.org/wiki/Grep "g/re/p"
[mintty]: https://github.com/mintty/mintty/wiki/Tips#secondary-fonts

578
blog/2023-02-08-linux-03.md Normal file
View file

@ -0,0 +1,578 @@
---
title: "리눅스 사용 - 가상머신"
description: "리눅스 커널이 탑재된 환경에서 실 사용감을 익혀본다."
image: "/assets/blog/03-linux-03/Hyperviseur.svg"
authors: [bitdori]
---
- https://sourceforge.net/projects/qbittorrent/files/latest/download 또는
https://www.fosshub.com/qBittorrent.html 에서 [qBittorrent][qBittorrent] 다운로드 -
설치
- https://cdimage.ubuntu.com/xubuntu/releases/jammy/release/ 또는
https://ftp.kaist.ac.kr/ubuntu-cdimage/xubuntu/releases/jammy/release/
에서 [Xubuntu][Xubuntu] 토렌트 다운로드
![xubuntu-torrent](/assets/blog/03-linux-03/xubuntu-torrent.png)
다운로드 한 _.torrent_ 파일을 더블클릭하여 iso 파일 다운로드
![xubuntu-downloading](/assets/blog/03-linux-03/xubuntu-downloading.png)
Xubuntu를 다운로드 하는 동안 https://www.virtualbox.org/wiki/Downloads 접속
![virtualbox-org](/assets/blog/03-linux-03/virtualbox-org.png)
_Windows hosts_ 를 클릭하면 다운로드가 진행되지만 이번에는 [curl][curl]로
다운로드를 해 보기 위해 주소를 복사하기만 한다.
- Cygwin 실행 - `cd` 로 다운로드 할 경로로 이동
- `curl -O` 까지 입력한 뒤 우클릭 - Paste를 하여 복사해 둔 VirtualBox 주소 붙여넣기
- 실행
![curl-O](/assets/blog/03-linux-03/curl-O.png)
![curl-downloading](/assets/blog/03-linux-03/curl-downloading.png)
다운로드가 끝나면 VirtualBox 설치
![vbox-inst-1](/assets/blog/03-linux-03/vbox-inst-1.png)
![vbox-inst-2](/assets/blog/03-linux-03/vbox-inst-2.png)
![vbox-inst-3](/assets/blog/03-linux-03/vbox-inst-3.png)
![vbox-inst-4](/assets/blog/03-linux-03/vbox-inst-4.png)
![vbox-inst-5](/assets/blog/03-linux-03/vbox-inst-5.png)
qBittorrent에서 Progress가 100%이면서 상태가 Seeding이면 Xubuntu 다운로드가
끝난 것이다.
항목을 우클릭해서 다운로드 대상 폴더를 확인
![xubuntu-downloaded](/assets/blog/03-linux-03/xubuntu-downloaded.png)
VirtualBox 실행 - New
![vbox-new](/assets/blog/03-linux-03/vbox-new.png)
이름란에 `xubuntu` 입력 - ISO 이미지에 토렌트로 받았던 이미지를 선택
`Skip Unattended Installation` 체크
![vbox-create](/assets/blog/03-linux-03/vbox-create.png)
프로세서는 초록색 범위 내에서 선택
![vbox-create-hardware](/assets/blog/03-linux-03/vbox-create-hardware.png)
시스템 전체에서 남는 공간 중 xubuntu 가상머신에 할당할 크기 지정 - Next - Finish
![vbox-create-harddisk](/assets/blog/03-linux-03/vbox-create-harddisk.png)
설정
![vbox-settings](/assets/blog/03-linux-03/vbox-settings.png)
디스플레이에서 비디오 메모리 용량을 초록색 범위 내에서 할당
3D 가속 활성화 체크
![vbox-settings-display](/assets/blog/03-linux-03/vbox-settings-display.png)
시작
![vbox-start](/assets/blog/03-linux-03/vbox-start.png)
![vbox-starting](/assets/blog/03-linux-03/vbox-starting.png)
VirtualBox 내부에 마우스 포인터가 갇히는 경우 _오른쪽 Ctrl_ 키를 누르면
빠져나올 수 있다.
설치 클릭
![vbox-hostkey](/assets/blog/03-linux-03/vbox-hostkey.png)
키보드 레이아웃은 English (US) 선택
![xubuntu-inst-kbd](/assets/blog/03-linux-03/xubuntu-inst-kbd.png)
[서드파티][서드파티] 소프트웨어 설치 체크 - 계속
![xubuntu-inst-thirdparty](/assets/blog/03-linux-03/xubuntu-inst-thirdparty.png)
지금 설치 - 계속 - 변경사항을 디스크에 쓰기 창에서 계속
![xubuntu-instnow](/assets/blog/03-linux-03/xubuntu-instnow.png)
![xubuntu-inst-write-disk](/assets/blog/03-linux-03/xubuntu-inst-write-disk.png)
시간대 선택
![xubuntu-inst-tz](/assets/blog/03-linux-03/xubuntu-inst-tz.png)
사용자명 `xubuntu`
패스워드는 보안상 쉽게 탈취되지 않도록 짓는 것이 원칙이지만 가상머신 내에서
테스트용도로 사용하기 때문에 편한대로 간결하게 지어도 괜찮을 것이다.
![xubuntu-inst-adduser](/assets/blog/03-linux-03/xubuntu-inst-adduser.png)
설치가 끝날 때 까지 대기
![xubuntu-installing](/assets/blog/03-linux-03/xubuntu-installing.png)
---
### 설치 중 참고사항
유명 소프트웨어 중에 [LTS][LTS]라는 릴리스 모델을 채택하고 있는 프로젝트가
여럿 있는데 우분투는 2년에 한 번씩 짝수해 4월마다 LTS 버전을 출시하고 있다.
https://en.wikipedia.org/wiki/Ubuntu_version_history#Table_of_versions
각 버전마다 별명이 있으며 2022년 4월에 출시한 22.04 버전은 jammy라는 [코드네임][코드네임]이
붙어있다.
Xubuntu는 ubuntu에 [xfce][xfce]를 탑재한 [리눅스 배포판][리눅스 배포판]이다.
기본 우분투의 [Nautilus][Nautilus] 파일탐색기는 일부 외장 디스크 unmount시
[spindle][spindle] parking 시퀀스가 올바르게 작동하지 않는 문제가 있지만
Xubuntu의 파일탐색기에서는 해당 문제가 일어나지 않는다.
[하이퍼바이저][하이퍼바이저] 성능만 따지면 VirtualBox보다 [QEMU][QEMU]가 더 빠르긴 하지만
리눅스에서 설치하는 [virt-manager][virt-manager]가 함께 있어야 편리하게 쓸 수 있기 때문에
본 자습서에서는 VirtualBox를 사용한다.
QEMU는 호스트와 [아키텍처][아키텍처]가 일치하지 않는 [프로세서][프로세서]도 가상화 할
수 있기 때문에 해당 내용에 관심이 있다면 관련 자료를 알아보는 것도 좋다.
{/* DMA */}
Cygwin으로도 리눅스의 여러 기능을 사용할 수 있지만 가상머신에 운영체제 전체를 설치하면
- Cygwin에서 rm으로 실수로 파일을 삭제하는 등 시스템에 영향을 줄 수 있는 여지가
가상머신 내부에서는 없기 때문에 가상머신 내부에서 완전히 망가지더라도
해당 이미지 외부로 아무 영향을 주지 않는다.
- X [디스플레이 서버][디스플레이 서버] 구동
- [패키지 매니저][패키지 매니저] 탑재
- [컨테이너][컨테이너] 구동
- [RAID][RAID] 구성
- [부트로더][부트로더] 설정
- 리눅스 심볼릭 링크
- [sysctl][sysctl] 등으로 커널 조작
등을 사용할 수 있다.
[WSLg][WSLg] 또는 [VcXsrv][VcXsrv]로 리눅스 그래픽 환경을 구동할 수 있지만
Windowing system이 서로 달라서 네이티브 리눅스 환경과 재현도 차이가 날 수 있다.
---
Xubuntu 설치가 끝나면 재시작
![xubuntu-inst-complete](/assets/blog/03-linux-03/xubuntu-inst-complete.png)
만약 재시작 화면이 끝나지 않고 멈춰 있다면 가상머신을 강제로 리셋하면 된다.
![xubuntu-reset-1](/assets/blog/03-linux-03/xubuntu-reset-1.png)
![xubuntu-reset-2](/assets/blog/03-linux-03/xubuntu-reset-2.png)
![xubuntu-boot-1](/assets/blog/03-linux-03/xubuntu-boot-1.png)
![xubuntu-boot-2](/assets/blog/03-linux-03/xubuntu-boot-2.png)
부팅이 끝나면 [세션 관리자][세션 관리자]가 뜬다.
![xfce4-session](/assets/blog/03-linux-03/xfce4-session.png)
- 우상단 전원 아이콘 클릭 - Shut Down...
![shutdown](/assets/blog/03-linux-03/shutdown.png)
---
다시 시스템을 시작한다.
![vbox-start](/assets/blog/03-linux-03/vbox-start.png)
사용 언어와 관련된 필요 패키지를 자동으로 감지해서 띄워주면 그대로 설치하면 된다.
![lang-1](/assets/blog/03-linux-03/lang-1.png)
![lang-2](/assets/blog/03-linux-03/lang-2.png)
패스워드란에는 운영체제 설치 단계에서 입력했던 패스워드를 입력한다.
![lang-3-passwd](/assets/blog/03-linux-03/lang-3-passwd.png)
![lang-4-inst](/assets/blog/03-linux-03/lang-4-inst.png)
![lang-5-applying](/assets/blog/03-linux-03/lang-5-applying.png)
소프트웨어 업데이트 알림에 대해서도 그대로 설치를 진행한다.
![upd-1](/assets/blog/03-linux-03/upd-1.png)
![upd-2-passwd](/assets/blog/03-linux-03/upd-2-passwd.png)
![upd-3-inst](/assets/blog/03-linux-03/upd-3-inst.png)
![upd-4-unpacking](/assets/blog/03-linux-03/upd-4-unpacking.png)
설치 후 시스템 재시작
![upd-reboot](/assets/blog/03-linux-03/upd-reboot.png)
---
상단 작업표시줄 우클릭 - _Panel_ - _Add New Items..._
![xf-taskbar-1-newitems](/assets/blog/03-linux-03/xf-taskbar-1-newitems.png)
Launcher - _Add_
![xf-taskbar-2-launcher](/assets/blog/03-linux-03/xf-taskbar-2-launcher.png)
우상단 ! 아이콘 클릭 - _Delete finished notifications_ 클릭해서 VirtualBox 알림 정리
![vbox-delnoti](/assets/blog/03-linux-03/vbox-delnoti.png)
새로 생긴 빈 Launcher 아이콘 우클릭 - _Properties_
![xf-taskbar-3-launcher-props](/assets/blog/03-linux-03/xf-taskbar-3-launcher-props.png)
_Add a new empty item_
![xf-taskbar-4-new-empty-item](/assets/blog/03-linux-03/xf-taskbar-4-new-empty-item.png)
Name란에 _[xterm][xterm]_ 이라고 작성하면 다 쓰기 전에 _Create Launcher XTerm_ 이 펼쳐진다.
클릭 - _Create_
![xf-taskbar-5-xterm](/assets/blog/03-linux-03/xf-taskbar-5-xterm.png)
_Close_
![xf-taskbar-6](/assets/blog/03-linux-03/xf-taskbar-6.png)
xterm 실행
![xterm](/assets/blog/03-linux-03/xterm.png)
- `sudo apt purge apport* whoopsie*` 실행하여 설치된 패키지 제거
- `y` 입력 - 엔터
- `sudo apt autoremove` 실행하여 사용하지 않는 패키지 제거
![apt-purge](/assets/blog/03-linux-03/apt-purge.png)
![apt-autoremove](/assets/blog/03-linux-03/apt-autoremove.png)
[whiskermenu][whiskermenu] - Settings Manager - IBus Preferences
![ibus-setup](/assets/blog/03-linux-03/ibus-setup.png)
Input Method - Add
![ibus-inputmethod-add](/assets/blog/03-linux-03/ibus-inputmethod-add.png)
More... - Korean 검색 - Korean 클릭 - Hangul 선택 - Add
![ibus-more](/assets/blog/03-linux-03/ibus-more.png)
![ibus-hangul](/assets/blog/03-linux-03/ibus-hangul.png)
기존에 있었던 Input Method인 English 선택 - Remove
![ibus-remove-en](/assets/blog/03-linux-03/ibus-remove-en.png)
Close
![ibus-hangul-finished](/assets/blog/03-linux-03/ibus-hangul-finished.png)
whiskermenu - Log Out... - restart
![logout](/assets/blog/03-linux-03/logout.png)
![restart](/assets/blog/03-linux-03/restart.png)
시스템 재시작 후 한글 입력 테스트
![ibus-hangul-test](/assets/blog/03-linux-03/ibus-hangul-test.png)
### [Guest Additions][Guest Additions] 설치
![guest-insert](/assets/blog/03-linux-03/guest-insert.png)
이미지 삽입 후 잠시 기다리면 `/media/xubuntu/VBox_GAs_major.minor.patch` 경로에
[마운트][마운트] 된 내용이 나온다.
![guest-mounted](/assets/blog/03-linux-03/guest-mounted.png)
xterm에서 해당 경로로 이동 -> `./autorun.sh` -> 패스워드 입력
![guest-autorun](/assets/blog/03-linux-03/guest-autorun.png)
근데 바로 설치를 진행할 수 없다.
_sudo apt install [gcc][gcc] [make][make] [perl][perl]_ 로 [의존성][의존성] 패키지
설치를 한 뒤 다시 시도
![guest-dep](/assets/blog/03-linux-03/guest-dep.png)
![guest-inst-gcc-make-perl](/assets/blog/03-linux-03/guest-inst-gcc-make-perl.png)
의존성 패키지 설치가 끝난 뒤 다시 `./autorun.sh` 실행
![guest-autorun-done](/assets/blog/03-linux-03/guest-autorun-done.png)
autorun.sh 절차가 끝나면 `sudo /sbin/rcvboxadd quicksetup all` 실행 후
시스템 재시작
![guest-rcvboxadd](/assets/blog/03-linux-03/guest-rcvboxadd.png)
해상도 제한이 완화되었다.
![vbox-resolution](/assets/blog/03-linux-03/vbox-resolution.png)
### xterm 설정
`.Xresources` 라는 파일명으로 다음 내용을 저장해 놓는다.
```
XTerm.termName: xterm-256color
XTerm*utf8: 1
XTerm*utf8Title: true
XTerm.vt100.locale: true
XTerm.vt100.foreground: white
XTerm.vt100.background: black
*background: rgb:00/00/00
*foreground: rgb:ff/ff/ff
*color0: rgb:00/00/00
*color1: rgb:d3/62/65
*color2: rgb:ae/ce/91
*color3: rgb:e7/e1/8c
*color4: rgb:7a/7a/b0
*color5: rgb:96/3c/59
*color6: rgb:41/81/79
*color7: rgb:be/be/be
*color8: rgb:66/66/66
*color9: rgb:ef/81/71
*color10: rgb:e5/f7/79
*color11: rgb:ff/f7/96
*color12: rgb:41/86/be
*color13: rgb:ef/9e/be
*color14: rgb:71/be/be
*color15: rgb:ff/ff/ff
XTerm.vt100.faceName: Roboto Mono
XTerm.vt100.faceNameDoublesize: Noto Sans Mono CJK KR
XTerm.vt100.faceSize: 12
! disable bold font faces, instead make text light blue.
XTerm.vt100.colorBDMode: true
XTerm.vt100.colorBD: rgb:82/a4/d3
! disable underlined text, instead make it white.
XTerm.vt100.colorULMode: true
XTerm.vt100.colorUL: rgb:e4/e4/e4
XTerm.vt100.metaSendsEscape: true
XTerm*eightBitInput: false
XTerm.vt100.backarrowKey: false
XTerm.ttyModes: erase ^?
Xft.antialias: true
Xft.hinting: true
Xft.rgba: rgb
Xft.autohint: false
Xft.hintstyle: hintslight
Xft.lcdfilter: lcddefault
Xft.embolden: true
XTerm*selectToClipboard: true
xterm*dynamiccolors: true
*VT100*colorMode: on
*VT100*dynamicColors: on
XTerm.vt100.translations: #override \n\
Ctrl <Key> minus: smaller-vt-font() \n\
Ctrl <Key> plus: larger-vt-font() \n\
Ctrl <Key> 0: set-vt-font(d)
XTerm*charClass: 33:48,36-47:48,58-59:48,61:48,63-64:48,95:48,126:48
! Only select text
xterm*highlightSelection: true
! Remove trailing spaces
xterm*trimSelection: true
!If you want your terminal to scroll down anytime you press a key, use this setting:
XTerm*ScrollKey: true
! Do not scroll when there is new input e.g. tail -f /var/syslog
!xterm*scrollTtyOutput: false
XTerm*fullscreen: never
XTerm.vt100.scrollBar: true
xterm*rightScrollBar: true
!XTerm.vt100.scrollbar.width: 8
XTerm*cursorBlink: false
```
가상머신 종료 후 Settings - Network - Adapter 2 탭에서
Attached to: _[Host-only Adapter][Host-only Adapter]_ 선택 - OK - 가상머신 구동
![vbox-adapter](/assets/blog/03-linux-03/vbox-adapter.png)
xterm 실행 - `ip addr` 를 실행해서 방금 추가한 어댑터의 주소를 확인한다.
보통 _enp0s8_ 인터페이스에 `192.168.56.101` 로 할당 받는다.
![xubuntu-ip](/assets/blog/03-linux-03/xubuntu-ip.png)
- `apt search openssh` 로 검색
- `sudo apt install openssh-server` 로 [openssh][openssh] 서버 설치
- `systemctl status sshd` 로 [데몬][데몬] 구동 상태 확인
![apt-inst-sshd](/assets/blog/03-linux-03/apt-inst-sshd.png)
![sys-stat-sshd](/assets/blog/03-linux-03/sys-stat-sshd.png)
Cygwin에서 [scp][scp]로 위에서 저장한 `.Xresources` 파일을 가상머신에 복사해 보도록 한다.
- `scp .Xresources xubuntu@192.168.56.101:~` 실행
![scp](/assets/blog/03-linux-03/scp.png)
복사가 끝나면 가상머신의 xterm에서 `xrdb ~/.Xresources` 를 실행해서 적용
![xrdb](/assets/blog/03-linux-03/xrdb.png)
새 터미널을 시작해서 적용 여부 확인
![xrdb-applied](/assets/blog/03-linux-03/xrdb-applied.png)
현재 .Xresources의 설정에서는 font size는 _Ctrl_ 를 숫자0과 백스페이스 사이에 있는 -기호 또는 +기호를 눌러서 줄이거나 키울 수 있다.
https://invisible-island.net/xterm/manpage/xterm.html
https://stuff.mit.edu/afs/sipb/project/doc/ixresources/xres.html
https://wiki.debian.org/Xresources
xterm 대신 다른 터미널을 쓰려면 _Ctrl Alt t_ 를 눌러서 [xfce4-terminal][xfce4-terminal]
을 실행하면 된다.
![xfce4-terminal](/assets/blog/03-linux-03/xfce4-terminal.png)
또는 리눅스 내부에서 터미널을 쓰는 대신 Cygwin으로 [ssh][ssh] 접속을 할 수도 있다.
- _scp_ 명령과 비슷한 방식으로 `ssh xubuntu@192.168.56.101` 실행
- 패스워드 입력
- `exit` 로 종료
![ssh](/assets/blog/03-linux-03/ssh.png)
---
`ip addr` 은 [iproute2][iproute2]에 포함된 커맨드 중 하나로써 리눅스에서는 [`ifconfig`][`ifconfig`]
대신 사용하는 커맨드이다.
_ifconfig_ 은 [net-tools][net-tools] 프로젝트에 포함된 커맨드인데 [BSD][BSD]에서는
계속 _ifconfig_ 을 기본으로 설정해 놓고 있다.
_Host-only Adapter_ 는 처음에 VirtualBox를 설치할 때 같이 설치되었다.
![/assets/blog/03-linux-03/vbox-inst-2.png](/assets/blog/03-linux-03/vbox-inst-2.png)
![vbox-host](/assets/blog/03-linux-03/vbox-host.png)
### [Advanced Package Tool][Advanced Package Tool]
상단에서 `sudo apt purge apport* whoopsie*` 라는 명령으로 apt를 처음 사용해 보았는데
apt는 [데비안][데비안] 계열에서 채택하고 있는 패키지 매니저이다.
Microsoft의 운영체제에서는 2012년 Windows 8이 나오기 전까지는 주로 [exe][exe]나
[msi][msi]를 확보해서 [프로그램 추가/제거][프로그램 추가/제거]를 수행했는데
이런 방식으로 소프트웨어를 배포하면 [DLL 지옥][DLL 지옥]이라고도 하는
구성요소 손망실 문제가 발생하기 쉽다.
이런 문제로 인해 소프트웨어 배포 및 관리를 체계적으로 수행하는 패키지 매니저가
개발되기 시작했고 APT 외에도 [레드햇][레드햇] 계열에서 사용하는 [yum][yum]과
[dnf][dnf], 아치 계열에서 사용하는 [pacman][pacman] 정도가 널리 알려져 있다.
패키지 매니저가 수행하는 체계적 관리라 함은 소프트웨어 일괄 업데이트, [ELF][ELF] 등
연관 [라이브러리][라이브러리] 탐색/업데이트/제거 등을 자동으로 수행하는 것이다.
최근에는 [AppImage][AppImage]나 [flatpak][flatpak]처럼 플랫폼 독립적인
배포 방식 또한 이용저변을 넓혀가고 있다.
[Google Play Store][Google Play Store]나 Apple [App Store][App Store] 또한 일종의
패키지 매니저라고 할 수 있다.
---
- `apt search midnight` 로 [Midnight Commander][Midnight Commander] 검색
- `sudo apt install mc` 로 해당 패키지 설치
- `mc` 실행
- _F10_ 으로 종료
_apt search 패키지명_ 형식으로 현재 설정된 [저장소][저장소]로부터 내려받아
설치할 수 있는지 확인할 수 있다.
_sudo apt install 패키지명_ 으로는 해당 패키지를 설치할 수 있다.
패키지 설치 직전에 `[Y/n]` 으로 여부를 확인하는데 대문자가 기본 동작으로
지정되어 있기 때문에 `y` 를 입력하지 않고 그대로 엔터를 쳐도 y를 입력한
것과 똑같이 진행한다.
패키지 설치는 시스템을 변경시키는 행위이기 때문에 관리자의 권한이 필요한데,
[sudo][sudo]를 어떤 명령어 앞에 붙여서 실행하면 [최소 권한의 원칙][최소 권한의 원칙]을
유지하면서 시스템에 변동을 줄 수 있다.
원래 sudo를 사용하기 전에 [visudo][visudo]로 sudoer 추가를 해 줘야 하는데
ubuntu에는 해당 설정이 미리 되어 있기 때문에 본 자습서에서는 따로 다루지
않았다.
예시로 설치한 _mc_ 는 [ncurses][ncurses] 기반 파일탐색기이다.
![mc-1](/assets/blog/03-linux-03/mc-1.png)
![mc-2](/assets/blog/03-linux-03/mc-2.png)
![mc-3](/assets/blog/03-linux-03/mc-3.png)
필요에 따라서 `sudo apt install gcc make perl` 처럼 여러 패키지를 한꺼번에
설치할 수도 있다.
{/*
repo 설정
PS1
mv/rm _._ / touch {1..5}
mv . - cd로 이동하지 않고 타겟을 현재 디렉토리로 이동하는 방법
스크립트
bash프롬프트 - export, PATH 등
source
sha
ps / top
ip / ss nmcli / dig
nginx -s / hosts
systemctl
mount
dd
git
mc / ncdu / cmus
users
who
vm2(bind9) - ubuntu server -> Windows host - DNS query
ddns-confgen
*/}
{/* https://www.gnu.org/gnu/gnu-linux-faq.html#whyslash */}
[qBittorrent]: https://www.qbittorrent.org/download.php
[Xubuntu]: https://xubuntu.org/download/
[curl]: https://curl.se/docs/manual.html
[서드파티]: https://wiki.ubuntu.com/ThirdPartyPackages "Third-party"
[LTS]: https://en.wikipedia.org/wiki/Long-term_support "Long-term support"
[코드네임]: https://en.wikipedia.org/wiki/Code_name "Code name"
[xfce]: https://en.wikipedia.org/wiki/Xfce
[리눅스 배포판]: https://en.wikipedia.org/wiki/Linux_distribution "Linux distribution"
[Nautilus]: https://en.wikipedia.org/wiki/GNOME_Files
[spindle]: https://en.wikipedia.org/wiki/Hard_disk_drive#Spindle "스핀들"
[하이퍼바이저]: https://en.wikipedia.org/wiki/Hypervisor "Hypervisor"
[QEMU]: https://en.wikipedia.org/wiki/QEMU
[virt-manager]: https://en.wikipedia.org/wiki/Virtual_Machine_Manager "Virtual Machine Manager"
[아키텍처]: https://en.wikipedia.org/wiki/Computer_architecture "Computer Architecture"
[프로세서]: https://en.wikipedia.org/wiki/Processor_(computing) "Processor"
[디스플레이 서버]: https://en.wikipedia.org/wiki/Windowing_system#Display_server "Display Server"
[패키지 매니저]: https://en.wikipedia.org/wiki/Package_manager "Package Manager"
[컨테이너]: https://en.wikipedia.org/wiki/Containerization_(computing)
[RAID]: https://en.wikipedia.org/wiki/RAID "레이드"
[부트로더]: https://en.wikipedia.org/wiki/Bootloader "Bootloader"
[sysctl]: https://en.wikipedia.org/wiki/Sysctl
[WSLg]: https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux#WSLg "Windows Subsystem for Linux GUI"
[VcXsrv]: https://sourceforge.net/projects/vcxsrv/
[세션 관리자]: https://en.wikipedia.org/wiki/Session_(computer_science)#Desktop_session_management
[xterm]: https://en.wikipedia.org/wiki/Xterm
[whiskermenu]: https://docs.xfce.org/panel-plugins/xfce4-whiskermenu-plugin/start
[Guest Additions]: https://www.virtualbox.org/manual/ch04.html
[마운트]: https://en.wikipedia.org/wiki/Mount_(computing) "mount"
[gcc]: https://en.wikipedia.org/wiki/GNU_Compiler_Collection "GNU Compiler Collection"
[make]: https://en.wikipedia.org/wiki/Make_(software)
[perl]: https://en.wikipedia.org/wiki/Perl
[의존성]: https://en.wikipedia.org/wiki/Coupling_(computer_programming) "커플링"
[Host-only Adapter]: https://www.virtualbox.org/manual/ch06.html#network_hostonly
[openssh]: https://en.wikipedia.org/wiki/OpenSSH
[데몬]: https://en.wikipedia.org/wiki/Daemon_(computing) "Daemon"
[scp]: https://en.wikipedia.org/wiki/Secure_copy_protocol "Secure copy protocol"
[iproute2]: https://en.wikipedia.org/wiki/Iproute2
[`ifconfig`]: https://en.wikipedia.org/wiki/Ifconfig "interface config"
[net-tools]: https://wiki.linuxfoundation.org/networking/net-tools
[BSD]: https://en.wikipedia.org/wiki/Berkeley_Software_Distribution "Berkeley Software Distribution"
[Advanced Package Tool]: https://en.wikipedia.org/wiki/APT_(software) "APT"
[xfce4-terminal]: https://docs.xfce.org/apps/xfce4-terminal
[ssh]: https://en.wikipedia.org/wiki/Secure_Shell "Secure Shell"
[데비안]: https://en.wikipedia.org/wiki/Debian#APT_tools "Debian"
[exe]: https://en.wikipedia.org/wiki/.exe
[msi]: https://en.wikipedia.org/wiki/Windows_Installer "Windows Installer"
[프로그램 추가/제거]: https://en.wikipedia.org/wiki/Control_Panel_(Windows)#Standard_applets "appwiz.cpl"
[DLL 지옥]: https://en.wikipedia.org/wiki/DLL_Hell "DLL Hell"
[레드햇]: https://en.wikipedia.org/wiki/Red_Hat_Enterprise_Linux "RHEL"
[yum]: https://en.wikipedia.org/wiki/Yum_(software)
[dnf]: https://en.wikipedia.org/wiki/DNF_(software)
[pacman]: https://en.wikipedia.org/wiki/Arch_Linux#Pacman
[ELF]: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format"
[라이브러리]: https://en.wikipedia.org/wiki/Library_(computing) "Library"
[AppImage]: https://en.wikipedia.org/wiki/AppImage
[flatpak]: https://en.wikipedia.org/wiki/Flatpak
[Google Play Store]: https://en.wikipedia.org/wiki/Google_Play "구글 플레이"
[App Store]: https://en.wikipedia.org/wiki/App_Store_(iOS/iPadOS) "앱스토어"
[Midnight Commander]: https://en.wikipedia.org/wiki/Midnight_Commander
[저장소]: https://en.wikipedia.org/wiki/Software_repository "Software Repository"
[sudo]: https://en.wikipedia.org/wiki/Sudo "substitute user, do"
[최소 권한의 원칙]: https://en.wikipedia.org/wiki/Principle_of_least_privilege "Principle Of Least Privilege"
[visudo]: https://www.sudo.ws/docs/man/visudo.man/
[ncurses]: https://en.wikipedia.org/wiki/Ncurses "new curses"

298
blog/2023-02-11-linux-04.md Normal file
View file

@ -0,0 +1,298 @@
---
title: "리눅스 사용 part 2 (작성 중)"
description: ""
image: "/assets/blog/04-linux-04/NetworkTopologies.svg"
authors: [bitdori]
---
## [World Wide Web][World Wide Web]
_192.168.56.101_ 로 접속을 시도해 보면 들어갈 수 없을 것이다.
![conn-refused](/assets/blog/04-linux-04/conn-refused.png)
해당 주소는 `ip addr` 실행 후 _enp0s8_ 인터페이스에 할당 받은 주소이다.
![xubuntu-ip](/assets/blog/03-linux-03/xubuntu-ip.png)
- `sudo apt install nginx` 로 [nginx][nginx] 설치
![nginx](/assets/blog/04-linux-04/nginx.png)
- `systemctl status nginx`_Active_ 상태 확인
- `q` 를 눌러 종료한다.
- 다시 _192.168.56.101_ 로 접속을 시도
- nginx 환영 페이지 확인
![nginx-welcome](/assets/blog/04-linux-04/nginx-welcome.png)
웹브라우저에서 `example.tld` 라는 주소로 접속을 시도하면 들어갈 수 없을 것이다.
![example-not-resolved](/assets/blog/04-linux-04/example-not-resolved.png)
- Windows 탐색기에서 `%windir%\system32\drivers\etc` 로 이동
- _hosts_ 를 복사해서 백업본을 만들고 관리자 권한으로 원본 [hosts][hosts]를 연다
- `192.168.56.101 example.tld` 를 추가한 뒤 저장
![hosts](/assets/blog/04-linux-04/hosts.png)
- 웹브라우저에서 다시 `example.tld` 탐색
_192.168.56.101_ 로 접속 했을 때 나오던 nginx 환영페이지를 볼 수 있다.
같은 주소로 접속 했다는 것을 확인하기 위해 `tail -f /var/log/nginx/access.log`
로 파일 내용을 감시해 놓으면 페이지 새로고침을 할 때 마다 새로운 내용이
기록되는 것을 확인할 수 있다.
![nginx-welcome-hosts](/assets/blog/04-linux-04/nginx-welcome-hosts.png)
### [Domain Name System][Domain Name System]
예를 들어 `173.239.79.196` 이라는 주소로 웹브라우저에서 접속을 시도하면
https://www.eff.org/ 라는 주소로 변환돼서 들어간다.
![eff](/assets/blog/04-linux-04/eff.png)
어떤 [클라이언트][클라이언트]에서 웹사이트 접속을 시도하면 맨 처음에는
1. 웹브라우저의 cache를 탐색해 보고 이전 방문 기록이 없는 경우
2. 해당 시스템의 _hosts_ 파일에서 어느 [도메인][도메인]이 어느 IP 주소로 연결되어 있는지
확인
3. _hosts_ 파일에도 해당 내용이 없으면 현재 가입 중인 [ISP][ISP]에게 질의를 보낸다
4. ISP의 cache에도 해당 도메인에 대한 정보가 없으면 [TLD][TLD] 종류에 따라서 ccTLD인 경우
[ICANN][ICANN] 산하 기관이 지정한 국가 DNS 서버로 (한국은 [KRNIC][KRNIC]),
gTLD인 경우 [루트 네임 서버][루트 네임 서버]로 질의를 보낸다
5. 루트 네임 서버에 질의가 들어오면 TLD 네임 서버로 질의를 돌린다
6. TLD 네임 서버는 [Domain name registrar][Domain name registrar] 등 다시금
접속하고자 하는 도메인의 네임 서버로 질의를 돌린다
7. 이곳 [zone 파일][zone 파일]에 목적지 IP 주소가 저장되어 있다면 결과를 보여주고
해당 목적지에서 개별적으로 DNS 서버를 운영하고 있다면 다시 한 번 더 질의를 그쪽으로
보내서 zone 파일을 탐색한 뒤 [A 레코드][A 레코드]에 지정된 주소의 결과를 보여준다.
8. 성공적으로 접속을 하면 다음 번 질의를 할 때 트래픽 낭비 없이 더 빨리 응답하기 위해
클라이언트의 브라우저와 ISP에는 해당 도메인-IP 짝을 저장해 놓는다.
![Example_of_an_iterative_DNS_resolver](/assets/blog/04-linux-04/Example_of_an_iterative_DNS_resolver.svg)
![DNS_Architecture](/assets/blog/04-linux-04/DNS_Architecture.svg)
이처럼 각 웹사이트는 원래 숫자로 이루어진 IP 주소로 서비스가 이루어지고 있지만
사람이 더 쉽게 식별할 수 있도록 숫자가 아닌 문자열을 입력하면 그 주소에 할당된
IP 주소로 매칭시키도록 _Domain Name System_ 이라는 체계로 구현하고 있다.
- 참고로 [IPv6][IPv6]는 [옥텟][옥텟] 내에 _abcd_ 와 같은 문자열이 끼어 있는 것처럼
보일 수도 있는데 이는 [16진수][16진수] 숫자이다.
위에서 `%windir%\system32\drivers\etc\hosts` 에 직접 _example.tld_ 라는
도메인으로 원하는 주소를 넣었고 해당 DNS query는 이 단계에서 끝이 난다.
하지만 hosts 파일은 관리자 권한으로 다뤄지는 파일인데 왜냐하면 이 파일이 사이트를 잘못
가리키면 잘못된 결과가 나오기 때문이다.
_192.168.56.101_ 대신 `173.239.79.196` 으로 변경하고 `example.tld` 로 접속해 보면
아까 확인했던 nginx 환영 페이지가 아니라 https://www.eff.org/ 로 연결이 된다.
![hosts-forgery](/assets/blog/04-linux-04/hosts-forgery.png)
- `%windir%\system32\drivers\etc\hosts` 에 지금까지 변경한 내용을 지우고
이전 상태로 되돌린다.
이러한 주의사항으로 인해 각종 보안 프로그램에서 hosts 변조를 감지하는 기능을
내장하고 있다.
### DNS 서버 구축 (작성 중)
DNS 서버를 자체적으로 구축하면 _hosts_ 를 그대로 둔 채 도메인과 IP 짝을
원하는대로 묶을 수 있다.
- https://mirror.kakao.com/ubuntu-releases/jammy/ 또는 https://releases.ubuntu.com/jammy/
에서 _live-server-amd64.iso.torrent_ 를 다운로드
![ubuntu-server-torrent](/assets/blog/04-linux-04/ubuntu-server-torrent.png)
![ubuntu-server-torrent-downloading](/assets/blog/04-linux-04/ubuntu-server-torrent-downloading.png)
---
_다운로드 하는 동안 볼 내용_
- [BIND][BIND]를 설치해서 DNS query에 응답만 해 주도록 단순하게 구성할 것이기
때문에 X가 없는 서버 버전을 설치한다.
- 우분투 서버 버전은 X를 제외시킨 경량 버전이기 때문에 마우스 포인터를 사용하지
않는다. 나중에라도 [데스크탑 환경][데스크탑 환경]을 설치하면 마우스 포인터를
인식할 수 있다.
- 우분투처럼 유명한 리눅스 배포본은 torrent를 이용하든 말든 본인에게 가장 손쉬운
방법으로 프로그램을 획득하면 되지만 [AlmaLinux][AlmaLinux]처럼 배포본 개발을
시작한지 오래되지 않은 프로젝트에 대해서는 torrent로 트래픽을 절감해주면
프로젝트 자원봉사자의 운영 부담을 덜어줄 수 있다.
- 리눅스는 서로 다른 개발주체의 소프트웨어를 결합한 것이기 때문에 필요한
프로그램을 찾아서 설치하고 관리하는 비용이 MS 운영체제 대비 낮다고 할 수 없으나
그만큼 운영체제 내에서 각 프로그램 간 결합도가 느슨한 편이어서 [커널][커널]
업데이트를 하지 않는 이상 [유저 랜드][유저 랜드] 소프트웨어에 몇몇 사소한 변경사항이
생긴 것만으로는 시스템 재시작을 하지 않아도 된다.
필수 재부팅 상황이 더 적기 때문에 구동 중인 프로그램의 규모가 작을수록
[고가용성][고가용성] 운용을 할 수 있다.
---
live-server iso 다운로드가 끝나면 VirtualBox에 설치한다.
![vbox-ubt-serv-inst-01](/assets/blog/04-linux-04/vbox-ubt-serv-inst-01.png)
![vbox-ubt-serv-inst-02](/assets/blog/04-linux-04/vbox-ubt-serv-inst-02.png)
![vbox-ubt-serv-inst-03](/assets/blog/04-linux-04/vbox-ubt-serv-inst-03.png)
![vbox-ubt-serv-inst-04](/assets/blog/04-linux-04/vbox-ubt-serv-inst-04.png)
![vbox-ubt-serv-inst-05](/assets/blog/04-linux-04/vbox-ubt-serv-inst-05.png)
![vbox-ubt-serv-inst-06](/assets/blog/04-linux-04/vbox-ubt-serv-inst-06.png)
![vbox-ubt-serv-inst-07](/assets/blog/04-linux-04/vbox-ubt-serv-inst-07.png)
![vbox-ubt-serv-inst-08](/assets/blog/04-linux-04/vbox-ubt-serv-inst-08.png)
![vbox-ubt-serv-inst-09](/assets/blog/04-linux-04/vbox-ubt-serv-inst-09.png)
`Update to the new installer` 가 나오지 않으면 필수사항이 아니기 때문에 그대로 진행하면
된다.
![vbox-ubt-serv-inst-10](/assets/blog/04-linux-04/vbox-ubt-serv-inst-10.png)
![vbox-ubt-serv-inst-11](/assets/blog/04-linux-04/vbox-ubt-serv-inst-11.png)
![vbox-ubt-serv-inst-12](/assets/blog/04-linux-04/vbox-ubt-serv-inst-12.png)
_Search for third-party drivers_ 도 필수사항은 아니다.
![vbox-ubt-serv-inst-13](/assets/blog/04-linux-04/vbox-ubt-serv-inst-13.png)
_enp0s8_ 인터페이스에 할당된 IP 주소를 사용하게 될 것이다.
![vbox-ubt-serv-inst-14](/assets/blog/04-linux-04/vbox-ubt-serv-inst-14.png)
![vbox-ubt-serv-inst-15](/assets/blog/04-linux-04/vbox-ubt-serv-inst-15.png)
![vbox-ubt-serv-inst-16](/assets/blog/04-linux-04/vbox-ubt-serv-inst-16.png)
[LVM][LVM] 구성에 대한 안내를 보여준다.
![vbox-ubt-serv-inst-17](/assets/blog/04-linux-04/vbox-ubt-serv-inst-17.png)
![vbox-ubt-serv-inst-18](/assets/blog/04-linux-04/vbox-ubt-serv-inst-18.png)
[디스크 파티션][디스크 파티션] 레이아웃을 확정한 뒤에는 되돌릴 수 없다는 경고가 나온다.
가상머신 내에서는 실수를 하더라도 [호스트][호스트]에 영향을 주지 않는다는 점이
편리하다고 할 수 있다.
_Continue_ 하여 계속 진행한다.
![vbox-ubt-serv-inst-19](/assets/blog/04-linux-04/vbox-ubt-serv-inst-19.png)
![vbox-ubt-serv-inst-20](/assets/blog/04-linux-04/vbox-ubt-serv-inst-20.png)
원격접속을 받기 위해서 _Install OpenSSH server_ 체크
이 단계에서 실수로 sshd 설치를 하지 않고 넘겨버렸어도 운영체제 설치가 끝난 뒤에
`sudo apt install openssh-server` 를 설치하면 된다.
![vbox-ubt-serv-inst-21](/assets/blog/04-linux-04/vbox-ubt-serv-inst-21.png)
![vbox-ubt-serv-inst-22](/assets/blog/04-linux-04/vbox-ubt-serv-inst-22.png)
[오케스트레이션][오케스트레이션], [RDBMS][RDBMS] 툴 등을 사전 설치할 것인지
보여주고 있는데 아무 것도 선택하지 않아도 된다.
![vbox-ubt-serv-inst-23](/assets/blog/04-linux-04/vbox-ubt-serv-inst-23.png)
![vbox-ubt-serv-inst-24](/assets/blog/04-linux-04/vbox-ubt-serv-inst-24.png)
모든 작업이 끝난 뒤 `Reboot Now` 메세지에 엔터를 쳐서 재부팅을 한다.
![vbox-ubt-serv-inst-25](/assets/blog/04-linux-04/vbox-ubt-serv-inst-25.png)
만약 재부팅이 안 되고 `Please remove the installation medium, then press ENTER:`
라고 표시가 된다면 상단 `Machine` 메뉴에서 `Reset` 을 누르면 된다.
![vbox-ubt-serv-inst-26](/assets/blog/04-linux-04/vbox-ubt-serv-inst-26.png)
![vbox-ubt-serv-inst-27](/assets/blog/04-linux-04/vbox-ubt-serv-inst-27.png)
재부팅이 끝나면 화면에 나온 메세지를 밀어내기 위해서 엔터를 누른 뒤 로그인을 한다.
![vbox-ubt-serv-1](/assets/blog/04-linux-04/vbox-ubt-serv-1.png)
`ip addr` 를 실행하면 설치할 때 _enp0s8_ [NIC][NIC]로 할당됐던 IP 주소가 나온다.
xubuntu에 이어서 두 번째 Host-only Adapter를 사용했기 때문에 `192.168.56.102`
들어가 있을 것이다.
![vbox-ubt-serv-2](/assets/blog/04-linux-04/vbox-ubt-serv-2.png)
모든 작업을 [리눅스 프레임버퍼][리눅스 프레임버퍼] 내에서 처리할 수 있지만
마우스 포인터로 복사/붙여넣기를 하고 싶다면 Cygwin에서 ssh로 원격접속을 하면 된다.
- `systemctl status sshd` 로 ssh 서버 구동상태 확인
- Cygwin에서 `ssh ubuntu-server@192.168.56.102` 로 접속
![vbox-ubt-serv-3](/assets/blog/04-linux-04/vbox-ubt-serv-3.png)
![vbox-ubt-serv-4](/assets/blog/04-linux-04/vbox-ubt-serv-4.png)
- `sudo shutdown -h now` 로 우분투 서버 종료
![shutdown](/assets/blog/04-linux-04/shutdown.png)
X가 없는 [로그인 매니저][로그인 매니저]에서는 마우스 포인터로 시스템을 끌 수 없고
[shutdown][shutdown] 커맨드로 끄면 된다.
---
- 다시 가상머신 시작
- `sudo apt install bind9`
- `systemctl status named` 로 서비스 상태 확인
- `cd /etc/bind`
- `ls -l`
![bind9-inst](/assets/blog/04-linux-04/bind9-inst.png)
![bind9-status](/assets/blog/04-linux-04/bind9-status.png)
![bind9-path](/assets/blog/04-linux-04/bind9-path.png)
- `cd /var/lib/bind`
- `sudo cp /etc/bind/db.local default-zone-data`
- `sudo vi default-zone-data`
- 다음과 같이 작성한다
```
$TTL 1h
@ IN SOA ns.example.tld. root.example.tld. (
2023021401 ; Serial
1h ; Refresh
1h ; Retry
1w ; Expire
1h ) ; Negative Cache TTL
;
NS ns.example.tld.
ns A 192.168.56.102
@ IN AAAA ::1
```
![bind-zone-default](/assets/blog/04-linux-04/bind-zone-default.png)
- `sudo vi /var/lib/bind/zone-example.tld`
```
$INCLUDE /var/lib/bind/default-zone-data
example.tld. IN A 192.168.56.101
```
![bind-zone-example](/assets/blog/04-linux-04/bind-zone-example.png)
- $[TTL][TTL]과 Refresh 값을 줄인다
`vi /etc/bind/named.conf` 에서 `named.conf.options`, `named.conf.local`,
`named.conf.default-zones` 를 포함하고 있다.
![bind-named-conf](/assets/blog/04-linux-04/bind-named-conf.png)
{/* ![bind-named-conf-options](/assets/blog/04-linux-04/bind-named-conf-options.png)
![bind-named-conf-local](/assets/blog/04-linux-04/bind-named-conf-local.png) */}
![dns-browser](/assets/blog/04-linux-04/dns-browser.png)
![mdns](/assets/blog/04-linux-04/mdns.png)
https://answers.microsoft.com/en-us/windows/forum/all/how-to-force-windows-10-to-use-dns/5b80e376-fa6a-4c6e-b59d-5eb5ec65c26d
![dns-preferred](/assets/blog/04-linux-04/dns-preferred.png)
![dns-flush](/assets/blog/04-linux-04/dns-flush.png)
![vbox-start-dns-and-web](/assets/blog/04-linux-04/vbox-start-dns-and-web.png)
[World Wide Web]: https://en.wikipedia.org/wiki/World_Wide_Web "www"
[nginx]: https://nginx.org/en/linux_packages.html#Ubuntu
[hosts]: https://en.wikipedia.org/wiki/Hosts_(file)
[Domain Name System]: https://en.wikipedia.org/wiki/Domain_Name_System "DNS"
[클라이언트]: https://en.wikipedia.org/wiki/Client_(computing) "Client"
[도메인]: https://en.wikipedia.org/wiki/Domain_name "Domain Name"
[ISP]: https://en.wikipedia.org/wiki/Internet_service_provider "Internet Service Provider"
[TLD]: https://en.wikipedia.org/wiki/Top-level_domain "Top-level Domain"
[ICANN]: https://en.wikipedia.org/wiki/ICANN
[KRNIC]: https://www.krnic.or.kr/jsp/resources/dns/dnsInfo.jsp
[루트 네임 서버]: https://en.wikipedia.org/wiki/Root_name_server "Root Name Server"
[Domain name registrar]: https://en.wikipedia.org/wiki/Domain_name_registrar
[zone 파일]: https://en.wikipedia.org/wiki/Zone_file "Zone File"
[A 레코드]: https://en.wikipedia.org/wiki/List_of_DNS_record_types "DNS 레코드 타입 목록"
[IPv6]: https://en.wikipedia.org/wiki/IPv6
[옥텟]: https://en.wikipedia.org/wiki/Octet_(computing) "Octet"
[16진수]: https://en.wikipedia.org/wiki/Hexadecimal "Hexadecimal"
[BIND]: https://en.wikipedia.org/wiki/BIND "Berkeley Internet Name Domain"
[데스크탑 환경]: https://en.wikipedia.org/wiki/Desktop_environment "Desktop Environment"
[AlmaLinux]: https://en.wikipedia.org/wiki/AlmaLinux
[커널]: https://en.wikipedia.org/wiki/Kernel_(operating_system) "Kernel"
[유저 랜드]: https://en.wikipedia.org/wiki/User_space_and_kernel_space "User space and kernel space"
[고가용성]: https://en.wikipedia.org/wiki/High_availability "High availability"
[LVM]: https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) "Logical volume manager"
[디스크 파티션]: https://en.wikipedia.org/wiki/Disk_partitioning "Disk partitioning"
[호스트]: https://en.wikipedia.org/wiki/Host_(network) "Host"
[오케스트레이션]: https://en.wikipedia.org/wiki/Orchestration_(computing) "Orchestration"
[RDBMS]: https://en.wikipedia.org/wiki/Relational_database#RDBMS
[NIC]: https://en.wikipedia.org/wiki/Network_interface_controller "Network interface controller"
[리눅스 프레임버퍼]: https://en.wikipedia.org/wiki/Linux_framebuffer "Linux framebuffer"
[로그인 매니저]: https://en.wikipedia.org/wiki/Login_manager "Login manager"
[shutdown]: https://www.freedesktop.org/software/systemd/man/shutdown.html# "shutdown(8)"
[TTL]: https://en.wikipedia.org/wiki/Time_to_live "Time to live"

5
blog/authors.yml Normal file
View file

@ -0,0 +1,5 @@
bitdori:
name: bitdori
title: admin
url: https://bitdori.org
image_url: '/assets/blog/authors/Betta_half_moon.jpg'