Skip to main content

리눅스 사용 part 2 (작성 중)

· 11 min read
bitdori
admin

World Wide Web

192.168.56.101 로 접속을 시도해 보면 들어갈 수 없을 것이다. conn-refused

해당 주소는 ip addr 실행 후 enp0s8 인터페이스에 할당 받은 주소이다. xubuntu-ip

  • sudo apt install nginxnginx 설치 nginx
  • systemctl status nginxActive 상태 확인
  • q 를 눌러 종료한다.
  • 다시 192.168.56.101 로 접속을 시도
  • nginx 환영 페이지 확인 nginx-welcome

웹브라우저에서 example.tld 라는 주소로 접속을 시도하면 들어갈 수 없을 것이다. example-not-resolved

  • Windows 탐색기에서 %windir%\system32\drivers\etc 로 이동
  • hosts 를 복사해서 백업본을 만들고 관리자 권한으로 원본 hosts를 연다
  • 192.168.56.101 example.tld 를 추가한 뒤 저장 hosts
  • 웹브라우저에서 다시 example.tld 탐색

192.168.56.101 로 접속 했을 때 나오던 nginx 환영페이지를 볼 수 있다.

같은 주소로 접속 했다는 것을 확인하기 위해 tail -f /var/log/nginx/access.log 로 파일 내용을 감시해 놓으면 페이지 새로고침을 할 때 마다 새로운 내용이 기록되는 것을 확인할 수 있다. nginx-welcome-hosts

Domain Name System

예를 들어 173.239.79.196 이라는 주소로 웹브라우저에서 접속을 시도하면 https://www.eff.org/ 라는 주소로 변환돼서 들어간다. eff

어떤 클라이언트에서 웹사이트 접속을 시도하면 맨 처음에는

  1. 웹브라우저의 cache를 탐색해 보고 이전 방문 기록이 없는 경우
  2. 해당 시스템의 hosts 파일에서 어느 도메인이 어느 IP 주소로 연결되어 있는지 확인
  3. hosts 파일에도 해당 내용이 없으면 현재 가입 중인 ISP에게 질의를 보낸다
  4. ISP의 cache에도 해당 도메인에 대한 정보가 없으면 TLD 종류에 따라서 ccTLD인 경우 ICANN 산하 기관이 지정한 국가 DNS 서버로 (한국은 KRNIC), gTLD인 경우 루트 네임 서버로 질의를 보낸다
  5. 루트 네임 서버에 질의가 들어오면 TLD 네임 서버로 질의를 돌린다
  6. TLD 네임 서버는 Domain name registrar 등 다시금 접속하고자 하는 도메인의 네임 서버로 질의를 돌린다
  7. 이곳 zone 파일에 목적지 IP 주소가 저장되어 있다면 결과를 보여주고 해당 목적지에서 개별적으로 DNS 서버를 운영하고 있다면 다시 한 번 더 질의를 그쪽으로 보내서 zone 파일을 탐색한 뒤 A 레코드에 지정된 주소의 결과를 보여준다.
  8. 성공적으로 접속을 하면 다음 번 질의를 할 때 트래픽 낭비 없이 더 빨리 응답하기 위해 클라이언트의 브라우저와 ISP에는 해당 도메인-IP 짝을 저장해 놓는다.

Example_of_an_iterative_DNS_resolver DNS_Architecture

이처럼 각 웹사이트는 원래 숫자로 이루어진 IP 주소로 서비스가 이루어지고 있지만 사람이 더 쉽게 식별할 수 있도록 숫자가 아닌 문자열을 입력하면 그 주소에 할당된 IP 주소로 매칭시키도록 Domain Name System 이라는 체계로 구현하고 있다.

  • 참고로 IPv6옥텟 내에 abcd 와 같은 문자열이 끼어 있는 것처럼 보일 수도 있는데 이는 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

  • %windir%\system32\drivers\etc\hosts 에 지금까지 변경한 내용을 지우고 이전 상태로 되돌린다.

이러한 주의사항으로 인해 각종 보안 프로그램에서 hosts 변조를 감지하는 기능을 내장하고 있다.

DNS 서버 구축 (작성 중)

DNS 서버를 자체적으로 구축하면 hosts 를 그대로 둔 채 도메인과 IP 짝을 원하는대로 묶을 수 있다.


다운로드 하는 동안 볼 내용

  • BIND를 설치해서 DNS query에 응답만 해 주도록 단순하게 구성할 것이기 때문에 X가 없는 서버 버전을 설치한다.
  • 우분투 서버 버전은 X를 제외시킨 경량 버전이기 때문에 마우스 포인터를 사용하지 않는다. 나중에라도 데스크탑 환경을 설치하면 마우스 포인터를 인식할 수 있다.
  • 우분투처럼 유명한 리눅스 배포본은 torrent를 이용하든 말든 본인에게 가장 손쉬운 방법으로 프로그램을 획득하면 되지만 AlmaLinux처럼 배포본 개발을 시작한지 오래되지 않은 프로젝트에 대해서는 torrent로 트래픽을 절감해주면 프로젝트 자원봉사자의 운영 부담을 덜어줄 수 있다.
  • 리눅스는 서로 다른 개발주체의 소프트웨어를 결합한 것이기 때문에 필요한 프로그램을 찾아서 설치하고 관리하는 비용이 MS 운영체제 대비 낮다고 할 수 없으나 그만큼 운영체제 내에서 각 프로그램 간 결합도가 느슨한 편이어서 커널 업데이트를 하지 않는 이상 유저 랜드 소프트웨어에 몇몇 사소한 변경사항이 생긴 것만으로는 시스템 재시작을 하지 않아도 된다. 필수 재부팅 상황이 더 적기 때문에 구동 중인 프로그램의 규모가 작을수록 고가용성 운용을 할 수 있다.

live-server iso 다운로드가 끝나면 VirtualBox에 설치한다.

vbox-ubt-serv-inst-01 vbox-ubt-serv-inst-02 vbox-ubt-serv-inst-03 vbox-ubt-serv-inst-04 vbox-ubt-serv-inst-05 vbox-ubt-serv-inst-06 vbox-ubt-serv-inst-07 vbox-ubt-serv-inst-08 vbox-ubt-serv-inst-09

Update to the new installer 가 나오지 않으면 필수사항이 아니기 때문에 그대로 진행하면 된다. vbox-ubt-serv-inst-10 vbox-ubt-serv-inst-11 vbox-ubt-serv-inst-12

Search for third-party drivers 도 필수사항은 아니다. vbox-ubt-serv-inst-13

enp0s8 인터페이스에 할당된 IP 주소를 사용하게 될 것이다. vbox-ubt-serv-inst-14 vbox-ubt-serv-inst-15 vbox-ubt-serv-inst-16

LVM 구성에 대한 안내를 보여준다. vbox-ubt-serv-inst-17 vbox-ubt-serv-inst-18

디스크 파티션 레이아웃을 확정한 뒤에는 되돌릴 수 없다는 경고가 나온다.

가상머신 내에서는 실수를 하더라도 호스트에 영향을 주지 않는다는 점이 편리하다고 할 수 있다.

Continue 하여 계속 진행한다. vbox-ubt-serv-inst-19 vbox-ubt-serv-inst-20

원격접속을 받기 위해서 Install OpenSSH server 체크

이 단계에서 실수로 sshd 설치를 하지 않고 넘겨버렸어도 운영체제 설치가 끝난 뒤에 sudo apt install openssh-server 를 설치하면 된다. vbox-ubt-serv-inst-21 vbox-ubt-serv-inst-22

오케스트레이션, RDBMS 툴 등을 사전 설치할 것인지 보여주고 있는데 아무 것도 선택하지 않아도 된다. vbox-ubt-serv-inst-23 vbox-ubt-serv-inst-24

모든 작업이 끝난 뒤 Reboot Now 메세지에 엔터를 쳐서 재부팅을 한다. vbox-ubt-serv-inst-25

만약 재부팅이 안 되고 Please remove the installation medium, then press ENTER: 라고 표시가 된다면 상단 Machine 메뉴에서 Reset 을 누르면 된다. vbox-ubt-serv-inst-26 vbox-ubt-serv-inst-27

재부팅이 끝나면 화면에 나온 메세지를 밀어내기 위해서 엔터를 누른 뒤 로그인을 한다. vbox-ubt-serv-1

ip addr 를 실행하면 설치할 때 enp0s8 NIC로 할당됐던 IP 주소가 나온다.

xubuntu에 이어서 두 번째 Host-only Adapter를 사용했기 때문에 192.168.56.102 가 들어가 있을 것이다.

vbox-ubt-serv-2

모든 작업을 리눅스 프레임버퍼 내에서 처리할 수 있지만 마우스 포인터로 복사/붙여넣기를 하고 싶다면 Cygwin에서 ssh로 원격접속을 하면 된다.

  • systemctl status sshd 로 ssh 서버 구동상태 확인
  • Cygwin에서 ssh ubuntu-server@192.168.56.102 로 접속

vbox-ubt-serv-3 vbox-ubt-serv-4

  • sudo shutdown -h now 로 우분투 서버 종료 shutdown

X가 없는 로그인 매니저에서는 마우스 포인터로 시스템을 끌 수 없고 shutdown 커맨드로 끄면 된다.


  • 다시 가상머신 시작
  • sudo apt install bind9
  • systemctl status named 로 서비스 상태 확인
  • cd /etc/bind
  • ls -l

bind9-inst bind9-status bind9-path

  • 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

  • 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

  • $TTL과 Refresh 값을 줄인다

vi /etc/bind/named.conf 에서 named.conf.options, named.conf.local, named.conf.default-zones 를 포함하고 있다. bind-named-conf

dns-browser

mdns https://answers.microsoft.com/en-us/windows/forum/all/how-to-force-windows-10-to-use-dns/5b80e376-fa6a-4c6e-b59d-5eb5ec65c26d dns-preferred dns-flush vbox-start-dns-and-web

리눅스 사용 - 가상머신

· 15 min read
bitdori
admin

xubuntu-torrent

다운로드 한 .torrent 파일을 더블클릭하여 iso 파일 다운로드

xubuntu-downloading

Xubuntu를 다운로드 하는 동안 https://www.virtualbox.org/wiki/Downloads 접속

virtualbox-org

Windows hosts 를 클릭하면 다운로드가 진행되지만 이번에는 curl로 다운로드를 해 보기 위해 주소를 복사하기만 한다.

  • Cygwin 실행 - cd 로 다운로드 할 경로로 이동
  • curl -O 까지 입력한 뒤 우클릭 - Paste를 하여 복사해 둔 VirtualBox 주소 붙여넣기
  • 실행

curl-O curl-downloading

다운로드가 끝나면 VirtualBox 설치 vbox-inst-1 vbox-inst-2 vbox-inst-3 vbox-inst-4 vbox-inst-5

qBittorrent에서 Progress가 100%이면서 상태가 Seeding이면 Xubuntu 다운로드가 끝난 것이다.

항목을 우클릭해서 다운로드 대상 폴더를 확인

xubuntu-downloaded

VirtualBox 실행 - New vbox-new

이름란에 xubuntu 입력 - ISO 이미지에 토렌트로 받았던 이미지를 선택

Skip Unattended Installation 체크

vbox-create

프로세서는 초록색 범위 내에서 선택

vbox-create-hardware

시스템 전체에서 남는 공간 중 xubuntu 가상머신에 할당할 크기 지정 - Next - Finish

vbox-create-harddisk

설정

vbox-settings

디스플레이에서 비디오 메모리 용량을 초록색 범위 내에서 할당

3D 가속 활성화 체크

vbox-settings-display

시작

vbox-start vbox-starting

VirtualBox 내부에 마우스 포인터가 갇히는 경우 오른쪽 Ctrl 키를 누르면 빠져나올 수 있다.

설치 클릭

vbox-hostkey

키보드 레이아웃은 English (US) 선택

xubuntu-inst-kbd

서드파티 소프트웨어 설치 체크 - 계속

xubuntu-inst-thirdparty

지금 설치 - 계속 - 변경사항을 디스크에 쓰기 창에서 계속

xubuntu-instnow xubuntu-inst-write-disk

시간대 선택

xubuntu-inst-tz

사용자명 xubuntu

패스워드는 보안상 쉽게 탈취되지 않도록 짓는 것이 원칙이지만 가상머신 내에서 테스트용도로 사용하기 때문에 편한대로 간결하게 지어도 괜찮을 것이다.

xubuntu-inst-adduser

설치가 끝날 때 까지 대기

xubuntu-installing


설치 중 참고사항

유명 소프트웨어 중에 LTS라는 릴리스 모델을 채택하고 있는 프로젝트가 여럿 있는데 우분투는 2년에 한 번씩 짝수해 4월마다 LTS 버전을 출시하고 있다.

https://en.wikipedia.org/wiki/Ubuntu_version_history#Table_of_versions

각 버전마다 별명이 있으며 2022년 4월에 출시한 22.04 버전은 jammy라는 코드네임이 붙어있다.

Xubuntu는 ubuntu에 xfce를 탑재한 리눅스 배포판이다.

기본 우분투의 Nautilus 파일탐색기는 일부 외장 디스크 unmount시 spindle parking 시퀀스가 올바르게 작동하지 않는 문제가 있지만 Xubuntu의 파일탐색기에서는 해당 문제가 일어나지 않는다.

하이퍼바이저 성능만 따지면 VirtualBox보다 QEMU가 더 빠르긴 하지만 리눅스에서 설치하는 virt-manager가 함께 있어야 편리하게 쓸 수 있기 때문에 본 자습서에서는 VirtualBox를 사용한다.

QEMU는 호스트와 아키텍처가 일치하지 않는 프로세서도 가상화 할 수 있기 때문에 해당 내용에 관심이 있다면 관련 자료를 알아보는 것도 좋다.

Cygwin으로도 리눅스의 여러 기능을 사용할 수 있지만 가상머신에 운영체제 전체를 설치하면

  • Cygwin에서 rm으로 실수로 파일을 삭제하는 등 시스템에 영향을 줄 수 있는 여지가 가상머신 내부에서는 없기 때문에 가상머신 내부에서 완전히 망가지더라도 해당 이미지 외부로 아무 영향을 주지 않는다.
  • X 디스플레이 서버 구동
  • 패키지 매니저 탑재
  • 컨테이너 구동
  • RAID 구성
  • 부트로더 설정
  • 리눅스 심볼릭 링크
  • sysctl 등으로 커널 조작

등을 사용할 수 있다.

WSLg 또는 VcXsrv로 리눅스 그래픽 환경을 구동할 수 있지만 Windowing system이 서로 달라서 네이티브 리눅스 환경과 재현도 차이가 날 수 있다.


Xubuntu 설치가 끝나면 재시작

xubuntu-inst-complete

만약 재시작 화면이 끝나지 않고 멈춰 있다면 가상머신을 강제로 리셋하면 된다.

xubuntu-reset-1 xubuntu-reset-2 xubuntu-boot-1 xubuntu-boot-2

부팅이 끝나면 세션 관리자가 뜬다.

xfce4-session

  • 우상단 전원 아이콘 클릭 - Shut Down... shutdown

다시 시스템을 시작한다.

vbox-start

사용 언어와 관련된 필요 패키지를 자동으로 감지해서 띄워주면 그대로 설치하면 된다. lang-1 lang-2

패스워드란에는 운영체제 설치 단계에서 입력했던 패스워드를 입력한다.

lang-3-passwd lang-4-inst lang-5-applying

소프트웨어 업데이트 알림에 대해서도 그대로 설치를 진행한다.

upd-1 upd-2-passwd upd-3-inst upd-4-unpacking

설치 후 시스템 재시작 upd-reboot


상단 작업표시줄 우클릭 - Panel - Add New Items... xf-taskbar-1-newitems

Launcher - Add xf-taskbar-2-launcher

우상단 ! 아이콘 클릭 - Delete finished notifications 클릭해서 VirtualBox 알림 정리 vbox-delnoti

새로 생긴 빈 Launcher 아이콘 우클릭 - Properties xf-taskbar-3-launcher-props

Add a new empty item xf-taskbar-4-new-empty-item

Name란에 xterm 이라고 작성하면 다 쓰기 전에 Create Launcher XTerm 이 펼쳐진다. 클릭 - Create xf-taskbar-5-xterm

Close xf-taskbar-6

xterm 실행 xterm

  • sudo apt purge apport* whoopsie* 실행하여 설치된 패키지 제거
  • y 입력 - 엔터
  • sudo apt autoremove 실행하여 사용하지 않는 패키지 제거

apt-purge apt-autoremove

whiskermenu - Settings Manager - IBus Preferences ibus-setup

Input Method - Add ibus-inputmethod-add

More... - Korean 검색 - Korean 클릭 - Hangul 선택 - Add

ibus-more ibus-hangul

기존에 있었던 Input Method인 English 선택 - Remove ibus-remove-en

Close ibus-hangul-finished

whiskermenu - Log Out... - restart logout restart

시스템 재시작 후 한글 입력 테스트 ibus-hangul-test

Guest Additions 설치

guest-insert

이미지 삽입 후 잠시 기다리면 /media/xubuntu/VBox_GAs_major.minor.patch 경로에 마운트 된 내용이 나온다. guest-mounted

xterm에서 해당 경로로 이동 -> ./autorun.sh -> 패스워드 입력 guest-autorun

근데 바로 설치를 진행할 수 없다.

sudo apt install gcc make perl의존성 패키지 설치를 한 뒤 다시 시도 guest-dep guest-inst-gcc-make-perl

의존성 패키지 설치가 끝난 뒤 다시 ./autorun.sh 실행 guest-autorun-done

autorun.sh 절차가 끝나면 sudo /sbin/rcvboxadd quicksetup all 실행 후 시스템 재시작 guest-rcvboxadd

해상도 제한이 완화되었다. vbox-resolution

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 선택 - OK - 가상머신 구동 vbox-adapter

xterm 실행 - ip addr 를 실행해서 방금 추가한 어댑터의 주소를 확인한다. 보통 enp0s8 인터페이스에 192.168.56.101 로 할당 받는다. xubuntu-ip

  • apt search openssh 로 검색
  • sudo apt install openssh-serveropenssh 서버 설치
  • systemctl status sshd데몬 구동 상태 확인

apt-inst-sshd sys-stat-sshd

Cygwin에서 scp로 위에서 저장한 .Xresources 파일을 가상머신에 복사해 보도록 한다.

  • scp .Xresources xubuntu@192.168.56.101:~ 실행 scp

복사가 끝나면 가상머신의 xterm에서 xrdb ~/.Xresources 를 실행해서 적용 xrdb

새 터미널을 시작해서 적용 여부 확인 xrdb-applied

현재 .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

또는 리눅스 내부에서 터미널을 쓰는 대신 Cygwin으로 ssh 접속을 할 수도 있다.

  • scp 명령과 비슷한 방식으로 ssh xubuntu@192.168.56.101 실행
  • 패스워드 입력
  • exit 로 종료

ssh


ip addriproute2에 포함된 커맨드 중 하나로써 리눅스에서는 ifconfig 대신 사용하는 커맨드이다.

ifconfignet-tools 프로젝트에 포함된 커맨드인데 BSD에서는 계속 ifconfig 을 기본으로 설정해 놓고 있다.

Host-only Adapter 는 처음에 VirtualBox를 설치할 때 같이 설치되었다. /assets/blog/03-linux-03/vbox-inst-2.png vbox-host

Advanced Package Tool

상단에서 sudo apt purge apport* whoopsie* 라는 명령으로 apt를 처음 사용해 보았는데 apt는 데비안 계열에서 채택하고 있는 패키지 매니저이다.

Microsoft의 운영체제에서는 2012년 Windows 8이 나오기 전까지는 주로 exemsi를 확보해서 프로그램 추가/제거를 수행했는데 이런 방식으로 소프트웨어를 배포하면 DLL 지옥이라고도 하는 구성요소 손망실 문제가 발생하기 쉽다.

이런 문제로 인해 소프트웨어 배포 및 관리를 체계적으로 수행하는 패키지 매니저가 개발되기 시작했고 APT 외에도 레드햇 계열에서 사용하는 yumdnf, 아치 계열에서 사용하는 pacman 정도가 널리 알려져 있다.

패키지 매니저가 수행하는 체계적 관리라 함은 소프트웨어 일괄 업데이트, ELF 등 연관 라이브러리 탐색/업데이트/제거 등을 자동으로 수행하는 것이다.

최근에는 AppImageflatpak처럼 플랫폼 독립적인 배포 방식 또한 이용저변을 넓혀가고 있다.

Google Play Store나 Apple App Store 또한 일종의 패키지 매니저라고 할 수 있다.


  • apt search midnightMidnight Commander 검색
  • sudo apt install mc 로 해당 패키지 설치
  • mc 실행
  • F10 으로 종료

apt search 패키지명 형식으로 현재 설정된 저장소로부터 내려받아 설치할 수 있는지 확인할 수 있다.

sudo apt install 패키지명 으로는 해당 패키지를 설치할 수 있다. 패키지 설치 직전에 [Y/n] 으로 여부를 확인하는데 대문자가 기본 동작으로 지정되어 있기 때문에 y 를 입력하지 않고 그대로 엔터를 쳐도 y를 입력한 것과 똑같이 진행한다.

패키지 설치는 시스템을 변경시키는 행위이기 때문에 관리자의 권한이 필요한데, sudo를 어떤 명령어 앞에 붙여서 실행하면 최소 권한의 원칙을 유지하면서 시스템에 변동을 줄 수 있다.

원래 sudo를 사용하기 전에 visudo로 sudoer 추가를 해 줘야 하는데 ubuntu에는 해당 설정이 미리 되어 있기 때문에 본 자습서에서는 따로 다루지 않았다.

예시로 설치한 mcncurses 기반 파일탐색기이다. mc-1 mc-2 mc-3

필요에 따라서 sudo apt install gcc make perl 처럼 여러 패키지를 한꺼번에 설치할 수도 있다.

리눅스 입문 part 2

· 9 min read
bitdori
admin

권한

ln-s3

ls에 -l 옵션을 붙여서 파일 목록을 출력하면 여러 가지 정보가 나오는데 소유자명, 시각, 파일명 및 링크 포인터로 구성돼 있다는 건 대충 알아볼 수 있으나 첫 번째로 나오는 -rw-r--r-- 와 같은 문자는 어떤 뜻인지 알아보지 못 할 수도 있다.

이는 Symbolic notation라고 불리는 읽기/쓰기/실행 권한 표기문자 이다.

총 10글자로 돼 있는데, 맨 왼쪽 한 개를 뺀 아홉 개는 3개씩 끊어서 각각 소유자(u)/그룹(g)/기타(o)의 권한을 표시한다.

-rw-r--r-- 인 경우

  • 소유자: 읽기/쓰기 (read/write)
  • 해당 파일이 지정된 그룹: 읽기만 (read)
  • 소유자도 파일의 그룹도 아닌 기타 사용자: 읽기만 (read)

할 수 있는 상태인 것이다.

예를 하나 더 들어 lrwxrwxrwx 인 경우 파일소유자/그룹/기타 모두 모든 권한을 보유하고 있는 것이다. (read/write/execute)

맨 왼쪽 lSymbolic link 임을 알려주고 있는데, 다른 표현형으로는

가 있다.

  • cd ~/opt/cygwin-test
  • ls -l

file-type-directory

Symbolic notation의 r/w/x/- 문자는 각각 4/2/1/0 이 대입되는 8진수로 이루어져 있다.

따라서 예로 들고 있는 -rw-r--r--644 권한이 들어가 있는 것이다.

같은 방식으로 lrwxrwxrwx777 권한으로 치환할 수 있다.

유틸리티 part 2

cat /var/log/setup.log 로 Cygwin 설치 중 기록된 메세지를 확인할 수 있었는데, 내용이 길어서 head와 tail로 끊어보았다.

  • less /var/log/setup.log 실행

less

head/tail은 한 번만 출력하고 끝내는 명령인데, lessman과 마찬가지로 f / b 키를 누르면서 계속 본문을 탐색할 수 있다.

  • q 를 눌러서 less 종료

less 커맨드가 개발되기 전에 more 라는 명령어가 먼저 나왔는데 less가 기능이 더 좋지만 more는 도스에서도 기본 탑재하던 커맨드이기 때문에 less를 쓸 수 없는 아주 제한적인 환경에서는 more를 less 대신 사용할 수도 있을 것이다.


  • cat /var/log/setup.log | wc -l 실행

wc

어떤 숫자가 출력됐는데 setup.log 속 내용이 몇 줄이나 들어있는지 wc-l 옵션을 줘서 계산한 것이다.

cat과 wc 사이를 파이프라인으로 이어줬는데 서로 다른 프로그램이 마치 한 개로 합쳐진 것처럼 명령을 수행한다.

&&는 따로따로 실행하는 명령을 표기만 한 줄로 엮을 때 사용하기 때문에 위 명령을 cat /var/log/setup.log && wc -l 로 실행하면 예상과는 다른 결과가 나올 것이다.

and

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 를 실행해서 해당 내용을 입력한다.

#!/usr/bin/env bash
mkdir -p ~/opt/cygwin-test
touch testfile
echo "line1" >> testfile
cp testfile testfile2
cat testfile2
ls - l

shell-script-1 shell-script-2

  • ls -l
  • chmod +x test-script.sh
  • ls -l

shell-script-3

  • ./test-s 까지만 입력하고 Tab 키를 눌러서 나머지 자동완성
  • Enter를 눌러서 실행

shell-script-execute

위에서 입력한 명령을 연쇄적으로 실행하였다.

FHS에서 .. 으로 dot을 두 개 입력하면 상위 디렉토리를 가리키고, . 한 개만 입력하면 현재 디렉토리 를 가리킨다.

./test-script.sh 라고 입력한 부분은 현재 위치(pwd)에 있는 test-script.sh 파일을 실행하겠다는 뜻이 된다.

  • chmod -x test-script.sh
  • ./test-script.sh

permission-denied

실행을 거부하고 있다.

chmod 는 rwx 권한을 변경할 때 사용한다.

맨 처음 shell script를 저장하고 곧바로 chmod +x 라는 것을 실행했는데 x 권한을 덧붙여서 실행할 수 있는 상태로 만들었던 것이다.

이후 -x 를 하여 다시 실행권한이 없어졌기 때문에 Permission denied 를 출력하면서 실행을 거부했다.

./test-s 까지만 입력하고 탭 키를 눌렀을 때 나머지 ./test-script.sh 까지 자동완성이 됐는데,

"" 사이에 문자열을 입력할 때 처럼 자동완성을 할 수 없는 경우가 있지만 대부분 경우에는 지원을 해 주고 있다.

chmod -x 로 실행권한이 빠졌을 때 자동완성이 되지 않았을텐데 이러한 동작으로 실행 가능 파일인지 아닌지 짐작해 볼 수 있다.

스크립트 첫 줄에 입력한 #!/usr/bin/env bash 라인은 hashbang 또는 shebang 이라는 부분이며 이 스크립트를 어떻게 실행할 것인가 결정하는 부분이다.

env

ls /usr/bin 을 해 보면 env 라는 프로그램이 있는데 이 프로그램으로 bash가 있는 위치를 탐색하도록 조치한 것이다.

애플 맥OS에서는 zsh 을 기본 인터프리터로 설정해 놓았기 때문에 #!/usr/bin/env zsh 로 작성하게 될 것이다.

/usr/bin/env 가 없거나 이를 사용하지 않는 경우 어떤 스크립트에는 #!/bin/sh 가 입력되어 있는 경우도 있는데 /bin/sh는 POSIX sh이며 bash나 zsh이 아니기 때문에 동작방식이 다를 수도 있다.

파일 탐색

/usr/binenv 가 있다는 사실은 해당 문서를 통해서 또는 경험적으로 알게된 것이지만 경험해 본 적 없는 새로운 파일, 새로운 커맨드가 있는 위치를 찾아보는 명령어로 whichwhereis 가 있다.

command search

which envwhereis env 로 env의 위치를 탐색해보면 둘 다 env 위치를 출력하긴 하지만 which는 출력값이 단 하나인 것에 비해 whereis는 다른 값도 보여주고 있다.

  • which 찾는대상: 실행가능파일(executable)이 있는 위치 출력
  • whereis 찾는대상: 이진 파일, 소스, 매뉴얼이 있는 위치 출력

근데, which와 whereis는 커맨드를 어디에서 찾아야 할지 어떻게 알고 있는 걸까?

이들을 실행하면 PATH라는 환경 변수로부터 경로값을 읽고 명령을 수행한다.

echo $PATH 를 실행하면 PATH 에 어떤 값이 들어있는지 볼 수 있는데, 여기에서 /usr/bin 을 볼 수 있다.

커맨드의 위치를 찾아주는 which / whereis와 달리 find로는 특정 파일을 어떤 경로 내에서 찾을 수 있다.

  • cd /opt/cygwin-test
  • ls
  • find . -name "test*"

test 로 시작하는 파일 내역을 현재 위치에서부터 하위 디렉토리 내부까지 탐색했다.

find

bash 활용

다음과 같은 명령을 실행하려고 한다.

mkdir-p ~/opt/cygwin-test/subdir && cd $_ && touch newfile && echo "line1" >> newfile && ls && cat newfile

전체 커맨드의 앞 단계에서 띄어쓰기를 빼먹어서 에러를 발생시킬 것이다.

커서를 앞 부분으로 하나씩 하나씩 옮겨서 띄어쓰기를 넣고 다시 실행하면 정상적으로 진행이 되겠지만 Readline 단축키로 커서를 더 빠르게 이동시킬 수 있다.

  • 잘못된 커맨드 우선 실행
  • 윗 화살표로 커맨드 다시 표시
  • Ctrl a 로 커서 맨 앞으로 이동 후 잘못된 부분 수정

위/아래 화살표로 이전 커맨드를 찾는 대신 전체 내역을 보고 싶어질 수 있는데 history 커맨드로 예전 기록을 확인할 수 있다.

history-1

history가 출력되면 원하는 내용을 복사 후 붙여넣기해서 Readline 단축키로 수정하려는 부분을 바꾸면 된다.

  • Ctrl e: 커서를 맨 뒤로 이동 (end)
  • Alt b: 커서를 한 단어 왼쪽으로 이동 (backward)
  • Alt f: 커서를 한 단어 오른쪽으로 이동 (forward)

Readline 단축키는 infoemacs에서도 활용하고 있다.

이미 실행했던 커맨드가 많아서 하나하나 찾기 힘든 경우 history | grep -i 검색어 형식으로 grep을 이용해서 찾아낼 수도 있다.

grep의 -i 옵션은 대소문자에 상관 없이 같은 알파벳이면 결과를 보여주도록 하는 옵션이다 (case insensitive)

hist-grep

Cygwin 환경설정

Cygwin은 mintty라는 터미널 위에서 돌아가는데, 이 mintty 설정을 통해서 폰트 등을 변경할 수 있다.

https://fonts.google.com/download?family=Noto%20Sans%20Mono

에서 Noto Mono 계열 폰트를 받은 뒤 압축을 해제하면 NotoSansMono-VariableFont_wdth,wght 와 static 폴더가 있는데 VariableFont는 모든 폰트를 한 번에 설치하지만 용량이 그만큼 크다.

static에서는 필요한 폰트를 하나씩 설치하도록 되어 있다.

noto

Cygwin 우클릭 - Options...

cygwin-context-menu

Text 항목에서 Font를 Select...

cygwin-font-select

Font Size도 좀 더 크게 바꾸어 보았다.

cygwin-font-applied

https://fonts.google.com/specimen/Roboto+Mono

https://github.com/naver/d2codingfont/releases

https://github.com/be5invis/Sarasa-Gothic/releases

리눅스 입문 - Cygwin

· 14 min read
bitdori
admin

우분투 그누/리눅스유닉스 처럼 말로만 들어보고 사용해 본 적이 없는 타 운영체제 또는

Bash노드 등 소프트웨어 개발을 하면서 잠깐씩만 접해 본 비(非) MS Windows 환경을 시그윈 을 통해 구동시킬 수 있다.

가상머신이나 네이티브 환경에서 X 를 구동하면 리눅스도 MS Windows처럼 마우스를 이용한 그래픽 환경을 띄울 수 있다.

git-bash, msys2, WSL 대신 Cygwin을 사용하는 이유

TL;DR Cygwin은 검증된 마이너이기 때문이다.

git for windows, msys2, WSL 모두 각각 유명하다보니 이미 설치해서 해 놓은 작업이 매달려 있는 경우가 보통인데 입문자가 이런 환경에다가 연습 삼다가 기존 환경이 꼬여버리면 아주 번거로워질 수 있다.

반면에 처음부터 Cygwin내에서 실습을 하면 잘못 건드려서 꼬여버려도 실패 격리를 할 수 있다.

2020년대가 지나면서 입문자가 Cygwin을 소개 받는 경우는 거의 없기 때문에 Cygwin 내에서만 이것저것 건드린다면 최악의 경우에도 그저 Cygwin을 삭제하고 다시 설치하는 것으로 원래상태를 복구할 수 있다.

사양, 호환성

WSL은 가상화 기능 위에서 돌아가는데, Cygwin은 가상머신에 비해서 시스템 요구 사항이 낮아 32비트 등 더욱 다양한 환경에서 사용할 수 있다.

입문하는 입장에서 실습 환경 깔아두기가 용이하다는 것이다.

비교적 최근부터 사용률이 올라가고 있는 docker 는 시스템 요구 사항이 가상머신보다 낮기는 하지만 Cygwin보다 배우기 어렵고 Windows 버전 도커는 완성도가 타 플랫폼 버전에 비해서 떨어진다.

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 다운로드

Cygwin installer download

Internet으로부터 다운로드 -> 설치 경로 확인 -> 연결 설정 확인

Cygwin from internet 다음 Cygwin install directory 다음 Cygwin install connection

사이트는 .jp, .tw 중에서 선택하면 지리적으로 가깝기 때문에 비교적 속도가 빠르다. 그럼에도 다운로드 해야 할 개체가 워낙 많기 때문에 끝날 때 까지 잠시 기다려야 한다.

Cygwin package site

한국 https://ftp.kaist.ac.kr 에서도 서비스를 제공하지만 간혹 문제가 발생하는 경우가 있다.

Cygwin download error

▲ https:/ftp.kaist.ac.kr에서 패키지 정보를 불러오지 못 하고 있다.

Cygwin downloading list

Select Packages에서 설치할 패키지 목록을 볼 수 있는데 기본값으로 두고 다음으로 넘어간다.

Cygwin packages 다음 Cygwin confirm changes 다음 Cygwin package install 다음 Cygwin installation complete

첫 구동

이미 msys2 등을 사용하면서 각종 시스템 설정을 해 봤다면 PATH에 연동하는 팁을 적용해보고 싶을 수도 있겠지만 DLL 충돌로 문제가 발생할 수 있으므로 여기에서는 해당 팁을 안내하지 않는다.

설치가 끝난 뒤 바탕 화면에 생성된 Cygwin64 Terminal 을 실행

exit를 입력하고 엔터를 입력하면 터미널이 종료된다.

Cygwin first launch

커맨드 (명령어)

다시 Cygwin64 Terminal 을 실행

다음 각 명령어를 하나씩 입력하고 엔터를 쳐서 실행해 본다.

cal: 달력을 출력한다. (Calendar)

pwd: 현재 탐색 중인 위치를 출력한다. (Print Working Directory)

ls: 숨김 파일을 제외하고 현재 위치의 파일 목록을 출력한다. (List)

ps: 현재 실행 중인 프로세스 목록을 출력한다. (Process Status)

uname: 현재 시스템의 운영체제 정보를 출력한다 (unix name)

man: 설명서 (manual)

Command set

man 을 실행하면 어떤 실행 결과가 나오는 대신 도움 문구가 출력되는데 이번에는 man man 이라고 입력 해 본다.

man man

실행한 결과 나오는 본문이 man 커맨드에 대한 설명서이다. 즉, man을 어떻게 사용해야 하는지 man 커맨드로 보고 있는 것이다.

man content

실수로 man   man 사이에 공백이 여러 개 들어갔어도 똑같이 실행되기 때문에 공백을 다시 한 칸으로 줄이려고 굳이 삭제하지 않아도 된다.

q 를 누르면 man에서 나갈 수 있다.

다시 man man 을 실행 해 본다.

man에서 f 를 누르면 다음 페이지로, b 를 누르면 이전 페이지로 올라갈 수 있다.

사용 예시(EXAMPLES)란을 보면 man ls 항목이 있는데 man 커맨드로 ls에 대한 설명을 보는 방법을 안내하고 있는 부분이다.

man man examples

q를 눌러서 종료하고 다시 man ls 를 띄워보면 SYNOPSIS 단락에 ls [OPTION]... [FILE]... 형식이 있는데 [OPTION] 자리에 - 로 시작하는 각종 flag를 대입할 수 있다. 바로 아래 DESCRIPTION 단락에서 -a 옵션 확인

man synopsis man description

q 를 입력해서 설명서를 빠져 나온 후 ls 를 한 번 입력해보고 ls -a 를 다시 입력해 본다.

ls -a

ls만 입력 했을 땐 보이지 않았던 파일도 나오는데, 리눅스에서는 파일이름이 없이 . 으로 시작하는 파일은 숨김처리를 한다. ls의 -a 옵션은 이런 숨김파일도 함께 출력하도록 한다.

  • 다시 man ls 실행

f 를 눌러 아랫쪽으로 더 내려가면 -l 옵션이 있다.

man-ls-description

  • q 를 입력해서 나온 뒤 ls -al 실행

-l 옵션까지 추가해서 실행한 결과 각 목록의 상세한 정보도 함께 표시하고 있다. 이처럼 몇몇 옵션을 함께 조합할 수도 있다.

ls-complex-option

vi

vimtutor 를 실행한다.

위에서 f 키와 b 키로 man 페이지를 탐색해 보았는데 vi 또한 비슷한 키맵으로 커서를 이동할 수 있다.

단, Ctrl 키를 조합해서 Ctrl f / Ctrl b 로 페이지를 이동할 수 있다.

vimtutor

vimtutor에서 빠져나가려면 우선 : 를 입력한다.

그러면 하단에 : 이 표시되는데 q 를 마저 입력해서 :q 로 만들고 엔터를 입력해 빠져나갈 수 있다.

vimtutor-quit

vimtutor는 man과는 별도로 vim에서 제공하는 vim 학습서이다.

엄밀히 따지면 vim과 vi는 서로 다른 개발자의 개별 프로그램이지만 BSD vi 이든 vim이든 핵심적인 부분을 공유하기 때문에 vimtutor로도 vi 사용법을 익힐 수 있다.

man 과 vi의 키 조합이 비슷한데, Unix 계열 운영체제에서는 비슷한 인터페이스를 여러 상황에서 반복적으로 적용하기 때문에 한 가지 개념을 학습하고나면 지속적으로 응용 할 수 있다.

커맨드 Part 2

커맨드 첫 장에서는 여러 번 실행해도 시스템에 아무 변화를 주지 않고 몇 가지 정보를 출력하기만 하는 명령어를 소개했다.

man 으로 각 명령어의 사용법을 익히고 vimtutor 의 내용까지 이해했다면 이제부터 시스템에 변화를 주는 커맨드도 하나씩 사용해 보도록 한다.

  • mkdir ~/cygwin-test 로 디렉토리 생성

Windows 탐색기에서 %userprofile% (보통 C:\Users\사용자명) 로 들어가보면 방금 생성한 디렉토리를 볼 수 있다.

mkdir

Unix 계열에서는 ~ 를 사용자 홈 디렉토리로 사용한다.

리눅스재단에서는 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

  • mkdir ~/cygwin-test 로 다시 디렉토리 생성
  • cd ~/cygwin-test 를 입력해 방금 생성한 디렉토리로 이동
  • touch testfile 로 빈 파일 생성
  • vi testfile -> i 입력 -> first testfile 이라고 입력 -> esc 키 입력 -> :wq 를 입력하여 저장 & 종료

wq

touch 는 원래 파일의 타임스탬프를 바꾸는 명령어이지만 지금처럼 파일을 생성하기 위해 사용할 수도 있다.


Failed to source defaults.vim 메세지가 나오는 경우 vi Failed to source Cygwin 설치 프로그램 (setup-x86_64.exe)을 다시 실행 -> Select Packages 단계에서 Search란에 vim 검색 vim installation 1 vim installation 2 vim installation 3 Skip 부분 더블클릭하여 버전번호 선택 -> 다음으로 넘어가서 설치


  • cat testfile 로 testfile의 내용물 확인

vi 를 쓰는 대신 곧바로 내용물을 출력하고 싶을 때 cat을 사용하면 된다.

cat

  • echo "new string" >> testfile && cat testfile 실행

echo 문자열: 문자열 출력

&&: 연속해서 다음 명령 실행. 명령어1 && 명령어2 && 명령어3 처럼 연결해서 여러 명령어를 한꺼번에 실행시킬 수 있다.

위 명령을 실행한 결과 testfile의 두 번째 줄에 new string 이 붙었다.

multiple-commands

>>new string 을 testfile로 보내줬는데, 리다이렉션을 시킨 것이다.

항1 >> 항2 과 같이 두 번 쓰면 원래 내용을 보존하면서 첫 번째 항을 덧붙여주고 > 을 하나만 쓰면 원래 내용을 삭제하고 새 데이터를 넣는다.

redirection-overwrite

  • cp testfile testfile2 && ls 로 파일 복사 후 목록 출력
  • rm testfile2 && ls 로 파일 삭제 후 목록 출력

cp 원본 복사본 명령어는 파일을 복사하고 rm 삭제될대상 명령어는 파일을 삭제한다

rm

  • cp testfile testfile2 로 다시 파일 복사
  • ls ~/cygwin-test 로 복사 여부 확인

cp

지금까지와 달리 ls 절대경로 형식으로 복사 여부를 확인해 보았다.

파일시스템에서 디렉토리는 계층적으로 이루어져 있는데, 기존처럼 단순 ls 만 실행하면 pwd 가 현재 잡고 있는 위치에서 명령을 실행한다. 반면에, 절대경로를 ls의 인자로 전달하면 현재 pwd가 어떻게 잡혀있든 상관 없이 절대경로에 대해서 작업을 수행한다.

다음을 실행해 본 뒤 계층구조를 확인해 보도록 한다.

  • cd .. && pwd 로 상위 디렉토리로 이동 후 현재 위치 출력

mkdir ~/cygwin-test 를 했을 때 디렉토리 구조는

home

  └─ 사용자

    └─ cygwin-test

로 구성됐다.

마지막에 ~/cygwin-test 에 있었기 때문에 여기에서 상위로 이동하면 ~ 로 이동하는 것이다.

cd

rm cygwin-test/testfile2 && ls cygwin-test 까지 실행하고나면 해당 내용이 이해됐을 것이다.

  • rmdir cygwin-test 실행
  • ls 실행

rmdir은 디렉토리를 삭제하는 명령어인 것으로 위에서 소개를 했는데 삭제를 거부하고 있다.

cygwin-test 내부가 비어있지 않고 파일이 들어있기 때문인데, rm -rv cygwin-test 로 다시 시도해보라.

ls로 삭제 여부를 확인할 수 있다.

rm-r

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

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

삭제 옵션으로 -v 를 또 넣었는데 어차피 계속 사용할 것이므로 자동으로 붙이면 편리하게 쓸 수 있을 것이다.

  • vi ~/.bash_aliases
  • alias rm='rm -v' 입력
  • :wq 를 입력해서 vi 종료
  • source ~/.bash_aliases
  • touch ~/opt/testfile
  • rm ~/opt/testfile

vi-alias rm-v-alias

존재하지 않는 파일에 대해선 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

ls에 -F 옵션을 사용하면 디렉토리는 이름 끝에 / 가 붙어서 다른 파일과 쉽게 구분할 수 있다.

ls-F

ln 명령어는 곧 이어 설명을 하겠다.

어떤 옵션을 alias로 지정할 것인지 전부 외울 순 없기 때문에 man으로 추가할 옵션을 참고하도록 한다.

유틸리티

  • cat /var/log/setup.log setup-log

FHS 에 의하면 내용이 수시로 바뀌는 기록은 /var/log 에 저장하도록 되어 있는데 cygwin을 설치하면서 setup.log 가 저장된다.

각종 설치 내역이 저장되어 있기 때문에 cat으로 본문을 뽑았을 때 아주 길게 화면에 나오는데 headtail 로 이 길이를 조절할 수 있다.

  • head /var/log/setup.log: 내용 시작점 일부를 출력
  • tail /var/log/setup.log: 내용 끝점 일부를 출력

head tail

기본으로 10줄씩 출력을 하고 있는데 이 길이를 바꾸려면

  • head --lines=3 /var/log/setup.log 또는
  • head -n 7 /var/log/setup.log

형식으로 지정하면 되고 tail 또한 마찬가지이다.

head-line

  • rm -r subdir
  • mkdir -p ~/opt/cygwin-test/subdir && cd $_ && touch test-origin

하위 디렉토리를 연쇄적으로 만들 때 -p 옵션을 붙이면 하나 만들고 cd로 들어가서 또 다시 만드는 일 없이 곧바로 처리할 수 있다.

이런 다단계 디렉토리를 생성하고나서 그 안쪽으로 이동하기 위해 cd로 또 다시 하위 경로까지 입력하는 대신 cd $_ 를 입력하면 곧장 이동할 수 있다.

mkdir-p

방금 ~/opt/cygwin-test/subdir 안에 새로 생성한 test-origin에 대해서

  • echo "line1" >> test-origin && cat test-origin 을 실행

예상대로 line1 이라는 문자열이 test-origin 안에 들어 있다.

ready-to-ln

  • ln -s test-origin test-symlink && cat test-symlink 실행

cp로 복사한 파일이 아닌데도 line 이라는 문자열이 test-symlink 안에 들어있다.

ln-s

이어서 아래 명령도 실행해 본다.

  • echo "line2" >> test-origin
  • cat test-origin
  • cat test-symlink

분명히 line2 라는 문자열은 test-origin 에만 넣었는데 test-symlink 로부터도 같은 내용물이 출력되고 있다.

ln-s2

이것은 심볼릭 링크 라고 불리며 MS Windows의 바로 가기 기능과 유사하다.

test-symlink 파일이 원본인 test-origin 을 가리키고 있기 때문에 test-origin을 바꾸고서 test-symlink를 출력하더라도 결국 원본인 test-origin의 내용을 보여주는 것이다.

반대로 test-symlink 안에 내용물을 추가하고나서 test-origin 을 출력해도 마찬가지로 반영된 결과를 볼 수 있다.

ln-s3