[책 공부] 리눅스 입문 with 우분투

5 minute read

책 소개

리눅스 입문 with 우분투

처음에 리눅스 공부하기에 좋은 책입니다. 리눅스 뿐만 아니라 리눅스에서 사용되는 CS지식들도 설명해주고 있어서 한권만 봐도 잘 배울 수 있는 것이 좋습니다.

리눅스란

리눅스는 무료로 사용할 수 있는 오픈소스 운영체제이다. 운영체제란 컴퓨터의 하드웨어를 관리하고 프로그램들을 실행시켜주는 기본 소프트웨어이다. 리눅스 운영체제의 핵심 부분인 리눅스 커널(Kernel)이 있다.

리눅스는 다양한 분야에 걸쳐 광범위하게 사용하는 운영체제이다. 현대의 거의 모든 프로그래밍 언어는 리눅스에서 개발 및 배포할 수 있다. 서버 분야나 컴퓨팅 분야 등 리눅스를 기반으로 하는 분야가 상당히 넓기 때문에 리눅스를 배우는 것이 필수이다.

리눅스 설치

  • PC에 리눅스 설치
  • 가상 머신에 리눅스 설치
  • 클라우드 서비스로 리눅스 인스턴스 생성

집에서 실습하려면 일반적으로 가상 머신을 설치하여 진행한다. 대표적으로 Oracle의 VirtualBox와 VMWare의 VMWare Workstation Player가 있다.

터미널과 셸

터미널(terminal)은 컴퓨터와 사용자 간에 상호작용할 수 있게 연결하는 장치이다. 사용자가 컴퓨터에 명령을 전달하고 컴퓨터는 명령을 수행한 결과를 사용자에게 전달하는 것이다.

셸(Shell)은 CLI 프로그램이다. 사용자는 셸을 통해 운영체제에 명령을 내리고 결과를 확인한다. 터미널이 컴퓨터와 사용자 간 상호작용할 수 있는 하드웨어라면, 셸을 운영체제와 사용자 간 상호작용을 지원하는 소프트웨어이다. 여러 셸이 있는데 그중에 Bash는 리누스 토르발즈가 리눅스를 개발할 때 리눅스로 처음 포팅한 프로그램 중 하나이다.

과거에는 텔넷(Telnet)과 같은 네트워크 프로토콜을 이용해 원격 운영체제에 터미널을 연결했다. 그러나 텔넷은 모든 데이터가 평문으로 전송돼 보안에 매우 취약했다. 근래에는 모든 데이터가 암호화돼 전송되는 SSH(Secure SHell) 프로토콜을 이용해 터미널을 안전하게 원격 운영체제에 연결할 수 있다.

셸 스크립트

셸에서 동작 가능한 명령을 모아놓은 파일을 셸 스크립트(Shell Script)라고 한다. 셸 스크립트를 실행하면 셸 스크립트 파일의 내용이 순차적으로 실행된다. 셸 스크립트는 여러 명령을 한 파일에 모아 실행하는 방식이여서 자동화할 수 있다. 또한 주기적으로 실행할 작업을 등록해 사용하는 cron(스케쥴 서비스)이라는 프로그램이 있다. 셸 스크립트를 잘 작성하면 이미 검증되었기 때문에 안전하게 모든 사람이 같이 공유하여 사용할 수 있기 때문에 휴먼 에러가 발생할 확률을 낮출 수 있다.

대표적인 명령어

  • ls: 파일 목록
  • cd: change directory로, 현재 작업 디렉터리(CWD, Current Working Directory)의 위치를 이동하는 명령어
  • pwd: print working directory로, 현재 작업 디렉터리를 절대 경로로 조회하는 명령어
  • cat: concatenate 또는 catenate에서 유래한 cat으로 파일의 내용을 연결하거나 조회
  • exit: 현재 실행중인 셸 종료
  • nano: 텍스트 편집기 (vim이나 emacs보다 쉽게 사용 가능)

그 밖에 명령어가 옵션 포함해서 많지만 이것은 외우면 안된다. 그때그때 필요할 때마다 검색하여 찾아보자.

소프트 링크와 하드 링크

파일 시스템은 각 파일에 대한 정보를 아이노드(inode, index node)라는 자료구조에 저장한다. 파일에 대한 메타데이터를 저장한다고 보면 된다. 그리고 파일의 실제 내용을 저장하고 있는 데이터 블록(data block)을 아이노드에 연결한다. 아이노드에는 식별자인 아이노드 번호가 있어서 아이노드를 구분할 수 있다.

파일의 경로 정보는 덴트리(dentry, directory entry)라는 자료구조로 표현한다. 덴트리는 파일의 계층 구조를 유지하는데 사용한다. 각 덴트리는 파일 경로를 나타내며, 파일의 메타데이터를 저장하는 하나의 아이노드와 연결한다. 즉, 덴트리는 파일의 경로와 파일의 실체(아이노드로 표현되는 파일의 메타데이터)를 연결하는 매개체로 볼 수 있다.

소프트 링크

윈도우에서 바로가기를 사용해봤을 것이다. 리눅스에서 소프트 링크가 윈도우의 바로가기와 같은 개념이다. 소프트 링크(soft link)는 연결할 대상 파일의 경로를 저장한다. 즉, 소프트링크를 조회하거나 실행하면 실제로는 연결된 대상 파일을 조회하거나 실행하게 된다. 이 소프트링크를 심볼릭 링크(symbolic link) 또는 심링크(symlink) 라고도 한다. 실무에서는 이 심볼릭 링크를 자주 사용한다. 경로가 복잡한 곳을 소프트링크를 걸어주면 쉽게 연결 대상 파일에 접근할 수 있는 것이다.

하드링크

하드링크는 소프트링크처럼 파일을 연결한다기보다는 대상 파일의 복제본(clone)을 만든다고 보면 된다. 복사본과 복제본은 소프트웨어 관점에서 다른데, 복사본은 말그대로 같은 내용의 파일을 다른 파일명으로 복사하는 것이고, 복제본은 원본과 동일하게 만든 것으로 사실상 어떤 파일이 원본이고 어떤 파일이 복제본인지 구분할 수 없다. 그래서 하드링크를 대상 파일에 대한 별치(alias)을 부여하는 것으로 볼 수도 있다. 즉, 원본 대상 파일을 수정하고 하드링크를 조회하면 수정한 내용으로 보여지게 된다.

만약 원본 파일을 삭제하게 되면 아이노드와 데이터 블록은 삭제되지 않기 때문에 연결된 하드링크 파일로 조회가 가능하다. 말그대로 복제본을 만든 하드링크이다.

사용자

리눅스는 여러 사용자가 동시에 로그인할 수 있는 멀티 유저 시스템(multi-user system)이다. 여기서 사용자는 ‘사용하는 사람’이 아니라 사용자(user)라는 이름의 ‘계정(account)’을 의미한다. 한 사람이 여러 계정을 소유할 수 있고, 여러 계정을 동시에 사용할 수도 있다.

  • root 사용자: 리눅스 시스템의 모든 권한을 가진 관리자 계정
  • 시스템 사용자: 리눅스 시스템에서 만든 사용자
  • 일반 사용자: root 사용자와 시스템 사용자를 제외한 모든 사용자

리눅스에서 사용자를 구분하는 이유는 보안을 강화하고 시스템의 효율성을 높이기 위함이다.

명령어

  • su(switch user 또는 substitute user): 현재 셸의 사용자를 입력한 사용자로 전환
  • sudo: 특정 사용자의 권한으로 단일 명령을 실행, 보통 root 사용자의 권한으로 명령을 실행할 때 사용한다.
  • runuser: 사용자를 전환하거나 다른 사용자의 권한으로 명령을 실행 (보통 root 사용자만 이용할 수 있다.)
  • 사용자 정보를 관리하는 파일: /etc/passwd
  • 사용자 그룹 정보를 관리하는 파일: /etc/group

파일 소유권과 권한

소유권

리눅스에서 파일이 생성되면 루트 디렉터리 아래 어딘가에 존재한다. 그러나 리눅스는 여러 사용자의 수많은 파일의 위치나 디렉터리 이름 같은 정보로는 파일 소유자를 판단할 수 없는데, 이를 해결하기 위해 리눅스의 모든 파일에는 파일 소유권이 설정되어 있다.

소유권(ownership)은 파일이 사용자의 소유임을 나타내는 속성이다. 파일이 생성되는 순간 파일을 생성한 사용자와 그룹이 소유권을 가지도록 설정된다. ls 명령어를 통해 파일 목록 조회하는 동시에 소유권도 확인할 수 있다.

권한

파일 권한(permission)은 해당 파일에 어떤 행위를 할 수 있는지를 정의한 것이다.

  • 읽기(read)
  • 쓰기(write)
  • 실행(execution)

리눅스에서는 파일 권한을 파일의 소유자, 소유 그룹, 일반 사용자별로 따로 설정이 가능하다.

  • -rw-rw-r–: 3개씩 끊어서 권한 부여
    • rw-: 소유자 읽기와 쓰기 가능
    • rw-: 소유 그룹 읽기와 쓰기 가능
    • r–: 일반사용자 읽기만 가능

이것은 각 권한 8진수 3자리로 표현하는 방법이다. 8진수를 2진수로 바꾸면 3자리 수가 나오고 각 자리는 읽기(r), 쓰기(w), 실행(x) 권한을 나타낸다.

chmod u+x msg_from_dog: u+x는 소유자(u)에게 실행(x) 권한을 추가(+)한다는 의미이다.

  • 디렉터리 역시 rwx로 권한을 줄 수 있다.

시그널

파이프나 소켓 등은 주로 데이터를 교환하기 위한 목적으로 사용한다. 반면에 시그널(signal)은 어떤 이벤트가 발생했음을 알려주기 위해 사용한다. 파이프나 소켓처럼 구체적인 데이터를 전송할 수는 없고, 어떤 이벤트인지 나타내는 시그널 종류만 전달할 수 있다.

시그널은 POSIX(Portable Operating System Interface) 표준에 정의된 IPC 도구이다. 시그널 종류도 POSIX 표준에 정의되어 있다. 리눅스는 주로 POSIX 표준을 따르는데 그 외에 리눅스에 특화된 시그널도 제공한다. SIGWINCH(창 크기 변경 시그널)나 SIGIO(I/O 가능 시그널) 등은 모든 유닉스 시스템에서 표준화되지 않은 리눅스 특화 시그널이다.

프로세스가 시그널을 수신하면 프로세스는 수신한 시그널을 처리해야 한다. 예를 들어 kill로 시그널을 전송하게 되면 프로세스를 종료시킬 수 있다.

셸 스크립트는 따로 정리하지 않았습니다. 대부분 문법이고 문법은 필요할 때마다 어떤게 필요한지 검색하면 됩니다. 요즘은 AI도 잘되어 있으니 이를 잘 활용하면 더 빨리 작성할 수 있을 것 입니다.

패키지 관리 시스템

패키지 관리 시스템(PMS, Package Management System)은 패키지의 설치, 업데이트, 구성, 제거를 자동화하고 관리하는 시스템이다.

  • 패키지 설치
  • 종속성 관리
  • 업데이트
  • 설정 관리
  • 제거

JavaScript의 NPM, Java의 Maven 혹은 Gradle이라 생각하면 편하다.

systemd

systemd는 리눅스에서 사용하는 초기화 및 서비스 관리 시스템이다. 시스템의 부팅 과정을 관리하고, 다양한 서비스를 시작/종료/관리하는 역할을 담당한다. 전통적인 유닉스 스타일의 init 시스템을 대체한 systemd는 더 현대적이고 효율적인 방법을 제공해 여러 리눅스 배포판에서 초기화 시스템으로 채택하고 있다.

systemd는 시스템의 부팅과 설정 과정에서 할 일들을 서비스라는 단위로 구분해 관리한다. 서비스는 백그라운드에서 실행되는 프로세스를 말한다. 다 그런것은 아니지만 특정 기능을 하는 프로세스를 백그라운드에서 실행하는 경우가 많다. 이런 프로세스를 데몬(daemon) 프로세스라고 한다.

자주 사용하는 커맨드라인

  • grep: Global Regular Expression Print의 약자로 표준 입력이나 텍스트 파일에서 특정 패턴이나 문자열을 검색
  • find: 파일이나 디렉터리를 검색
  • stat: 파일이나 파일시스템의 상세한 상태 정보를 표시
  • wc: Word Count의 약자로, 텍스트 파일의 줄 수, 단어 수, 바이트 수 등을 계산한다.
  • df: Disk Free, 파일 시스템의 디스크 사용량을 출력
    • 주로 모니터링 할 때 사용한다.
  • du: Disk Usage, 파일이나 디렉터리가 차지하는 디스크 사용량을 추정해 출력
  • tar: Tape Archive, 파일과 디렉터리를 아카이브하고 압축하는데 사용
    • 대용량 데이터를 관리하거나 백업할 때 유용하다.
    • 아카이브는 여러 파일과 디렉터리를 한 덩어리로 만드는 것을 뜻한다.
  • read: 표준 입력(보통 키보드)에서 한 줄을 읽어 변수에 저장하는데 사용
  • tr: 표준입력을 받은 문자들을 변환, 삭제, 압축

Comments