Backend/LINUX

[Chapter1] 리눅스의 추억13(feat. 막힘없이 실무까지)

GreatSaiyaman 2022. 7. 31. 22:18

※ 아래 포스팅은 제가 수강하였던 동영상 강의, 각종 블로그 혹은 공식 홈페이지에서 습득한 자료들 제 나름대로 재구성하여 포스팅 한 자료입니다. 잘못된 내용이 있을 수도 있습니다. 최대한 글 읽으시는 시간이 헛되지 않게 검토하여 올리겠습니다. 편하게, 재미있게 제 글을 읽어주셨으면 좋겠습니다. 틀린 부분이 있으면 댓글이나 메일 주시면 수정하여 놓겠습니다. 제 글을 읽어주셔서 감사합니다^^

- 목차 -

Chapter1. 리눅스 맛보기

Chapter2. 리눅스 활용하기

Chapter3. 리눅스 개발 및 운영하기

 

(34)-1. 리눅스에서 프로그램을 설치한다는 것

오늘은 패키지와 패키지 관리자라는 것에 대해서 알아보려고 합니다.

그런데 패키지와 패키지 관리자에 대해서 언급하기 전에...

리눅스에서 어떻게 프로그램을 설치할 수 있는건지에 대해서 먼저 언급하고자 합니다.

우리는 터미널 창을 켜서 어떠한 명령어를 입력해서 프로그램을 설치할 수도 있고,

리눅스의 애플리케이션 관리자라는 gui 프로그램을 이용해서 다운로드할 수 있습니다

전자에 언급한 것은 패키지 설치법이고 후자에 언급한 것은 설치 도구를 이용한 설치법입니다.

후자가 쉬우니 후자부터 설명드리면 제가 메인 피시로 사용하고 있는 리눅스 민트에서는 소프트웨어 관리자라는 툴이 있습니다. 아래와 같은 것인데요.

리눅스 민트의 소프트웨어 관리 도구

스마트폰으로 마켓에 들어가서 어플을 다운로드하는 것과 같이, 이곳에서도 프로그램을 다운로드해서 PC에 설치하여 관리할 수 있습니다. 위의 소프트웨어 관리 도구 말고도 시냅틱 패키지 관리자라는 프로그램도 있습니다. 그런데 저는 어느새 이것을 거의 쓰지 않게 되었습니다. 명령어로 진행하는 게 훨씬 편해졌습니다. 명령어로 명령해서 설치하는 것을 패키지 설치법이라고 하는데요.

일단 또다시 패키지 설치법에 대해서 언급하기 전에 패키지가 무엇인지 설명이 필요합니다.

(34)-2. 패키지에 대한 개념

우리는 데비안 계열의 리눅스를 사용하고 있으니, 데비안 계열의 리눅스만 일단 언급을 드리도록 하겠습니다.

레드헷 계열은 조금 다릅니다만 골짜개념을 잡으시면 레드헷 계열도 나중에 학습하시기에 어려움이 없으실 것으로 사료(?) 됩니다 ㅎㅎ. 근데 제가 레드헷 리눅스는 많이 다뤄보지를 않아서 함부로 말씀드리기가 어렵습니다 ㅜㅜ.

출처: 구글 / 이말년님 만화

윈도우에서는 무언가를 다운로드하면 응용 소프트웨어 같은 경우는 exe 확장자로 다운이 받아진 후에 그 설치 파일을 실행하면 응용프로그램 설치 과정이 진행이 되죠. 윈도우에서 보통 exe를 그냥 프로그램이라고 부릅니다.

리눅스에서도 복잡하게 생각하실 필요 없습니다.(복잡하긴 한데 이해를 돕기 위해서 그냥 이렇게 말씀드렸습니다)

그런데 프로그램보다 패키지라는 개념이 조금 더 큰 개념이라고 생각해 주시면 됩니다.

패키지는 프로그램뿐만 아니라, 라이브러리/문서/소스코드 등등을 모두 포함해서 패키지라고 합니다.

리눅스에서는 패키지를 다운로드하게 되면. exe 확장자가 아니라. deb 확장자로 저장이 됩니다.

이. deb 확장자로 된 설치 파일을 로컬에 설치하기 위해서는 조금 특별한 명령어가 필요합니다. 그것과 관련된 내용은 다음 번호에서 알아보도록 하겠습니다.

 

(34)-3. 패키지 설치법의 종류

여러분 우분투로 무언가 설치하려고 구글링을 해보시면 어떤 포스팅에서는 dpkg를 사용해서 install을 하고 어떠한 포스팅에서는 apt라는 놈을 이용해서 install을 하는 것을 보실 수가 있으실 겁니다.

참고로 패키지 설치법을 살펴보시는 분들 중에서는 "아니 뭐야 프로그램(패키지) 하나 다운로드하는데 뭐 이렇게 복잡해!"라고 생각하실 수도 있는데, 참고로 리눅스에서는 이렇게 설치하기 이전에는

- 소스코드를 다운로드한다

- 내가 직접 컴파일하고

- 설치하고

- 실행하고

위 와 같은 과정으로 프로그램을 돌렸다고 합니다 ㅋㅋㅋㅋ 저도 이걸 겪은 세대가 아니라서 저게 의미하는 바가 얼마나 극단적인지는 잘 모르겠습니다만 직접 컴파일해야 한다는 대목에서 많이 힘들었을 것으로 추측됩니다...

다시 돌아와서, dpkg와 apt 두 가지 명령어 모두 리눅스에서 패키지를 설치하는 것을 도와주는 명령어입니다.

(34)-3-(1). dpkg

dpkg는 debian package의 약자입니다.

dpkg 주고싶은옵션 패키지이름.deb

이런 식으로 명령어를 입력한 다음 설치가 가능한 설치법입니다.

아래와 같이 설치한 패키지를 확인할 수도 있고요.

brandon@brandon-VirtualBox:/etc/apt$ dpkg -l | grep vim
ii  vim                                        2:7.4.1689-3ubuntu1.4                           amd64        Vi IMproved - enhanced vi editor
ii  vim-common                                 2:7.4.1689-3ubuntu1.4                           amd64        Vi IMproved - Common files
ii  vim-runtime                                2:7.4.1689-3ubuntu1.4                           all          Vi IMproved - Runtime files
ii  vim-tiny                                   2:7.4.1689-3ubuntu1.4                           amd64        Vi IMproved - enhanced vi editor - compact version

-r 옵션을 주면 삭제, -P 옵션을 주면 설정 파일까지 삭제할 수가 있습니다.

이 명령어에 대해서, 그러니까 옵션과 기능에 대해서 조금 더 설명드려도 되지만 이 명령어는 많이 쓰이지 않는 추세입니다. 저 같은 경우는 웹에서. deb 확장자 파일 다운로드하고 설치할 때 빼고는 거의 사용하지 않습니다.

바로 의존성 문제 때문인데요. 위처럼 프로그램을 설치하려고 하면 빈번하게 아래와 같은 문구가 발생합니다.

dpkg: dependency problems prevent configuration of openttd:

그러면 무엇이 문제인지 로그를 보면서 찾아야 합니다. 위의 예시는 조금 구체적이지 않은데 예를 들어서 저번처럼 웹브라우저 같은 프로그램을 설치하면 웹브라우저를 띄워줄 브라우저 창에 대한 설치가 되지 않았다면서 오류가 나는 경우도 있고. 아마 리눅스상에서 팀뷰어 돌리고 싶으신 분들은 팀뷰어 설치하시면서도 위와 같은 의존성 에러를 많이 마주치셨을 겁니다. 그래서 다운로드해서 로컬에서 해결하는 방식이 아니라 저장소에서 끌어와서 설치하는 apt 명령어를 이용합니다. apt 명령어는 기존의 dpkg의 의존성 문제를 해결한 명령어입니다.

그럼 이제부터 apt라는 패키지 설치 툴과 apt 저장소에 대해서 알아보겠습니다. 저장소도 같이 알아보는 이유는 모든 설치는 이 '저장소'를 통해서 이루어지기 때문입니다.

(34)-3-(2). apt와 패키지 저장소의 개념

패키지 저장소는 패키지의 정보를 저장하고 있는 저장소 개념입니다.

조금 쉽게 설명드리면 패키지는 프로그램의 조금 더 큰 개념이라고 설명드렸었고, 이 패키지들을 관리하고 있는 곳이 웹상에 분명 있습니다. 그 곳에서는 그 패키지를 올린 개발자분들이 프로그램을 업데이트하거나, 또 개발하거나 하는 작업들을 하실 겁니다. 그래서 source.list에 그 주소에 대한 목록이 있는 것입니다. 우리도 어딘가에서는 소스코드를 받아와야 되는 것이니까요. 그런데 이런 것들이 수시로 이루어지게 될 것 아닙니까?! 그렇다면 이것과 관련된 것은 모두 저장소에 위임하고. 이용하는 사람들은 저장소로부터 업데이트된 내역을 불러오거나 패치를 하면 사용하는 사람과 개발하는 사람 모두 편하고 좋을 것입니다. 조금 정리해서 설치 과정에 대해서 설명드리는 것이 좋을 것 같습니다.

1. apt로 원하는 패키지 설치(apt install 다운받고자하는패키지이름)

2. /etc/apt/source.list 파일을 열어서 저장소 주소 확인

3. 설치와 관련된 패키지 목록을 요청

4. 설치와 관련된 패키지 목록만 다운로드

5. 설치할 패키지와 연관이 있는 패키지를 화면에 출력

6. 설치할 패키지를 다운로드해서 자동 설치

위 순서를 봐도..... 그러니까 "어떤 식으로 설치가 되는 건데?"라는 질문이 꼬리에 꼬리를 물어서 정리를 했던 기억이 납니다. 1번과 3-6번은 딱히 큰 이해가 필요가 없습니다.

그런데 2번을 보시면 "응?" 하실 겁니다. source.list라는 게 뭔지 모르거든요.

이곳은 아까 말씀드렸던 것처럼 저장소들의 주소가 모여있는 곳입니다. 윈도를 예로 들면 우리는 원하는 프로그램을 방문하기 위해서 아래와 같은 절차를 거치게 됩니다.

1. 다운로드를 원하는 프로그램의 웹사이트 방문

2. 원하는 프로그램 다운로드

3. 설치

그런데 리눅스에서는 만약 ...

apt install 패키지이름

이런 식으로 설치를 진행하게 되면, sources.list에 있는 주소로 설치와 관련된 패키지 목록만 다운로드하는 것입니다.

그렇기 때문에 어떤 프로그램은 sources.list에 저장소 주소를 추가해 주어야 되고, 어떤 프로그램은 sources.list에 저장소를 추가하지 않아도 되는 것입니다. 만약 해당 패키지에 관련된 저장소가 추가되어 있지 않다면 오류가 나면서 다운로드해지지가 않습니다. 이러한 것들은 설치에 실패하면 리눅스가 친절하게 뱉어줍니다.

결론적으로 다시 정리해보면

1. apt로 원하는 패키지 설치(apt install 다운받고자하는패키지이름)

2. /etc/apt/source.list 파일을 열어서 저장소 주소 확인(다운로드하고자 하는 패키지의 저장소가 없으면 다운 불가능)

3. 설치와 관련된 패키지 목록을 요청

4. 설치와 관련된 패키지 목록만 다운로드

5. 설치할 패키지와 연관이 있는 패키지를 화면에 출력

6. 설치할 패키지를 다운로드해서 자동 설치

위의 절차에서 중요하게 언급한 2번에 대해 재차 알아보았고 우리는 이제 어떤 식으로 리눅스에 패키지가 설치되는지 알게 되었습니다. 그렇다면, 이 패키지 저장소를 어떻게 관리하는 게 좋을까요?

일단 sources.list를 한번 살펴보겠습니다.

brandon@brandon-VirtualBox:/etc/apt$ sudo vim /etc/apt/sources.list
# deb cdrom:[Ubuntu 16.04.7 LTS _Xenial Xerus_ - Release amd64 (20200806)]/ xenial main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://kr.archive.ubuntu.com/ubuntu/ bionic main restricted
# deb-src http://kr.archive.ubuntu.com/ubuntu/ xenial main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://kr.archive.ubuntu.com/ubuntu/ bionic-updates main restricted
# deb-src http://kr.archive.ubuntu.com/ubuntu/ xenial-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://kr.archive.ubuntu.com/ubuntu/ bionic universe
# deb-src http://kr.archive.ubuntu.com/ubuntu/ xenial universe
deb http://kr.archive.ubuntu.com/ubuntu/ bionic-updates universe
# deb-src http://kr.archive.ubuntu.com/ubuntu/ xenial-updates universe

그러면 위와 같이 deb로 시작하는 단어는 뒤에 나올 주소가 아카이브 형식의 저장소라는 것을 뜻합니다.

하나하나 짚어보면 주소는 패키지 저장소의 실제 주소입니다. 저쪽으로 접속을 해보면...

리눅스 레포 저장소

이런 식으로 구식의 UI(이것을 아카이브 형태라고 합니다)와 함께 배포 파일들이 올라와 있습니다.

이곳이 패키지 저장소이고, 우리는 이렇게 생긴 수많은 패키지 저장소들의 주소를 관리하게 되는 곳이 바로..

brandon@brandon-VirtualBox:/etc/apt$ sudo vim /etc/apt/sources.list

이곳에서 관리하고 있었다는 것이죠.

아까 패키지 저장소를 추가해 주어야 할 일이 생길 것이라고 말씀드렸죠? 그때는 아래 명령어를 사용하여 갱신해 주어야 합니다.

sudo apt update
sudo apt update
무시:1 http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 InRelease                                                   
기존:2 http://dl.google.com/linux/chrome/deb stable InRelease                                                                
기존:3 http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 Release                                                     
기존:4 http://linux.teamviewer.com/deb stable InRelease                                                                      
오류:5 http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 Release.gpg                                                 
  다음 서명이 올바르지 않습니다: KEYEXPIRED 1570654450
기존:6 http://linux.teamviewer.com/deb preview InRelease                                                                     
받기:7 http://security.ubuntu.com/ubuntu xenial-security InRelease [109 kB]                                                  
기존:8 http://archive.canonical.com/ubuntu xenial InRelease                                                                  
기존:10 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu xenial InRelease                                                      
기존:11 http://archive.ubuntu.com/ubuntu xenial InRelease                                                                    
오류:9 https://dl.yarnpkg.com/debian stable InRelease

개발자분들이 패키지를 새로운 버전으로 업데이트하셨을 수도 있고, 새로운 기능이 추가되었을 수도 있습니다.

프로그램을 하나하나 마우스로 클릭하여 업그레이드하는 것이 아니라, 명령어로 패키지와 관련된 패키지 저장소에서 변경사항을 전부 갱신하는 것이 정말 매력적인 것 같습니다.

sudo apt upgrade
.
.
.
.  
libpolkit-backend-1-0 libpolkit-gobject-1-0 libpoppler-glib8 libpostproc-ffmpeg53 libpq-dev libpq5 libproxy-tools
  libproxy1-plugin-gsettings libproxy1-plugin-networkmanager libproxy1v5 libproxy1v5:i386 libpulse-mainloop-glib0
  libpulse-mainloop-glib0:i386 libpulse0 libpulse0:i386 libpulsedsp libpulsedsp:i386 libpython2.7 libpython2.7-minimal
  libpython2.7-stdlib libpython3.5 libpython3.5-minimal libpython3.5-stdlib libqmi-proxy libqt5core5a libqt5dbus5 libqt5gui5
  libqt5libqgtk2 libqt5network5 libqt5opengl5 libqt5printsupport5 libqt5sql5 libqt5sql5-sqlite libqt5widgets5 libqt5xml5
  libraw15 librsvg2-2 librsvg2-2:i386 librsvg2-common librsvg2-common:i386 libruby2.3 libsane libsane:i386 libsane-common
  libsasl2-modules libsdl-image1.2 libsdl-image1.2:i386 libseccomp2 libservlet3.0-java libservlet3.1-java libsmartcols1
  libsmbclient libsndfile1 libsndfile1:i386 libsnmp-base libsnmp30 libsoundtouch1 libsox-fmt-alsa libsox-fmt-base libsox2
  libss2 libssh-gcrypt-4 libssl-dev libssl1.0.0 libssl1.0.0:i386 libsvn1 libswresample-ffmpeg1 libswscale-ffmpeg3
  libsystemd0 libsystemd0:i386 libtirpc1 libtomcat7-java libtomcat8-java libudev1 libudev1:i386 libvncclient1 libvncserver1
  libwayland-egl1-mesa libwbclient0 libwebkit2gtk-4.0-37 libwinpr-crt0.1 libwinpr-dsparse0.1 libwinpr-environment0.1
  libwinpr-file0.1 libwinpr-handle0.1 libwinpr-heap0.1 libwinpr-input0.1 libwinpr-interlocked0.1 libwinpr-library0.1
  libwinpr-path0.1 libwinpr-pool0.1 libwinpr-registry0.1 libwinpr-rpc0.1 libwinpr-sspi0.1 libwinpr-synch0.1
  libwinpr-sysinfo0.1 libwinpr-thread0.1 libwinpr-utils0.1 libx11-6 libx11-6:i386 libx11-data libx11-xcb1 libx11-xcb1:i386
  libxatracker2 libxfreerdp-client1.1 libxkbcommon-x11-0 libxkbcommon0 linux-base linux-firmware linux-libc-dev locales lshw
  mint-artwork-common mint-mirrors mintsystem modemmanager mokutil mozo multiarch-support mysql-client-5.7
  mysql-client-core-5.7 mysql-common mysql-server mysql-server-5.7 mysql-server-core-5.7 network-manager nfs-common nordvpn
  nvidia-384 nvidia-opencl-icd-384 openssh-client openssl openvpn p7zip patch pciutils perlmagick pix pix-data policykit-1
  policykit-desktop-privileges ppp pulseaudio pulseaudio-module-bluetooth pulseaudio-module-x11 pulseaudio-utils python-apt
  python-apt-common python-aptdaemon python-aptdaemon.gtk3widgets python-cryptography python-ecdsa python-imaging
  python-libxml2 python-lxml python-openssl python-paramiko python-pil python-renderpm python-reportlab
  python-reportlab-accel python-samba python-sip python-twisted-bin python-twisted-core python-twisted-names
  python-twisted-web python2.7 python2.7-minimal python3-apt python3-aptdaemon python3-aptdaemon.gtk3widgets
  python3-aptdaemon.pkcompat python3-cryptography python3-louis python3-lxml python3-pil python3-psutil python3-reportlab
  python3-reportlab-accel python3-requests python3-urllib3 python3.5 python3.5-minimal qpdf rake resolvconf rpcbind rsync
  rsyslog ruby2.3 samba-common samba-common-bin samba-libs sane-utils slack-desktop smbclient sox ssh-askpass-gnome streamer
  sublime-text sudo systemd systemd-sysv tcpdump teamviewer thunderbird thunderbird-gnome-support tzdata ubuntu-minimal
  ubuntu-system-adjustments udev unrar ureadahead user-setup vim vim-common vim-runtime vim-tiny virtualbox-dkms
  wpasupplicant xawtv-plugins xserver-common xserver-xorg-core xserver-xorg-legacy
427개 업그레이드, 13개 새로 설치, 0개 제거 및 11개 업그레이드 안 함.
732 M바이트 아카이브를 받아야 합니다.
이 작업 후 540 M바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까? [Y/n]

이런 식으로 업그레이드할 수 있는 패키지들의 목록이 엄청나게 많이 뜨면서 디스크 공간을 잡아먹는다고 나옵니다.

그런데 저 같은 경우 개인 pc에서 사용하다 보니 업그레이드를 자주 해주는데, 서버에서 이걸 사용한다고 하면 안정성이 가장 중요하기 때문에 자주자주 업그레이드할 것 같진 않습니다.

 

apt 업그레이드와 업데이트의 차이

위 그림은 업데이트와 업그레이드에 대한 차이를 알려주는 그림입니다.

이 외에도 패키지를 지우는 remove 명령어, 파일뿐만 아니라 설정까지 지우는 purge 명령어 등등

purge의 경우 패키지 삭제 + 설정 파일 삭제라고 말씀드렸는데요. 패키지와 설정 파일에 대해서 분리해서 생각해야 한다. uninstall의 경우 개발자가 얼마나 unintall을 제대로 구현했냐에서 차이가 있어서 깔끔하게 지우고 싶으시면 purge를 사용하셔야 합니다.

sudo apt autoremove를 통해 귀찮음을 조금 덜으면서 불필요한 패키지를 삭제하기도 합니다.

apt list: 설치 가능한 패키지 목록 나열

apt llist --installed: 설치된 패키지 목록 나열

apt --upgradeable: 업그레이드 가능한 패키지 목록 나열

apt search: 특정 패키지 찾기

apt show: 의존성이 엮여있는 모든 패키지의 목록을 보여줍니다. 다운로드 사이즈도 보여주고 information을 확인하기 위한 옵션이라고 보시면 됩니다.

등등...

오늘은 어떻게 리눅스에서 패키지가 설치가 되고, 어떻게 관리가 되는지에 대해서 대략적으로 살펴보았습니다.

많이 부족한 포스팅인 것 같습니다. 더 아는 것이 늘어갈수록 포스팅의 내용을 추가해 나가도록 하겠습니다.

다음 시간에는 시스템 모니터링하는 방법에 대해서 알아보겠습니다.

감사합니다.

PS. 이 포스팅의 경우에는 제가 검색하고 공부하면서 알게된 사실이 더 많아서, 해당 자료들을 수집한 블로그를 이곳에 남겨두고자 합니다. 제 블로그도 봐주시고 다른분들 블로그도 한번씩 봐주시면 감사할 것 같습니다.

링크 깨지는 부분있으면 메일이나 댓글남겨주시면 감사하겠습니다.

https://wnw1005.tistory.com/374

 

sources.list와 /etc/apt/sources.list.d/ 내 파일 설정

[관련 게시물] 2020/05/10 - [리눅스/Ubuntu] - 데비안(Debian), 우분투(Ubuntu)의 APT 계열 명령 연재 목록 2020/05/12 - [리눅스/Ubuntu] - apt 명령 사용법 - APT(Advanced Packaging Tool) 패키지 관리 도구..

wnw1005.tistory.com

https://turtle-it.tistory.com/3

 

Ubuntu 프로그램 설치 명령 (apt-get)

Ubuntu에서 프로그램 관리 명령은 dpkg, apt-get 이 있습니다. dpkg의 경우 초창기 명령이며 요즘은 패키지 의존성 문제때문에 거의 사용하지 않는다고 합니다. apt-get은 dpkg의 패키지 의존성 문제를 해

turtle-it.tistory.com

Thanks for reading!