리눅스 민트 시나몬을 설치해 보자

1 리눅스 민트 시나몬을 설치해 보자[ | ]

Linux Mint 19.3 "Tricia" - Cinnamon (64-bit)
HP ENVY 4-1038TX, i5-3317U(1.7GHz) 4GB DDR3 SDRAM에 설치하기
  • 리눅스 민트 설치 가이드
한글로 친절하게 설명되어 있다. 쉬웠다 설치 까지는...
리눅스 민트 설치 가이드
  • 다운로드
시나몬, 마테, xface중 시나몬 64bit 버전을 다운로드 받는다.
Linux Mint 19.3 "Tricia" - Cinnamon(64-bit)
다운로드 겁나 느리다, 기다리다 죽는줄, 결국 토런트로 다운받았다. 이게 젤 빠르더라.
파일이 걱정이 된다면, 검증 하는 방법까지 있더라, 이건 첨 알았다.
  • 부팅 가능한 미디어 만들기
리눅스 민트에서
메뉴 → 액세서리 → USB 이미지 라이터 를 선택하거나,
ISO 파일을 오른쪽 클릭해서 `부팅 USB 만들기`를 선택해서 만든다.
USB를 선택후 만들기를 누르면 된다.
  • 주의할점
부팅 USB와 BIOS의 부트 모드가 일치해야 한다.
UEFI이든 Legacy든 하나로 통일 되어야지, 서로 다른 방식 이라면 부팅이 되지 않을 것이다.
이것 때문에 설치 할때 애를 먹는 것이다. 나도 그랬다.
  • BIOS에서 부팅 순서를 USB우선으로 바꿔준다.
Legacy가 아닌 UEFI로 설정해줘야 한다.(요즈음 2005년이후인가? 암튼 요즈음것들은 모두 UEFI로 설정 하면 된다.)
USB꼽고 시키는 대로 하면 된다. 파일 시스템과 파일 구조에 대해선 공부좀 해야겠다
  • Lenovo ThinkPad E595 S1HC
AMD 3500U, Vega 8, 256 nvme, 8G기본 + 추가 8G
1. BIOS 설정 부분은 건들지 말자.
바이오스를 기본 설정(Legacy, UEFI 자동)에서 UEFI로 설정을 바꾸니 화면은 꺼지는데 전원이 꺼지지 않는 현상 발생. 초기 값으로 변경 후 정상 작동
리눅스가 문제인지 바이오스가 문제인지, 바이오스 업데이트를 해보고 싶었으나 펌웨어 프로그램이 윈도우 버전만 있어서 표기.
→이게 원인이 아니었다, 72시간을 삽질만 했다. 커널을 하위 버전으로 바꾸니 잘된다. 방법은 아래에...
2. Fn 키보드 설정
기능키(볼륨, 화면밝기 등등)를 초기 값으로 사용하고 F1 ~ F12 키는 Fn 한번 누르면 사용 가능하도록 설정 한다.
Fn 두번 누르면 F1 ~ F12 키로 고정된다. 고정을 해제는 Fn 한번 눌러 준다.
→빨콩 아래에 있는 버튼의 설정 방법은 어디에서 할 수 있을지 궁금한데, 모르겠다.
BIOS Config → Keyboard/Mouse → Fn Sticky Key [Enabled]

2 설치후 해줘야 할 일들[ | ]

이건 박정규 님의 블로그를 참고 했다. 감사합니다.
박정규 bagjunggyu 님의 블로그

  • root 패스워드 만들기.
가장 먼저 할 일은 우선 root 패스워드를 만들어 두는 것입니다.
관리자 권한의 최 상위 사용자 root의 비밀번호를 만드는 일입니다.
$ sudo passwd root
  • 미러 서버를 한국 서버로 바꾸기.
메뉴 - 관리 - 소프트웨어 소스 실행후
주 OS, 기반 OS의 미러서버를 모두 한국의 서버로 바꾸기 그래야 업데이트가 빨라진다.
  • 한글 입력기 님프(nimf) 설치하기
님프가 제일 좋다, 개발자 님께서 힘들어 하시던데, 내 돈들여 좋은일 하는데
뭔 말들이 그리 많은지, 힘내시길 바랍니다. 응원 합니다.
$ sudo apt-add-repository ppa:hodong/nimf
$ sudo apt update
$ sudo apt install nimf nimf-libhangul
$ im-config -n nimf
기본 한글입력기 fticx 삭제하기.
$ apt autoremove fcitx-*
그냥 놔 둬도 되는데, 왠지 지우고 싶다. 그냥 쓰고 싶다면 몇가지 빠진 것들을 마져 설치해 줘야 한다고 한다.
  • GRUB 한글 깨지는 문제해결.
부팅할때 한글이 깨져서 뭔소린지 모르겠다.
kldp.org Q&A중 나한 님의 댓글을 참조
보통 나눔고딕 폰트를 설치하고, grub폰트로 만들고 설정파일을 변경하고 재부팅 하던데
나는 이미 있는 유니코드 폰트 /boot/grub/fonts/unicode.pf2 를 이용해서 해결을 했다.
# Grub 환경 설정 : GRUB_FONT 변수 수정
$ sudo vi /etc/default/grub.d/60_mint-theme.cfg
GRUB_FONT="/boot/grub/fonts/unicode.pf2"
:wq

# Grub 업데이트
$ sudo update-grub

# 시스템 재시작
$ sudo reboot
  • 설치후 화면은 종료 되지만, 전원이 꺼지지 않는 문제 해결.
커널의 버전을 5.3.0-53-generic에서 5.0.0-32-generic로 바꾸면 된다.
→레노버 싱크패드 E595는 5.0.0-32-generic 커널로 변경하니 해결 됬다.
→5.4.0-37-generic 커널은 이상 없이 동작중
# 부팅순서 변경: GRUB_DEFAULT 변수 수정
$ sudo vi /etc/default/grub
GRUB_DEFAULT="1<2"
:wq

# GRUB 업데이트
$ sudo update-grub

# 시스템 재시작
$ sudo reboot
# 리부팅이 안되면, 전원 버튼을 길게 눌러 끄고 재시작

# 커널 버전 확인
uname -r
  • 리눅스용 VMware 설치하기
잠시 머물다 리눅스 민트에 가상머신 설치
VMware Workstation 15.5.5
# 설치 파일에 실행 권한 부여
chmod +x VMware-Workstation-Full-15.5.5-16285975.x86_64.bundle

# VMware 설치 스크립트 실행
sudo sh ./VMware-Workstation-Full-15.5.5-16285975.x86_64.bundle

# VMware 삭제
sudo vmware-installer -u vmware-workstation
설치 끝. 다 됬다. 시작 > 관리 에 보면 VMware Player, VMware Workstation 보인다.
시리얼키를 입력하고 사용하면 된다.
  • VMware 스넵샷 이용하기
VM > SnapShot > Take SnapShot
스넵샷은 전원을 끈 상태에서 만들어야 용량도 작고, 스넵샷을 이용해 클론(VM > Manage > Clone)도 만들 수 있다.
가상머신을 종료한 상태에서 만든 스넵샵만 클론을 만들 수 있다.
  • VMWare Tools 설치하기
리눅스민트를 가상머신에 설치한 경우 host와 가상머신사이에 파일 이동이나 복사/붙이기, 화면 사이즈 자동조절을 하기 위해서는 vmware-tools를 설치해야 된다.
open-vm-tools, open-vm-tools-desktop 두 패키지를 가 필요한데, open-vm-tools-desktop을 설치하면 패키지가 둘다 설치된다.
$ sudo apt update
$ sudo apt install open-vm-tools-desktop

$ dpkg -l | grep open-vm-tools*
ii  open-vm-tools                              2:11.0.5-4ubuntu0.18.04.1                        amd64        Open VMware Tools for virtual machines hosted on VMware (CLI)
ii  open-vm-tools-desktop                      2:11.0.5-4ubuntu0.18.04.1                        amd64        Open VMware Tools for virtual machines hosted on VMware (GUI)
설치확인 까지 끝, open-vm-tools는 서버용, open-vm-tools-desktop 은 말그대서 일반용인데 차이점은 잘모르겠고
마우스 드레그 후 가운데 버튼으로 붙이기가 작동되는거 정도가 현재 까지 발견한 차이점 이랄까?
  • VMWare Workstation에 3D 하드웨어 그래픽 가속 사용하기
3D 하드웨어 가속 기능을 Windows 10 에서 사용할 수 없어 아주 기초적인 그래픽 기능만 사용할 수 있다는 경고를
VMWare에서 자꾸 켤때마다 나온다. 가속기능을 사용할 수 있도록 설정 파일을 변경하면 된다.
Enable 3D Hardware graphics acceleration for VMWare Workstation on Ubuntu
# Ubuntu에서 3D 하드웨어 그래픽 가속이 활성화되어 있는지 테스트
# mesa-utils 는 이미 설치 되어 있었다
$ sudo apt-get install mesa-utils
$ glxinfo | grep "direct rendering"
direct rendering: Yes  //  가속기능은 활성화

#  vmware의 환경 설정 파일 편집 - 특정 사용자
$ nano $HOME/.vmware/preferences
# 파일의 마지막에 추가한다
mks.gl.allowBlacklistedDrivers = "TRUE"

#  vmware의 환경 설정 파일 편집 - 전체 사용자
$ sudo vi /etc/vmware/config
# 마지막 줄에 추가
mks.gl.allowBlacklistedDrivers = TRUE
마지막으로 가상머신의 가속기능을 켜주면 된다.
Edit virtual machine settings > Hardware > Display > 3D Graphics > Accelerate 3D graphics
를 선택해 주고 VMWare WorkStation 재시작.
  • vim 설치하기
리눅스 민트에는 vim-tiny가 기본으로 설치 되어 있지만. 설정을 변경등 세부 작업을 할 수 없다.
vim-tiny는 삭제를 하고, vim을 설치하자.
vim설치
$ sudo apt update
$ sudo apt install vim
vim-tiny 삭제
$ sudo apt purge vim-tiny
설치된 패키지 확인
$ dpkg -l | grep 패키지이름
  • 외부에서 SSH로 접속하기
외부에서 집에 있는 노트북에 SSH로 연결을 해 볼까 한다.
인테넷 공유기의 DDNS설정과 openssh 서버 설치와 WOL(Wake On Lan)기능까지 해볼까 한다.
1. iptime 공유기 DDNS(Dynamic DNS) 설정하기
iptime 공유기 DDNS 설정을 통한 원격지 서버 ssh 접속
192.168.0.1(공유기 관리설정 페이지)에 접속해서 로그인 한다.
고급설정 → 특수기능 → DDNS설정
서비스 공급자는 ipTime DDNS 이고, 나머지 호스트 이름과 계정, 암호를 입력하여 호스트를 생성한다.
abcd.iptime.org로 부여가 된다 (abcd는 위에서 입력한 호스트 이름)
2. 공유기 원격 관리 포트 설정하기
외부에서 관리 설정 페이지에 접속을 하기 위한 설정을 해준다.
WOL기능을 사용하기 위한 사전 준비 작업이다. WOL을 사용할 이유 없다면 패스.
고급설정 → 보안기능 → 공유기 접속관리
포트번호를 입력한다. 예를들어 1234로 하겠다. 무튼 이렇게 등록을 했다면,
브라우저 주소창에 abcd.iptime.org:1234 로 접속으로 할 수 있게 된다.
3. 포트포워딩 설정하기
마지막으로 지금까지 외부에서 내부(우리집)공유기 까지는 설정이 끝났다.
다음으로 이제는 내부망에서 어떤 컴퓨터(혹은 서비스)로 연결될지를 정하는게 남았는데 이게 포트포워딩이다.
고급설정 → NAT/라우터 관리 → 포트포워드 설정
사용자 정의를 선택하고 ssh로 규칙이름을 만든다, 이름이 중요한건 아니다. 편한 이름으로.
SSH로 접속할 컴퓨터의 IP주소를 입력한다. 여기서 WOL을 사용하려면 반드시 LAN포트에 연결된 IP주소를 사용해야 된다.
프로토콜은 tcp/udp 하고 포트는 전부 22(ssh가 포트 22를쓴다 약속이다)로 쓰면 된다.
추가버튼을 누르면 끝났다.
접속방법 - IP 혹은 DDNS주소로 접속
$ ssh abcd@19.23.45.11
$ ssh abcd@name.iptime.org
4. openssh server 설치하기
리눅스 민트에는 클라이언트만 설치 되어 있고 서버는 설치 되어 있지 않다.
$ dpkg -l | grep openssh
ii  openssh-client                             1:7.6p1-4ubuntu0.3                               amd64        secure shell (SSH) client, for secure access to remote machines
ii  openssh-server                             1:7.6p1-4ubuntu0.3                               amd64        secure shell (SSH) server, for secure access from remote machines
ii  openssh-sftp-server                        1:7.6p1-4ubuntu0.3                               amd64        secure shell (SSH) sftp server module, for SFTP access from remote machines
openssh-server 가 리눅스에서 사용하는 ssh 서버다. 이미 설치를 해서 보임, 설치 방법은 아래에.
$ sudo apt update
$ sudo apt install openssh-server
설치확인
systemctl status -t service ssh
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-06-15 03:37:48 KST; 8h ago
  Process: 32246 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
  Process: 32241 ExecReload=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
 Main PID: 30319 (sshd)
    Tasks: 1 (limit: 4509)
   CGroup: /system.slice/ssh.service
           └─30319 /usr/sbin/sshd -D
잘돌아 가고, 기본으로 부팅할때 로딩 되도록 설치 되어있다.
†설치만 하면 그다음은 자동 설정이 된다. 따로 할일 이 없다.
5. SSH key로 인증하기
ssh 기술여행자 ssh 사용시 암호 대신 SSH key로 인증하기
SSH연결을 암호 없이 편하게 할 수 있는 방법이 있었다. 몰랐다. 자세한 기술적인 내용은 기술여행자 님의 글을 참조하자,
이이상 잘 정리된 건 없다. 감사합니다.
SSH Client 에서 키 2개(private key, public key) 만들어 하나는 클라이언트에 하나는 서버에 두고 서로 가 가진 키를 이용해 사용자를
인증하는 방식이라고 보면 된다.
키 페어를 만들려면 OpenSSH에 포함되어 있는 ssh-keygen 유틸리티를 사용한다.
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa):

/home/test/.ssh/id_rsa already exists.
Overwrite (y/n)?

Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
|     ..o         |
|   E o= .        |
|    o. o         |
|        ..       |
|      ..S        |
|     o o.        |
|   =o.+.         |
|. =++..          |
|o=++.            |
+-----------------+
Line 1:
클라이언트에서 ssh-keygen을 실행해 SSH 키 페어를 만든다.
Line 5:
이전에 만들어 놓은 SSH 키가 있다면 다음과 같은 내용을 보게 될 것이다. 되돌릴 수 없으니 알아서 하면 됨.
Line 8:
Passphrase는 옵션으로 private 키를 디스크에 저장할 때 암호화 하는데 사용된다.
엔터키로 생략했다. 복잡한게 싫어서, 단 보안을 중요하게 생각한다면 설정하는게 좋다.
Line 12:
인증에 사용할 수 있는 private 키와 public 키 쌍을 만들었다.


로컬 머신 어카운트의 id_rsa.pub 키 파일 내용을 SSH로 로그인하길 원하는 서버 어카운트의 ~/.ssh/authorized_keys 파일에 복사해 넣어주면 된다.
수동으로 해줘도 되지만, 그러지 말자 자동으로 해주는 명령이 기본으로 있으니 있는건 쓰자.
서버에 public키를 복사하는 가장 쉬운 방법은 ssh-copy-id 라는 유틸리티를 사용하는 것이다.
$ ssh-copy-id test@foo.bar.com

 The authenticity of host 'foo.bar.com (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes


/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
test@foo.bar.com's password:


Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'test@foo.bar.com'"
and check to make sure that only the key(s) you wanted were added.
처음으로 접속하는 경우 나오는 메세지 이니 무시하고 넘어가면 되고, 접속하려는 서버 계정의 암호를 한번 입력해주면 끝.
다음 부턴 암호를 입력하지 않아도 접속가능 오옷...좋다.. 좋은 건가?
  • SSH에서 X-window 사용하기
ssh로 연결된 서버의 x-windows를 이용해 보자. 둘다 리눅스 시스템이기 때문에 설정파일과 ssh접속때 옵션 하나만 추가해주면 된다.
/etc/ssh/ssh_config 물론 서버에 있는 파일이다. ForwardX11 no -> yes 바꾸고 #를 제거한뒤 저장, ssh를 다시 시작하면 끝.
$ sudo vi /etc/ssh/ssh_config
ForwardX11 no -> yes 로 바꾸고 #를 제거하고 저장.
Host *
#   ForwardAgent no
ForwardX11 yes
#   ForwardX11Trusted yes
#   PasswordAuthentication yes
#   HostbasedAuthentication no
#   GSSAPIAuthentication no
#   GSSAPIDelegateCredentials no
#   GSSAPIKeyExchange no
:wq
/etc/ssh/ssh_config 파일을 수정했으니 ssh를 restart 해준다.
$ sudo systemctl restart ssh
마지막으로 ssh접속할때 옵션(-X)을 추가하면 된다. -X는 대문자임.
$ ssh -X 계정@ssh서버.iptime.org
-x Disables X11 forwarding.
-X Enables X11 forwarding.
대문자와 소문자 차이가 어마 어마 하다.

3 UEFI BIOS 와 Legacy BIOS의 차이점[ | ]

결론 부터 보자면 UEFI가 좋다, 그러니 가능하다면 UEFI 를 사용 하자. 다른 장점 모두를 떠나서 부팅 속도가 레거시 보다 빠르다. BIOS는 디스크 파티션과 파일시스템 그리고 부팅까지 함께 연결해서 이해를 하는게 좋다. 따라서 파티션과 부트로더는 되는 대로 정리를 해 볼까 한다.

UEFI 와 Legacy의 차이점 - 잘 설명되어 있는 곳입니다.
  • BIOS(Basic Input Output System)가 하는일
CPU와 주변 장치를 진단
CPU와 주변 장치를 활성화/비활성화
부팅 장치의 우선 순위 설정(예를 들어,《1》CD/DVD ROM,《2》HDD,《3》USB)
하드 디스크(HDD)와 광학 드라이브의 설정
부트 모드(Legacy BIOS/UEIF)의 전환
날짜 및 시간 설정
  • 레거시 BIOS
레거시 BIOS (Legacy BIOS)는 약 20년 전에 운영 체제를 가동을 위해 설계된 오래된 유틸리티입니다.
그러나 이것은 16비트( 시스템이며, 최대 1MB의 메모리밖에 액세스 할 수 없습니다.
2TB 이상의 대용량 HDD에서 OS 부팅 및 최신 하드웨어와 운영 체제 (OS)와dml 통합에 한계가 발생했습니다.
오래된 BIOS 펌웨어는 최신의 PC와 호환돼는게 점점 어려워지고 있기 때문에, 레거시 BIOS를 대신해서
2010 년쯤에 UEFI(Unified Extensible Firmware Interface) 모드로의 전환이 진행되고 있습니다.
최신 PC 마더 보드에는 레거시 BIOS와 UEFI 모드 둘 다 부트 모드(Boot Mode)가 구비되어 있어 어느 하나를 선택할 수 있지만,
장래를 보면 "레거시 BIOS"가 필요없게 되는 시대가 올 지도 모릅니다.
  • UEFI 모드
UEFI(Unified Extensible Firmware Interface) 모드는 최신 PC용의 표준 펌웨어 인터페이스입니다.
PC 기술이 진보함에 따라 온도와 전력 모니터링, 원격 보안 관리, 가상화 및 Turbo Boost 등의 프로세서 확장 등 BIOS를 지원할 필요가 있었습니다.
UEFI는 이전의 BIOS 펌웨어 인터페이스 및 EFI(Extensible Firmware Interface)를 대체할 새로운 유틸리티입니다.
BIOS에서 하드웨어를 진단하지 않고 빠른 OS 부팅이 가능하며, 소프트웨어의 상호 운용성을 향상시킵니다.
2테라 바이트(2T bytes) 이상의 고용량 하드 디스크 제어 및 Windows 64bit 버전에 적합합니다.

4 디스크 볼륨과 파티션 그리고 드라이브[ | ]

파티션의 형식(MBR, GPT)과 바이오스(Legacy, UEFI)는 서로 연관성이 있기에 따로 생각하면 안된다 한꺼번에 같이 정리를 해야 이해 된다. 같이 놓고 보면 어렵지 않은데 따로 생각 하니까 복잡해 진거다.

KnowlliPop 볼륨과 파티션 볼륨과 파티션
KnowlliPop 당신이 컴퓨터의 전원을 누르면 생기는 일 부트레코드
택이짱의 IT Lif MBR, GPT 파티션의 차이점
  • 파티션, 파일 시스템, 볼륨의 그들의 관계
디스크(HDD혹은 SDD등의 물리적인 저장장치)를 논리적으로 나눠 놓은게 파티션(Partition)이고,
파티션에 파일시스템(FAT, FAT32, NTFS, EXT3 등등)을 설치해서 볼륨(Volume)을 만들고,
만들어진 볼륨에 할당된 문자(리눅스 라면 마운트 되는 파일)를 드라이브(Drive)라고 한다.
DISK → Partition(디스크를 논리적으로 분리) → Volume(파티션에 파일시스템을 설치)
  • MBR
Legacy BIOS 기반의 파티션 형식이다. 오래된 형식 이기 때문에 거의 모든 운영체게와 Legacy 및 UEFI 환경에서도 사용할 수 있다.
오래된 만큼 한계(4개의 주파티션, 2TB 한계 등)가 있다.
파티션 테이블 = 64byte, 파티션 1개 = 16byte, 64byte / 16byte = 4(파티션4개)
  • GPT
UEFI 기반으로 개발된 파티션 형식이다. 새로운 규격이기에 운영체제가 지원 해야만 사용할 수 있다.
GPT는 Legacy와 MBR의 한계를 극복하기 위한 목적으로 등장 했기에 MBR의 문제점 들을 해결 했다.
(128개의 주파티션, 18EB로 확장). GPT는 UEFI환경 에서만 사용 가능한것은 아니고 운영체제가 지원
한다면 Legacy에서도 사용할 수 있다. 다만 OS를 설치하고 부팅하느것은 불가능 하고 일반적인 데이터
를 저장 하는 용도로는 사용이 가능하다.
  • 정리 하자면
Legacy ―MBR, GPT(부팅×,데이터O)
UEFI ―MBR, GPT

5 SSD의 TRIM[ | ]

SSD 에서 TRIM 은 무엇인가? TRIM을 해줘야 다시쓰기 속도가 느려지지 않는다.

1. HDD 와 SSD 의 다른점
다시쓰기(rewrite)를 어떻게 하느냐 하는점이 다르고, 이 것 때문에 트림 이란 걸 해줘야 한다.
HDD: 데이터 쓰기 -> 삭제 마크 표시 -> 그 위에 덮어쓰기
SDD: 데이터 쓰기 -> 삭제 마크 표시 -> 데이터 삭제 -> 그 위에 다시 쓰기
HDD는 삭제마크를 해놓고 그 위에 다시쓰기를 바로 하면 되지만, SSD는 덮어쓰기가 불가능 하다.
따라서 삭제 마크를 한뒤에 다시쓰기 전에 삭제를 먼저 해줘야 하는데 이런 동작을 TRIM이라고 한다.
$ systemctl status fstrim.timer
리눅스는 자동으로 알아서 자알 관리되고 있다. 위의 systemctl status 명령으로 확인 가능하다.
작동중인지, 언제 작동 되는지 알 수 있다.

6 리눅스 부팅과정[ | ]

복잡한 과정은 생략하고 UEFI, GPT+ESP를 이용한 부팅 과정을 살펴 볼까 한다.
시난 블로그 UEFI 부팅구조
아는 개발자 부트로더
리눅스에서의 UEFI 부팅은 어떻게 파티션이 나뉘나요? UEFI -> GPT(ESP) -> GRUB2 뎃글이 갑
리눅스 부트과정 Woochul Kang 교수님 강의

Power ON → BIOS(Legacy BIOS, UEFI) → MBR or GPT+ESP → 부트로더(GRUB2) → 커널(Kernel) → Initial RAM Disk 
→ init or systemd -> 로그인(getty)
1. 전원을 견다
2. BIOS
ROM에 저장된 BIOS가 하드웨어를 초기화 한다.
부트로더를 로딩하는 코드를 디스크의 특정영역에서 찾아 메모리로 로드한다.
3. Legacy BIOS vs UEFI
3.1 Legacy BIOS - MBR 파티션
디스크의 MBR(Master Boot Record)에서 코드를 찾아 메모리(RAM)로 로드한다.
코드는 부드로더를 메모리로 로딩하고 실행한다
MBR의 코드 -> 부트로더 두단계로 나뉘는 이유는 MBR 코드의 크기가 매우작기 때문이다.
3.2 UEFI - GPT 파티션
GPT 파티션 중에서 ESP(EFI System Partition)을 찾아 부트로더(GRUB)를 실행한다.
파티션중 FAT32 파일시스템과, 최상단 경로에 EFI폴더를 가지고 있으면 ESP로 인식된다.
ESP는 FAT32 포맷으로 정의되어 있으며 파티션의 최상단 경로에 EFI 폴더를 가지고 있다.
어떤 디스크에 속해 있는지와 상관없이 FAT32, EFI 폴더 이 두가지를 만족하면 UEFI 펌웨어에서 이 파티션을 ESP로 인식할 수 있다.
EFI 시스템 파티션에는 부트로더 및 장치 드라이버, 데이터 파일 등이 포함되어 있으며 UEFI 펌웨어에서 부팅을 위해 사용된다.
4. 부트로더(Boot Loader)
커널(kernel)을 메로리로 로드(/boot/vmlinuz-버전-generic -> 루트 파일 시스템 마운트)하고,
Initial RAM Disk를 메모리 상에 가상으로 만든다.
5. Initial RAM Disk
메모리상의 가상의 디스크로 커널이 사용하게될 파일시스템(Initramfs)을 가지고 있다.
파일시스템(Initramfs) 에는 커널이 초기에 동작하기 위한 기본 드라이버와 프로그램들을 가지고 있다.
커널이 Initial RAM Disk의 Initramfs를 이용해서 초기화가 끝나면 제어를 다음(/sbin/init or systemd)으로 넘긴다.
6. systemd or init
기본 서비스(시간, 네트워크 등등)를 동작 시킨다.
  • systemd
stackframe systemd란 무었인가?
가능한 병렬로 프로그램을 실행시켜 부팅속도가 빠르다.
init보다 체계적이며 가독성 좋게 설정이 가능하다.
systemd : init 데몬
systemd-journald : 다른 데몬(프로세스)들의 출력(syslog, 표준, 에러 출력), 로그 저장 데몬
systemd-logind : 사용자 로그인, 세션 등 관리 데몬
systemd-udevd : 장치 관리자 데몬
-----------------------<이상 4개는 필수>---------------------------------------------------
systemd-networkd : 네트워크 관리 데몬. DHCP 뿐만 아니라 Virtual Lan 설정까지 가능
systemd-resolved : DNS 해석 데몬
systemd-timesyncd : NTP로 컴퓨터 시간 동기화 데몬
systemd-boot : UEFI 부트로더

#설정파일
/etc/systemd/

7 부트로더 GRUB2[ | ]

부트 로더 혹은 부트 메니저 라도도 불리는 GRUB2, 오늘의 내가 이해한 부분은 고작 요만큼이다.
참특수교육 부트로더 GRUB2 기초

  • GRUB2 설치 및 버전 알아보기
최신 배포판은 이미 설치가 되어 있다. 할 일 없다.
# 설치된 GRUB 버전 확인
# grub, grub2가 같이 설치 되어 있었다.

$ dpkg -l | grep grub
  • GRUB2 편집
이전 버전(GRUB)에서 사용하던 /boot/grub/menu.lst 는 더 이상 사용하지 않는다.
1. /boot/grub/grub.cfg - 건드리지 말자. 잘못 건드리면 부팅이 안될 수 있다.
2. /etc/default/grub - 설정 파일이다. 이걸 수정하면 된다. 수정한 후에 update-grub을 실행해야 변경사항이 grub.cfg 파일에 반영된다.
# 설정파일 편집
$ sudo vi /etc/default/grub

# grub파일을 편집후 update-grub명령으로 
# grub.cfg파일에 저장을 한다. 난 이렇게 이해 했다.
$ sudo update-grub
3. /etc/default/grub 내용중 필요하다 생각되는 변수들.
# 기본부팅
GRUB_DEFAULT=4
# 대기시간
GRUB_TIMEOUT=10

# 마지막으로 사용된 OS나 커널을 기본으로 설정한다.
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

8 systemd로 서비스 관리하기[ | ]

systemctl은 systemd의 전반적인 설정에 필수적인 명령으로, 앞으로 systemd를 사용하기 위해서 가장 많이 사용할 명령입니다.

# 실행중인 unit을 확인
$ systemctl list-units
# 실행중이 아닌 모든 unit까지 확인
$ systemctl list-units --all
# 실행중인 service unit만 확인
$ systemctl list-units -t service
# 실행중이 아닌 service unit까지 확인
$ systemctl list-units -t service --all
# 설치되어 있는 모든 unit을 확인
$ systemctl -t service list-unit-files

실행중이지 않은 서비스도 보고싶다면 --all 옵션을 함께 사용 unit-lists 명령은 실행중이 아니면서 부팅 때 로드되지 않은 (즉 enabled 되지 않은) 유닛은 출력하지 않습니다

$ systemctl status "유닛 명"

서비스들의 상태를 자세히 보려면 status 명령을 사용하면 됩니다.
유닛 파일 이름이 오면 되는데 기본적으로 확장자를 붙히지 않는다면 .service 유닛으로 간주합니다.
(bluetooth.service == bluetooth, .service 생략가능)

i972@i972-ThinkPad-E595:~$ systemctl status bluetooth
● bluetooth.service - Bluetooth service
   Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-06-11 23:48:21 KST; 1 day 2h ago
     Docs: man:bluetoothd(8)
 Main PID: 847 (bluetoothd)
   Status: "Running"
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/bluetooth.service
           └─847 /usr/lib/bluetooth/bluetoothd

 6월 11 23:48:56 i972-ThinkPad-E595 bluetoothd[847]: Endpoint registered: sender=:1.43 path=/MediaEndpoint/A2DPSink
 6월 12 00:02:22 i972-ThinkPad-E595 bluetoothd[847]: 68:5D:43:B7:86:CA: error updating services: Connection timed out (110)
 6월 12 00:03:07 i972-ThinkPad-E595 bluetoothd[847]: Authentication attempt without agent
 6월 12 00:03:07 i972-ThinkPad-E595 bluetoothd[847]: Access denied: org.bluez.Error.Rejected
 6월 12 00:03:25 i972-ThinkPad-E595 bluetoothd[847]: Authentication attempt without agent
 6월 12 00:03:25 i972-ThinkPad-E595 bluetoothd[847]: Access denied: org.bluez.Error.Rejected
 6월 12 20:27:32 i972-ThinkPad-E595 bluetoothd[847]: Endpoint unregistered: sender=:1.43 path=/MediaEndpoint/A2DPSource
 6월 12 20:27:32 i972-ThinkPad-E595 bluetoothd[847]: Endpoint unregistered: sender=:1.43 path=/MediaEndpoint/A2DPSink
 6월 12 20:27:33 i972-ThinkPad-E595 bluetoothd[847]: Endpoint registered: sender=:1.43 path=/MediaEndpoint/A2DPSource
 6월 12 20:27:33 i972-ThinkPad-E595 bluetoothd[847]: Endpoint registered: sender=:1.43 path=/MediaEndpoint/A2DPSink

line 3 Loaded:

- 경로는 해당 service 유닛이 존재하는 위치를 보여줍니다.
- 중간의 enabled 는 현재 이 서비스는 부팅 시 자동으로 실행 한다는 것을 나타냅니다. (disabled 부팅시 자동실행 않는다)
- vendor preset: enabled 설치하면 자동으로 부팅 때 시작

line 4 Active:

active 를 보면 현재 작동중.

line 12:

실행하면서 출력한 문자들로 systemd-journald에서 이 서비스에 관련된 부분을 알아서 가져와서 표시해준 겁니다.
# 서비스 시작
$ sudo systemctl start "유닛 명"
# 서비스 종료
$ sudo systemctl stop "유닛 명"
# 서비스 재시작
$ sudo systemctl restart "유닛 명"
# 설정파일 리로드
$ sudo systemctl reload "유닛 명"

주의할 점은 reload는 service 유닛에 ExecReload가 정의되어 있지 않다면 SIGHUP을 해당 프로세스에 보냅니다.
자신이 대충 적당히 만든 프로그램을 서비스로 등록하고 reload 명령을 내렸다간 SIGHUP을 받고 죽어버릴 수 있으니 유의하시기 바랍니다.

# 프로그램을 시작 프로그램으로 등록
$ sudo systemctl enable "유닛 명"
# 시작 프로그램에서 해제
$ sudo systemctl disable "유닛 명"

enable는 단지 시작 프로그램으로 등록하는 것이기 때문에 이 명령을 내린다고 프로그램이 실행되진 않습니다.
†등록만 하느것이니 리부팅을 해야 실행이 될것이다.


9 PPA(Personal Package Archive)란?[ | ]

맨날 쓰면서 뭔지도 모르고 그냥 쓴다는게, 의미 없게 느껴저 생각난 김에 정리 하려고 했는데, 이미 잘 되어 있어서 감사합니다.
<참조 사이트>
Crocus

  • PPA(Personal Package Archive)란?
개인 패키지 저장소란 뜻을 가진 PPA는 런치패드에서 제공하는 우분투의 공식 패키지 저장소에 없는 (혹은 있어도 최신버전이 아닌경우)
서드 파티 소프트웨어를 위한 개인용 소프트웨어 패키지 저장소이다.
# 저장소 추가
$ sudo add-apt-repository ppa:저장소이름
$ sudo apt-get update
$ sudo apt-get insall 패키지

# 저장소 삭제
$ sudo add-apt-repository --remove ppa:저장소이름

Ubuntu 18.04에서 블루투스 안되는 경우 해결 방법 https://webnautes.tistory.com/1337


10 우분투 Repositories란 무었인가?[ | ]

패키지 설치 한면서, 또 생각 없이 그냥 써 왔던것 중에 하나가 저장소(Repository)인것 같다.
<참고 사이트>
Abhishek Prakash

  • 우분투 저장소(Repositories)란 무었인가?
활성화, 비활성화 하는 방법은?
apt 페키지 관리자를 사용해 설치가 되는 프로그램 페키지를 우분투는 저장소라는 곳을 이용해 관리 하고 있다. 인터넷만 연결 되어 있다면 언제 든지 이용 할 수 있다.
그런데 이런 저장소가 하나가 아니고 여러개 가 있다. 왜 하나로 만들지 않고 여려개로 나눴는지 는 각각의 저장소를 살펴 보면서 알아 보자
  • 저장소의 종류
main
기본저장소, FOSS(무료 및 오픈소스 소프트웨어)
우분투 개발자가 검증한 보안업데이트 제공.
universe
FOSS는 동일하지만, 보안업데이트가 제공 되지 않는다.
multiverse
FOSS가 아닌 라이센스 및 법적 문제가 생길 수 있는 패키지로 구성.
모든 책임은 사용자에 있음
restricted
하드웨어 종속적인, 독점드라이버
partner
우분투에서 직접 패키징한 독점 소프트웨어(skype가 한때 제공 되었었다)
PPA
이제는 사용 못함, 막았음
이걸 막았다는건, 최신 버전의 패키지 정보를 잘 관리 하겠다는 건가? 명확한 언급은 안 보인다.
  • 저장소 활성화
$ sudo add-apt-repository universe
$ sudo add-apt-repository restricted
$ sudo add-apt-repository multiverse

$ sudo apt update
리포지토리를 추가 한 후 sudo apt update 명령을 사용하여 시스템에서 패키지 정보가있는 로컬 캐시를 생성해야 한다.
  • 저장소 비활성화
리포지토리 를 제거 하려면 sudo add-apt-repository -r universe 와 같이 -r을 추가하면 된다.
$ sudo add-apt-repository -r universe

$ sudo apt update
  • 마지막으로 패키지가 어느 저장소 있는지 모를 경우도 있다, 그럴때는 아래 사이트에서 확인이 가능하다.
우분투 패키지 검색

11 APT 패키지 관리자[ | ]

데비안 및 우분투 기반 리눅스 배포판(Linux Mint, elementary OS, Linux Lite등등)에서 사용하는 패키지 관리 명령

apt-get 명령이 있지만, 앞으로는 apt로 바뀐다고 하니 이제 부턴 이걸 쓰자, 이거 더 쉽고 깔끔하다.

  • 패키지 데이터베이스 업데이트
패키지에 대한 정보를 관리하는 데이터베이스의 사본이 내 시스템에 있다, 그렇다는건 더 최신 버전의 패키지에 대한 정보가 있을 수도 있다는 거다
그러니 가끔 업데이트를 해주는게 당연히 좋다.
번거롭게 외 이러나 싶기도 하지만, 이렇게 하면 매번 저장소에서 정보를 가져 오지 않아도 되기 때문에 빠르다는 설명을 하는데 요즘 같은 세상에 얼마나
빠를까 하는 의문은 든다.
$ sudo apt update    //수퍼유저 권한이 필요하다
  • 설치된 패키지 업그레이드
업데이트된 데이터베이스를 근거로 최신버전으로 업그레이드 시킨다.
$ sudo apt upgrade
$
$ sudo apt-full upgrade    //전체 업그레이드
$
$ sudo apt update && sudo apt upgrade -y    //업데이트와 업그레이드를 한방에
  • 패키지 설치
당연히 설치할 패키지의 이름을 알고 있을때, 이름을 다 몰라도 Tab 키 누르면 비슷한 이름(자동완성기능)을 나열해 준다.
$ sudo apt install <package_name>
  • 패키지 여러개 설치
이럴 일이 있을까? 한개 이상 설치해 본적은 없는데...
sudo apt install <package_name1> <package_name2> <package_name3>
  • 이미 설치된 패키지를 apt install로 또 설치하면?
설치된 패키지가 최신버전이라면 무시, 그렇지 않다면 업그레이드
  • 업그레이드 하지 않고 패키지를 설치하는 경우
이건 무슨 경우? 패키지의 특정 버전을 반드시 써야 하는 경우 혹시 업그레이드 버전이 존재 해도 무시하라 뭐 이런 의미 인것 같은데
$ sudo apt install <package_name> --no-upgrade
  • 특정 버전의 패키지를 설치
정확한 버전 번호를 알고 있어야 한다.
$ sudo apt install <package_name>=<version_number>
  • 패키지를 제거
패키지의 바이너리만 제거, 구성 파일을 남긴다.
$ sudo apt remove <package_name>
  • 패키지를 제거하는 또다른 방법
바이너리와 함께 구성파일 까지 한꺼번에 삭제.
$ sudo apt purge <package_name>
  • 패키지 검색
생각하는 것과 는 사뭇 다른 결과가 나왔다, 솔직히 별로였다...
어짜피 설치할 패키지의 이름은 이미 알고 있지 않을까?
$ apt search <search term>    //term이다 package_name이 아니다, 이럴려고 만든 명령이 아닌듯
  • 패키지가 내 시스템에 설치 되어 있는지 확인 하기
$ dpkg -s <package_name>
  • 패키지 내용보기
버전, 종속성등 패키지에 대한 정보를 확인할 수 있다.
$ apt show <package_name>
  • 시스템 청소
당황 스럽다 갑자기 시스템 청소?
패키지 삭제로 인해, 더이상 필요 없는 패키지를 제거한다 -> 이런 의미로 청소라고 하는것 같다.
$ sudo apt autoremove
  • 그외 나머지
위에 언급된 정도만 알아도 충분할거 같다, 다음으 내용은 몰라도 되지 싶다.
$ apt list --upgradeable    //업그레이드할 수 있는 리스트
$ apt list --installedapt list --installed    //시스템에 설치된 모든 패키지 리스트
$ apt list --all-versions    //사용 가능한 패키지 리스트(설치되지 않은)

12 리눅스 C 컴파일 하기[ | ]

  • <stdio.h> 해더파일이 없다고 컴파일 안될때
리눅스 민트는 기본적인 헤더 파일이 설치가 안되어 있다. build-essential 패키지를 설치해 주면 된다.
$ gcc char.c
$ gcc: error: char.c: 그런 파일이나 디렉터리가 없습니다
$ gcc: fatal error: no input files
$
$ sudo apt-get update
$ sudo apt-get install build-essential

13 리눅스 C 디버깅 하기 (GNU Debugger, GDB)[ | ]

Lactic's Archive GDB에 대해 아주 잘 설명 되어 있다.

  • 디버깅을 위한 준비
디버깅 정보를 추가 해서 컴파일을 해야 한다.
$ gcc -g test.c
  • GDB 실행
// GDB와 디버깅할 파일을 같이 오픈.
$ gdb a.out

// GDB실행후 디버깅할 파일을 오픈.
$ gdb
(gdb) file a.out
  • run(r) - 프로그램 실행
말그대로 실행이라, 처음부터 끝까지 촤르르륵 실행하고 끝난다.
(gdb) run
(gdb) r arg1 arg2        //인자가 필요할때
  • break(b) - 브레이크포인트 만들기
(gdb) break 37           //37라인전에 멈춤(36까지 실행)
(gdb) b main             //main함수 직전에 멈춤
  • clear(cl), delete(d) - 브레이크포인트 삭제
(gdb) clear main         //함수에 설정된 브레이크포인트 삭제
(gbd) cl 4               //4번째 줄 브레이크포인트 삭제 
(gdb) delete             //브레이크포인트 전체삭제
(gdb) d 3                //info break -> Num 번호
  • info(i) - 디버깅과 관련된 정보 확인
(gdb) info break         //브레이크포인트 확인
(gdb) i locals           //지역변수 확인 (지역변수의 범위는 확인이 필요)
  • list(l) - 소스코드 보기
(gdb) list               //처음 부터 10줄씩 소스코드 출력
(gdb) l 10               //10을 기준으로 위로 5줄, 아래로 4줄(총10줄) 소스코드 출력
  • continue(c) - breakpoint로 중단된 실행을 진행, 다음 브레이크포인트 전까지 없으면 끝까지 실행
(gdb) continue
(gdb) c
  • step(s), next(n) - 한줄씩 실행
(gdb) step(s)             //함수 내부로 이동(step in)후 한줄씩 실행
(gdb) next(n)             //함수 내부로 들어 가지 않고(step over)다음줄로 건너뜀
(gdb) s 3                 //3줄 실행
  • print(p) - 변수, 함수등의 값을 확인
(gdb) print main           //함수(main)의 주소
(gdb) p i                  //변수의 값
(gdb) p &i                 //변수의 주소
(gdb) p *((char*) 0x804834A)         //메모리 주소에 저장된 값 
(gdb) p i * 21 - 2         //수식의 값(일반 수식 지원)
  • set - 변수, 메모리에 저장된 값을 변경
(gdb) set i = 11           //변수값 변경
(gdb) set *((int*)0xBFD8EB9B) = 23  //메모리 주소의 값 변경

14 Wireshark 설치하기[ | ]

항상 그렇지만 나 보다 먼저 고민을 하신 현자 분들이 있었다.

Wireshark 설치 및 사용하기
군더더기 없이 정말 깔금하게 정리가 되어 있었다...감사합니다.
apt와 apt-get의 차이점 및 사용법도 넘나 잘 정리되어 있다.


  • Wireshark 설치하기
sudo add-apt-repository ppa:wireshark-dev/stable
sudo apt update
sudo apt install wireshark

sudo usermod -aG wireshark $(whoami)
수퍼 유저가 아닌 사용자가 패킷을 캡처하도록 허용 했으므로 사용자를 wireshark 그룹에 추가해야 한다.
마지막으로 한번 껏다가 켜 주면 끝.

15 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}