-
[Chapter1] 리눅스의 추억8(feat. 막힘없이 실무까지)Backend/LINUX 2022. 6. 28. 07:37
본 포스팅은 2020년에 작성했던 포스팅입니다, blog를 이관하게 되어 재포스팅 하였습니다.
아래 포스팅은 제가 수강하였던 동영상 강의, 각종 블로그 혹은 공식 홈페이지에서 습득한 자료들 제 나름대로 재구성하여 포스팅 한 자료입니다. 잘못된 내용이 있을 수도 있습니다. 최대한 글 읽으시는 시간이 헛되지 않게 검토하여 올리겠습니다. 편하게, 재미있게 제 글을 읽어주셨으면 좋겠습니다. 틀린 부분이 있으면 댓글이나 메일 주시면 수정하여 놓겠습니다. 제 글을 읽어주셔서 감사합니다^^
- 목차 -
Chapter1. 리눅스 맛보기
Chapter2. 리눅스 활용하기
Chapter3. 리눅스 개발 및 운영하기
안녕하십니까. 오늘은 파일 시스템(File System)에 대해서 조금 더 알아보는 시간을 가져보도록 하겠습니다.
저번 시간에 파일 보는 법을 알아봤는데 뭘 또 파일에 관해서 알아보냐고요? 제 포스팅으로 다뤄도 너무 내용이 많아서 사실 어디까지 다뤄야할지 모를 정도입니다 ㅠㅠ 알아야할게 많습니다...ㅠㅠ 그래서 더 읽어주시면 감사하겠습니다. 이전 포스팅에서는 명령어 위주로 알아보았는데요. 오늘의 포스팅에서는 시스템을 운영할 때에 "어디에 로그가 쌓이는지?" 그리고 "어떠한 명령어들을 조합해서 우리가 원하는 결과를 검색할 수 있을지?"에 대해서 알아보는 시간을 가지도록 할게요. 그리고 리눅스 명령어는 명령어는 끝이 없으니 디렉토리 위주로 설명드리되 명령어도 같이 설명드리겠습니다.
(22). /etc 디렉토리와 중요 *demon들
예전에 중요한 디렉토리라고 해서 몇 가지 디렉토리를 제가 언급한 적이 있습니다.
그런데, 왜 중요한 디렉토리인지 자세하게 설명을 못 드린 디렉토리도 있고 언급하지 않은 디렉토리도 있더군요.
그 중에서 몇 가지 폴더에 대해 추가 설명을 해드리려고 합니다.
*demon 이란?
출처: 구글 위 demon이 아닙니다. ㅎㅎ 예전에 d는 demon을 뜻한다는 글을 보고 처음에는 무슨 부정적인 의미를 함축한 위험한 명령어인 줄 알았습니다. Linux에서 demon은 리눅스 시스템이 처음 부팅 되었을 때 실행되는 Background Process의 일종입니다. 언제든 대기하고 응답을 받을 수 있도록 계속 돌아가는 프로세스라고 보시면 됩니다. 안드로이드 운영체제에도 그래서 카카오톡이 화면을 점유하고 있지 않아도, 어플을 종료하고 있어도 메시지가 계속 들어오죠? 안드로이드 운영체제에서도 이것을 일컬어 Service라고 합니다. Window에서도 마찬가지로 Service라고 합니다. 이런 것처럼 demon, service 이런 개념은 비단 리눅스에서만 쓰이는 것이 아니라 다른 곳에서도 쓰이는 개념이라서 제가 아는 만큼 보이는 만큼 이런 식으로 포스팅 중간에 간간히 다루도록 하겠습니다.
ps. 제가 이따금씩 디렉토리와 폴더라는 워딩을 혼용해서 쓰는 것 같은데 최대한 디렉토리라는 워딩으로만 사용하도록 노력하겠습니다. 둘이 의미하는 바는 같습니다.
ps2. vi, vim, nano 중에 vim을 이용해서 파일 편집을 할 예정입니다. 저는 이 중에서 vim을 가장 선호하고, IntelliJ에서 개발을 할 때에도 linux에서의 명령어를 까먹지 않게 하기 위해서 vim 설정을 해놓고 개발합니다. vim에 대한 간단한 포스팅은 추후에 다루도록 하겠습니다. 아래 과정에서는 일단 그냥 따라 해주시면 감사할 듯합니다.
서론이 좀 길었던 것 같습니다. 일단 리눅스로 서버를 운영하시면서 가장 빈번하게 봐야 하는 파일 디렉토리는 /etc 디렉토리입니다.많이 보게 될 디렉토리입니다. 웹 어플리케이션서버, 무슨 무슨 서버 등등 설정 파일들은 전부 이곳에 모입니다. 우선 /etc 디렉토리로 이동해보겠습니다.
(22)-1.dhcp
공유기에서 'dhcp 자동으로 할당하기'라는 옵션을 보신 적이 있으실 겁니다.
그것에 관련된 demon과 설정 파일이 있는 폴더입니다.
brandon@brandon-VirtualBox:/etc$ ls -l dhcp/ total 16 -rw-r--r-- 1 root root 1426 10월 4 2015 debug -rw-r--r-- 1 root root 1735 1월 14 2016 dhclient.conf drwxr-xr-x 2 root root 4096 8월 28 15:53 dhclient-enter-hooks.d drwxr-xr-x 2 root root 4096 8월 7 07:50 dhclient-exit-hooks.d
brandon@brandon-VirtualBox:/etc/dhcp$ vim dhclient.conf
# Configuration file for /sbin/dhclient. # # This is a sample configuration file for dhclient. See dhclient.conf's # man page for more information about the syntax of this file # and a more comprehensive list of the parameters understood by # dhclient. # # Normally, if the DHCP server provides reasonable information and does # not leave anything out (like the domain name, for example), then # few changes must be made to this file, if any. # option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; send host-name = gethostname();
Tip. dhcp 디렉토리와는 무관하지만 여러분 혹시 리눅스 곳곳을 탐험하시다가 어라 이거 뭐지 싶으신데 어떠한 명령어에 대한 설명은 아니라서 man으로 검색해보기는 어렵고, 이 파일이 무슨 일을 하는지 궁금하다 싶은 순간이 많으신 분들 있지 않은가요? 저는 그런 경우 사용하는 명령어가 있는데 아래와 같이 whatis라는 명령어를 사용합니다. 설명이 정말 친절하게 잘 나오는 것 같습니다. whatis 붙여서 쓰셔야 합니다.
brandon@brandon-VirtualBox:/etc/dhcp$ whatis dhclient.conf dhclient.conf (5) - DHCP client configuration file
(22)-2. logrotate.d, logrotate.conf
logrotate를 직역하면 로그 순환, 로그 회전이죠? 이름으로 유추해볼 수 있듯이 로그의 주기 관련돼서 다루는 디렉토리와 파일입니다. logrotate라는 프로그램 자체는 리눅스에서 로그파일을 관리하기 위해 만들어진 프로그램입니다. 시스템 로그를 어느 주기로/ 최대 얼마나 백업할지 등등.. 을 정할 수 있습니다.
brandon@brandon-VirtualBox:/etc$ vim logrotate.conf
# see "man logrotate" for details # rotate log files weekly weekly # use the syslog group by default, since this is the owning group # of /var/log/syslog. su root syslog # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress
(22)-3. date, timezone
(22)-3-(1). date
brandon@brandon-VirtualBox:/etc$ date 2020. 09. 11. (금) 10:23:45 KST
(22)-3-(2).timezone
date가 상세 날짜라고 한다면 timezone은 aira 같은 개념으로 생각해 주시면 될 것 같습니다. 자신이 거주하고 있는 나라 정도라고 이해하시면 편할 듯합니다. timezone 같은 경우 어차피 리눅스 초기에 setting 할 때 설정하는 항목 중 하나이지만 영어공부를 위해서 한글->영어로 timezone을 바꾸고 싶은 분들, 아니면 반대로 영어에서 -> 한글로 바꿔서 보고 싶은 분들. 현재 외국의 시간을 알고 싶은 분들 등등 쉘에서 편리하게 시간에 관련된 무언가를 확인한 거나 변경할 수 있는 명령어입니다.
우선 각 나라별로 어떤 식으로 timezone 이름이 작명되어 있는지 확인해야 합니다.
우선, timezone이라는 키워드 만으로도 날짜를 확인할 수가 있습니다. 하지만 자신이 살고 있는 지역을 자주 검색하는 분이 많지는 않을 것으로 생각됩니다.....
brandon@brandon-VirtualBox:/etc$ cat /etc/timezone Asia/Seoul
/usr/share/zoneinfo에서 timezone에 대한 이름을 확인합니다.
brandon@brandon-VirtualBox:/usr/share/zoneinfo$ ls Africa Brazil Egypt GB Hongkong Jamaica Mexico Poland ROC US America Canada Eire GB-Eire HST Japan MST Portugal ROK UTC Antarctica CET EST GMT Iceland Kwajalein MST7MDT posix Singapore WET Arctic Chile EST5EDT GMT0 Indian leap-seconds.list Navajo posixrules SystemV W-SU Asia CST6CDT Etc GMT-0 Iran Libya NZ PRC Turkey zone1970.tab Atlantic Cuba Europe GMT+0 iso3166.tab localtime NZ-CHAT PST8PDT UCT zone.tab Australia EET Factory Greenwich Israel MET Pacific right Universal Zulu
일시적으로 timezone을 변경하는 방법
여기서 말하는 일시적이란 현재 사용하는 터미널에서만 timezone을 지정하는 나라로 지정하고 싶은 경우를 이야기합니다.
brandon@brandon-VirtualBox:/etc$ date 2020. 09. 11. (금) 10:37:48 KST
현재의 시간은 이렇지만 만약 Arica로 변경하게 되면 ...
brandon@brandon-VirtualBox:/etc$ export TZ=/usr/share/zoneinfo/Africa brandon@brandon-VirtualBox:/etc$ date 2020. 09. 11. (금) 01:38:21
이렇게 됩니다. 아프리카는 지금 새벽이네요... 그러고 나서 timezone 설정을 해제해 줍니다.
brandon@brandon-VirtualBox:/etc$ unset TZ brandon@brandon-VirtualBox:/etc$ date 2020. 09. 11. (금) 10:41:37 KST
그러면 원래대로 날짜가 돌아옵니다.
(22)-3-(3).영구적으로 timezone을 변경하는 방법
brandon@brandon-VirtualBox:/etc$ sudo dpkg-reconfigure tzdata [sudo] password for brandon:
root 권한을 빌려와서 위 명령어를 입력하시고 패스워드를 입력하시면 보라색 초기 설정 화면이실 겁니다.
그곳에서 설정해 주시면 됩니다.
(22)-4. 현재 배포 버전 확인하기
아주 자주 사용한다고 볼 순 없지만, 간간히 사용하게 되는 명령어들입니다.
(22)-4-(1). 간단하게 버전만 확인하기
brandon@brandon-VirtualBox:/etc$ cat /etc/issue Ubuntu 16.04.7 LTS \n \l
(22)-4-(2).종합적인 정보 확인하기
brandon@brandon-VirtualBox:/etc$ cat /etc/*release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.7 LTS" NAME="Ubuntu" VERSION="16.04.7 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04.7 LTS" VERSION_ID="16.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" VERSION_CODENAME=xenial UBUNTU_CODENAME=xenial
(22)-4-(3).커널 정보 확인하기
brandon@brandon-VirtualBox:/etc$ uname -a Linux brandon-VirtualBox 4.15.0-112-generic #113~16.04.1-Ubuntu SMP Fri Jul 10 04:37:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Tip. 현재 지정되어 있는 언어의 정보와 함께 char-set 확인하기
brandon@brandon-VirtualBox:/etc$ locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC=ko_KR.UTF-8 LC_TIME=ko_KR.UTF-8 LC_COLLATE="en_US.UTF-8" LC_MONETARY=ko_KR.UTF-8 LC_MESSAGES="en_US.UTF-8" LC_PAPER=ko_KR.UTF-8 LC_NAME=ko_KR.UTF-8 LC_ADDRESS=ko_KR.UTF-8 LC_TELEPHONE=ko_KR.UTF-8 LC_MEASUREMENT=ko_KR.UTF-8 LC_IDENTIFICATION=ko_KR.UTF-8 LC_ALL=
(23). /var, /var/log
brandon@brandon-VirtualBox:/var$ ls backups cache crash lib local lock log mail metrics opt run snap spool tmp
var 디렉토리는 다이내믹하게 생성되는 여러 파일이 있습니다.
시스템 프로세스의 각종 임시 파일들 및 로그 파일들은 어디서 확인하는 걸까요? /etc 디렉토리만큼 자주 확인하는 곳이 /var 디렉토리라고 생각합니다. system에 관련된 cache나 log 파일들이 여기에 쌓입니다.
logrotate가 로그파일에 백업본을 만들고 더 오래되었을 경우에는 자동으로 압축을 해주기도 합니다.
그중에서도 특히 log 디렉토리로 이동을 해서 log 파일들을 보면 ....
brandon@brandon-VirtualBox:/var/log$ cat syslog.1 | more -10 Sep 10 07:35:02 brandon-VirtualBox anacron[31029]: Job `cron.daily' terminated Sep 10 07:35:02 brandon-VirtualBox anacron[31029]: Normal exit (1 job run) Sep 10 07:35:10 brandon-VirtualBox dhclient[808]: DHCPREQUEST of 192.168.58.101 on enp0s8 to 192.168.58.100 port 67 (x id=0x3e8a2674) Sep 10 07:35:10 brandon-VirtualBox dhclient[808]: DHCPACK of 192.168.58.101 from 192.168.58.100 Sep 10 07:35:10 brandon-VirtualBox NetworkManager[674]: <info> [1599690910.6059] address 192.168.58.101 Sep 10 07:35:10 brandon-VirtualBox NetworkManager[674]: <info> [1599690910.6068] plen 24 (255.255.255.0) Sep 10 07:35:10 brandon-VirtualBox NetworkManager[674]: <info> [1599690910.6075] server identifier 192.168.58.100 Sep 10 07:35:10 brandon-VirtualBox NetworkManager[674]: <info> [1599690910.6081] lease time 1200 Sep 10 07:35:10 brandon-VirtualBox NetworkManager[674]: <info> [1599690910.6089] dhcp4 (enp0s8): state changed bound
위와 같이 나오죠 ㅎㅎ. 추후에 제가 실제로 서버를 운영하면서 '이러한 이러한 로그를 위주로 보시면 좋다'와 관련된 포스팅도 다루도록 하겠습니다. 중간에 | <- 이렇게 생긴 놈이 있는데요. 이놈은 제가 추후 강의에서 다시 다루겠습니다. 저건 명령어와 명령어를 연결해 주는 pipe line이라는 놈입니다. 현실 세계의 pipe line처럼 명령어와 명령어를 연결해 준다고 보시면 됩니다.
그런데 여러분 로그파일을 몇 번 서성이시다 보면 파일명 뒤에. gz <- 이런 확장자가 붙은 파일들을 보실 수가 있으실 겁니다. 그리고 어떨 때는. tar.gz 이런 아이들도요. 이건 윈도우에서 보던 zip 파일과 비슷한 개념의 압축파일인데요.(압축 알고리즘이 다르지만 이해를 돕기 위해 압축파일이라는 개념은 같다고 설명드리겠습니다)
이런 경우 아무리 cat 명령어로 살펴보려고 해도 살펴봐지지가 않습니다. 한번 해보시면 문자열이 아래처럼 이상하게 깨져 나오는 현상을 겪으실 겁니다.
U����և�>���rC��.'�M��������Z�|(�0�����F}��2���PP�M�C�w�>��Y�!�� ���u�ׇ�>���rԺ4�g#��T�#���`@�̇2 ���L��kԇ-SE/�|�P坦<V}��>H �>�]����>���r�b쪦i�� �xEai�A��|�b0Z��+�;�Qb�L}�#=%f��1e�i���gՇH`��R�#���aч�>T��PW1B7_�P�"a+��8�@����Ϙ�����!F��:Bѷ�I}��N��?�>D[$�����/��K�^���r�S�fd꜃j��s*}�����(��Y�Q����G!Z�>����P杤M�l�(������q���� ,��G�Q��E� �:砰�sK����g��`�������!F��:B�=&oʼ����Ϫ��� ����"��b�"��a�#�uAXT%���]��L�sP��'�t�8��*/úʫ�ר*1Z����.����;MUx��� lU�@ U�<���p?�q
:q를 입력해 주셔서 살며시 탈출해봅니다..
그런데, cat에 z를 더하게 되면...
brandon@brandon-VirtualBox:/var/log$ zcat syslog.2.gz | more -10 Sep 9 07:35:02 brandon-VirtualBox anacron[24517]: Job `cron.daily' terminated Sep 9 07:35:02 brandon-VirtualBox anacron[24517]: Normal exit (1 job run) Sep 9 07:36:14 brandon-VirtualBox dhclient[808]: DHCPREQUEST of 192.168.58.101 on enp0s8 to 192.168.58.100 port 67 (x id=0x3e8a2674) Sep 9 07:36:14 brandon-VirtualBox dhclient[808]: DHCPACK of 192.168.58.101 from 192.168.58.100 Sep 9 07:36:14 brandon-VirtualBox NetworkManager[674]: <info> [1599604574.6707] address 192.168.58.101 Sep 9 07:36:14 brandon-VirtualBox NetworkManager[674]: <info> [1599604574.6709] plen 24 (255.255.255.0) Sep 9 07:36:14 brandon-VirtualBox NetworkManager[674]: <info> [1599604574.6711] server identifier 192.168.58.100
zcat이 되면서 살펴볼 수가 있게 됩니다!!
(24). 프로세스(process)
여러분은 process라고 하면 어떤 이미지가 떠오르시나요? 아무것도 안 떠오르시나요? 저도 그렇습니다.
우리가 윈도우 사용자였을 때를 떠올려보면요. 우리는 '프로세스'라는 말을 잘 쓰지 않았습니다.
그냥 응용프로그램, 프로그램 이런 말들만 있을 뿐이죠.
그도 그럴 것이 저 같은 경우 어렸을 적에 그냥 컴퓨터가 좀 버벅이면 Ctrl+Alt+Delete로 작업 표시자를 띄운 다음에 프로그램을 종료하는 것으로 먹통이 된 프로그램들을 죽여놓고 다시 실행하고 식으로 컴퓨터를 관리해왔었으니까요. 윈도우에서 알고 있던 프로그램에 대한 개념이, 리눅스의 프로세스에 대한 개념과 동일하시다고봐주시면 됩니다. 즉, 운영체제로부터 메모리를 할당받아서 돌아가고 있는 프로그램입니다. 우리가 윈도우에서 작업관리자를 통해서 프로그램을 관리했던 것처럼 우리도 리눅스에서 몇 가지 명령어를 익혀서 process를 관리해야 합니다.
(24)-1. ps -ef
ps라는 기존 명령어에 옵션을 추가한 형태의 명령어입니다. ps만 입력하게 되면 '현재 자신이 실행을 시키고 있는' 프로세스를 보여줍니다.
brandon@brandon-VirtualBox:/var/log$ ps PID TTY TIME CMD 6949 pts/18 00:00:00 ps 20450 pts/18 00:00:01 bash
다시 돌아와서, 여기서 보통 ps 명령어를 사용하는 경우는 '현재 자신이 실행을 시키고 있는' 프로세스를 보고 싶은 것이 아니라 운영체제에서 돌아가는 프로그램을 보고 싶으신 거잖아요? 그런 경우에는 ps -ef 명령어를 실행시켜 주 시면 됩니다. e는 every의 e, f는 extra full format의 f입니다.
brandon@brandon-VirtualBox:/var/log$ ps -ef | more -10 UID PID PPID C STIME TTY TIME CMD root 1 0 0 9월08 ? 00:00:03 /sbin/init splash root 2 0 0 9월08 ? 00:00:00 [kthreadd] root 4 2 0 9월08 ? 00:00:00 [kworker/0:0H] root 6 2 0 9월08 ? 00:00:00 [mm_percpu_wq] root 7 2 0 9월08 ? 00:00:01 [ksoftirqd/0] root 8 2 0 9월08 ? 00:00:03 [rcu_sched] root 9 2 0 9월08 ? 00:00:00 [rcu_bh] root 10 2 0 9월08 ? 00:00:00 [migration/0] root 11 2 0 9월08 ? 00:00:00 [watchdog/0]
명령어 바로 아래의 컬럼명들 중에서 신기한 놈들이 보입니다. 이넘들도 중요한 놈들이니 몇 가지만 언급 정도만 하고 넘어가도록 하겠습니다.
- UID: 실행되고 있는 프로세스를 실행한 유저
- PID: 프로세스의 아이디. 주로 나중에 문제가 있는 프로세스를 죽일 때에는 PID 값을 입력해서 죽이게 됩니다.
- PPID: 프로세스의 부모 아이디입니다.
- C: 프로세스가 점유하고 있는 CPU 사용량입니다.
- STIME: 프로세스가 시작된 시간입니다.
여기서 조금 더 생각해보면 프로세스 중에서 검색을 하는 경우도 빈번하게 일어날 것입니다.
그럴 때는 grep이라는 명령어를 이용하면 간편합니다. grep이라는 명령어는 특정 문자열을 기준으로 입력된 파일이나 파일명을 검색할 수 있는 유용한 명령어입니다. 기본적으로 문자열이 일치하는 라인들을 출력해 줍니다.
brandon@brandon-VirtualBox:/var/log$ ps -ef | grep "python" root 736 1 0 9월08 ? 00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal brandon 7041 20450 0 12:13 pts/18 00:00:00 grep --color=auto python brandon 19369 1918 0 9월08 ? 00:00:03 /usr/bin/python3 /usr/bin/update-manager --no-update --no-focus-on-map
grep에 대한 설명이 조금 부실한 것 같은데요. grep은 여기서만 쓰이는 게 아니라 파일을 검색할 때도 쓰이고 정말 8방 미인으로 쓰이기 때문에 다음 포스팅에서 조금 더 상세하게 다루도록 하겠습니다.
Thanks for reading!
'Backend > LINUX' 카테고리의 다른 글
[Chapter1] 리눅스의 추억10(feat. 막힘없이 실무까지) (0) 2022.07.30 [Chapter1] 리눅스의 추억9(feat. 막힘없이 실무까지) (0) 2022.06.28 [Chapter1] 리눅스의 추억7(feat. 막힘없이 실무까지) (0) 2022.06.28 [Chapter1] 리눅스의 추억6(feat. 막힘없이 실무까지) (0) 2022.06.27 [Chapter1] 리눅스의 추억5(feat. 막힘없이 실무까지) (0) 2022.06.27