[리눅스마스터 1급] 이기적 이론서 7회차 정리 - 설치 및 관리

🏁 이기적 이론서 학습 범위

  • PART 01 리눅스 시스템 관리
    • CHAPTER 01 일반 운영 관리 (SECTION 04 설치 및 관리)

설치 및 관리

☑️ 패키지를 통한 소프트웨어 설치

개요

  • 리눅스는 소프트웨어를 시스템상에 설치, 업그레이드, 제거를 위한 패키지 도구를 제공한다.
    • 미리 컴파일된 프로그램을 패키지 형태로 제작하고 배포하여 사용자가 손쉽게 설치한다.
  • 패키지가 정상 동작하려면 외부 공유 라이브러리나 다른 패키지가 필요할 수 있다.
    • 패키지 관리 시스템은 의존성 있는 소프트웨어를 먼저 설치하는 걸 보장한다.
  • 리눅스 배포판은 각자의 패키지 도구를 사용한다.
    • 레드햇 계열 → rpm, 데비안 계열 → dpkg, openSUSE → rpm
  • 패키지 도구는 저수준 패키지와 고수준 패키지로 분류한다.
    • 저수준 패키지 도구 : 패키지 설치, 업그레이드, 제거 등 개별 동작 제공
    • 고수준 패키지 도구 : 저수준 패키지 도구를 이용하여 패키지의 의존성까지 고려하여 설치

저수준 패키지 도구 사용법

  • 패키지 설치
    • 레드햇 계열의 패키지 명령어와 패키지 확장자는 rpm 이다.
    • 데비안 계열의 패키지 명령어는 dpkg , 확장자는 deb 이다.
    • 패키지 설치 시 -i 옵션을 사용한다.
    • 배포 repository에 패키지 존재시 aptyum 과 같은 고수준 패키지 도구를 통해 설치할 수 있다.
      • 없다면 개별 패키지를 찾아서 다운로드 받아 직접 설치해야 한다.
      • 먼저 설치가 필요한 라이브러리가 존재하지 않으면 에러가 발생한다.
      $ rpm -i file.rpm
      $ dpkg -i file.deb
    
  • 패키지 업그레이드
    • rpm-U 옵션, dpkg-i 옵션을 사용해 기존 설치된 패키지를 인자로 지정한 패키지로 업그레이드한다.

        $ rpm -U file.rpm
        $ dpkg -i file.deb
      
  • 설치된 패키지 확인
    • 이미 설치된 모든 패키지를 확인하려면 rpm-qa 를, dpkg-l 을 사용한다.

        $ rpm -qa
        $ dpkg -l
      
    • 특정 패키지가 설치되었는지 확인하려면 rpm-q 를, dpkg—status 를 사용한다.

        $ rpm -q package_name
        $ dpkg --status package_name
      
    • 특정 패키지가 설치되었는지 확인하려면 옵션 대신 grep 을 사용할 수 있다.

        $ rpm -qa | grep sysdig
        $ dpkg -l | grep mysql-common
      
  • 특정 파일을 설치한 패키지 찾기
    • 시스템에 설치된 파일이 어떤 패키지를 통해 설치되었는지 확인하려면 rpm-qf 를, dpkg—search 를 사용한다.

        $ rpm -qf file_name
        $ dpkg --search file_name
              
        # 시스템에 설치된 '/usr/share/git-core/contrib/hooks/setgitperms.perl' 파일이 포함된 패키지는 git-1.7.1-9.el6_9.i686이다.
        $ rpm -qf /usr/share/git-core/contrib/hooks/setgitperms.perl
        git-1.7.1-9.el6_9.i686
      

고수준 패키지 도구의 사용법

  • 패키지 검색하기
    • 레드햇 계열은 yum 을 사용한다.
    • search : 먼저 패키지명을 검색하고 발견되지 않으면 패키지 설명에서 검색한다.
    • search all : 패키지에 대한 모든 정보에서 검색을 시작한다.

        $ yum search package_name
        $ yum search all package_name
        $ yum whatprovides "*/package_name"
      
    • whatprovides : 특정 파일이 포함된 패키지를 찾는다.

        $ yum whatprovides /usr/share/git-core/contrib/hooks/setgitperms.perl
      
    • 데비안 계열은 apt-cache , apt , aptitude 등을 사용한다.
    • 모두 -search 을 사용하지만 apt-cache 는 패키지명 및 패키지 설명 등의 키워드를 찾아주고, aptaptitude 는 패키지명만 비교하여 찾는다.

        $ apt-cache search git-1.7.1-9.el6_9.i686
        $ apt search git-1.7.1-9.el6_9.i686
        $ aptitude search git-1.7.1-9.el6_9.i686
      
  • 패키지 설치하기
    • yum 과 apt-get 모두 update 를 사용하여 repository의 패키지 정보를 갱신한다.
    • install 을 통해 패키지를 repository에서 다운받아 설치한다.

        $ yum updates && yum install package_name
        $ apt-get update && apt-get install package_name
      
  • 패키지 제거하기
    • yumerase 를 사용하고, apt-getremove 를 사용한다.
    • 패키지와 관련된 환경설정 파일은 지워지지 않는다.
      • 환경설정 파일을 삭제하려면 purge 를 사용한다.
      $ yum erase package_name
      $ apt-get remove package_name
    
  • 패키지 정보 출력하기
    • yuminfo 를 사용하고, apt-cache , apt, aptitudeshow 를 사용한다.

        $ yum info package_name
        $ apt-cache show package_name
        $ apt show package_name
        $ aptitude show package_name
              
        $ yum info git # yum을 통해 git 패키지의 정보 확인
      

☑️ 레드햇 패키지 관리와 데비안 패키지 관리

레드햇 패키지 관리(RPM: Red Hat Package Manager)

  • RPM
    • 소스코드나 패키지를 시스템에 설치하기 위한 오픈소스 패키지 관리 시스템
    • 레드햇 사에서 처음 개발했고, 현재는 Novell NetWare, IBM’s AIX, CentOS, Fedora, Oracle Linux 등 다양한 배포판에서 널리 사용된다.
    • 패키지 파일 (.rpm) 또는 패키지 관리 프로그램 자체를 의미하기도 한다.
  • RPM 사용법

      $ rpm [options] package_name # 옵션에 따라 설치, 제거, 업그레이드, 질의, 검증 등 수행
    
  • 옵션

    옵션설명
    -v상세한 정보 출력
    —quiet에러 메시지 외에 아무런 정보도 출력하지 않는다.
    —versionrpm의 버전 출력
  • RPM 설치 및 업데이트

    옵션설명
    -i동일 패키지가 이미 설치되지 않은 경우 패키지를 새로 설치한다.
    -h설치하거나 업그레이드 할 때 경과를 # 로 표시한다.
    -U- 현재 설치된 패키지를 최신으로 업그레이드 한다.
    - 만약 설치된 패키지가 없다더라도 패키지를 설치한다.
    -F이전 버전이 설치되어 있는 경우에만 업그레이드한다.
    —force- 기존에 패키지가 설치되어 있어도 강제로 설치한다.
    - -replacepkgs , —replacefiles , —oldpackage 옵션을 동시에 사용한 것과 같다.
    —nodeps패키지를 설치하거나 업그레이드 하기 전 의존성 체크를 하지 않는다.
    —test실제 설치하지 않고 잠재적 충돌이 있는지 확인한다.
  • 예제

      # -i 를 사용하여 package.rpm을 설치한다. (-v : 상세 출력 결과, -h : 설치 경과를 #으로 표시)
      $ sudo rpm -ivh package.rpm 
        
      # 패키지명 대신 인터넷 URL을 사용하여 설치
      $ sudo rpm -ivh https://example.com/package.rpm
        
      # -U 를 사용하여 패키지를 최신버전으로 업그레이드
      # 패키지가 설치된 상태가 아니면 최신 버전으로 설치
      # 먼저 설치해야 할 패키지가 있다면 설치를 중단하고 그 목록을 표시
      $ sudo rpm -Uvh package.rpm
        
      # --nodeps 를 통해 의존성 있는 패키지들이 아직 설치되지 않은 상태라도 강제로 패키지 설치
      $ sudo rpm -Uvh --nodeps package.rpm
        
      # --test 를 사용하여 패키지를 설치하거나 업그레이드를 실제로 하지 않고 테스트 수행
      $ sudo rpm -Uvh -test package.rpm
    
  • RPM 제거
    • 옵션

      옵션설명
      -e패키지 삭제
      —nodeps패키지 삭제 시 의존성 체크를 하지 않는다.
      —test- 실제 삭제하지 않고 모의로 삭제한다.
      - -vv 와 사용하면 디버깅하는데 효과적이다.
      —allmatches- 패키지의 모든 버전을 제거한다.
      - 패키지와 매칭되는 서로 다른 패키지 존재 시 에러 발생
    • 예제

        # -e를 사용하여 패키지 제거
        $ sudo rpm -e package.rpm
              
        # --nodeps를 사용하여 의존성 체크 없이 패키지 제거
        # 다른 패키지가 제대로 실행되지 않을 수 있다.
        $ sudo rpm -ev --nodeps package.rpm
              
        # --test를 사용하여 패키지를 실제로 삭제하지 않고 테스트 수행
        $ sudo rpm -ev --test package.rpm
      
  • RPM 질의
    • 옵션

      옵션설명
      -q- 질의를 위해 기본적으로 사용해야 하는 옵션
      - 패키지 이름과 버전, 릴리즈 등 간단한 정보가 표시된다.
      -i패키지 정보, 이름, 버전, 설명 등 패키지에 대한 자세한 정보 표시
      -l패키지의 목록 출력
      -t지정한 파일을 설치한 패키지 출력
      -a설치된 모든 패키지에 대해 질의
      -c패키지의 설정 파일이나 스크립트 파일 출력
      -s- 패키지의 각 파일 상태를 표시한다.
      - 각 파일 상태는 normal, not installed, replaced 로 표시된다.
    • 예제

        # -q를 사용해 JDK 1.7.0이 설치되어 있는지 확인
        # 설치되어 있다면 패키지 이름이 표시됨
        $ sudo rpm -q java-1.7.0-openjdk
              
        # -i로 패키지의 부가정보 출력
        $ sudo rpm -qi java-1.8.0-openjdk
              
        # -l을 사용해 패키지가 설치한 모든 파일 목록 확인
        $ sudo rpm -ql package
              
        # -f를 사용해 특정 파일이 속한 패키지 정보 확인
        $ sudo rpm -qf /path/to/file
              
        # -a를 사용해 시스템에 설치된 모든 패키지 정보 확인
        $ sudo rpm -qa
      
  • RPM 검증
    • 옵션

      옵션설명
      -V검증시 사용하는 기본 옵션
      -a시스템에 설치된 모든 패키지에 대해 검증
    • 예제

        # -V를 사용해 설치되어 있는 패키지 검증
        # 검증 실패 항목 존재시 내용출력, 없다면 아무런 출력을 하지 않음
        $ sudo rpm -V openldap-2.4.46-9.el8.x86_64
              
        # -a를 사용해 시스템에 설치된 모든 패키지를 검증
        $sudo rpm -Va
      
  • 소스 RPM (SRPM: Source RPM) 빌드하기
    • 소스파일(.src.rpm)을 통해 패키지(.rpm)을 생성한다.
    • 빌드 성공 시 ~/rpmbuild/RPMS/i386 디렉터리에 패키지가 생성된다.
      • i386 : 시스템 아키텍처
        $ sudo rpmbuild -rebuild /tmp/mypackage-1.0.0-1.src.rpm
      

YUM(Yellowdog Updater, Modified)

  • 설명
    • yum은 RPM 설치 방식을 개선한 패키지 관리자이다.
      • 패키지와 패키지가 가지고 있는 의존성을 체크하여 방대한 repository에서 검색하여 쉽게 패키지 설치가 가능하다.
    • 학교, 회사, 소그룹 등 개별 목적에 따라 편리하게 패키지를 설치하도록 로컬 레포지토리 기능을 제공한다.
      • 외부 네트워크 트래픽을 절약할 수 있고, 공개된 repository에 제공되지 않는 패키지도 쉽게 로컬 repository에 등록하여 설치할 수 있다.
  • 로컬 레포지토리 만들기

      $ sudo yum install createrepo # createrepo 패키지 설치
        
      $ copy *.rpm /mnt/local_repo # 특정 디렉터리를 선정하고 원하는 패키지 모두 복사
        
      $ sudo createrepo /mnt/local_repo # createrepo를 통해 레포지토리 생성
    
  • yum 명령어 형식

      yum [options][command][package_name]
    
  • 옵션

    옵션설명
    -y- 모든 선택에 yes로 답변한다.
    - 설치가 한 번에 이루어진다.
    -v자세한 정보 출력
  • yum 명령어

    옵션설명
    list사용 가능한 패키지 목록과 관련 정보 출력
    info지정한 패키지 정보 출력
    install- 패키지나 패키지 그룹의 최신 버전 설치
    - 레포지토리에 패키지 이름과 동일한 패키지가 존재하지 않으면 일부만 매칭하는 패키지라도 설치
    update- 특정 패키지를 최신 버전으로 업그레이드
    - 패키지명 명시하지 않으면 설치되어 있는 모든 패키지를 업그레이드
    check-update시스템에 설치된 패키지 중 업데이트가 필요한 패키지가 있는 지 확인
    remove- 패키지 삭제 - 패키지와 의존성 있는 패키지도 함께 삭제
    provides특정 파일이나 기능을 제공하는 패키지를 찾는다.
    search패키지의 설명, 패키지 이름, 패키지 제공자 등 RPM 패키지의 모든 필드에서 지정한 키워드와 매칭되는 패키지를 찾는다.
    localinstall시슽메의 로컬 경로에서 패키지를 설치한다.
    clean- yum 캐시 디렉터리에 축적된 데이터를 삭제한다.
    - expire-cache , packages , headers, metadata , dbcache , rpmd , plugins , all 등 다양한 옵션을 추가로 붙일 수 있다.
    - 모든 캐시를 지우기 위해서는 clean all 을 사용한다.
    repolist설정된 모든 레포지토리의 목록을 살필 수 있다.
    - repolist enabled : 활성화된 모든 레포지토리
    - repolist disabled : 비활성화된 모든 레포지토리
    - repolist all : 모든 레포지토리
    grouplist패키지 그룹에 대한 정보 출력
    groupinfo지정한 패키지 그룹명에 대한 정보 출력
    groupupdate지정한 그룹 패키지 업데이트
    groupinstall지정한 그룹 패키지 설치
    groupremove지정한 그룹 패키지 제거
    whatprovides파일이 포함된 패키지를 찾거나 관련 기능을 제공하는 패키지를 찾을 때 사용
  • yum 환경설정
    • yum의 환경설정은 /etc/yum.conf 파일에 저장된다.
    • /etc/yum.conf/etc/yum.repos.d 디렉터리 밑에 확장자가 repo인 파일로 별도 보관한다.
    • /etc/yum.repos. 디렉터리에 .repo 파일을 추가, 삭제한 경우 yum 캐시를 비워줘야 갱신된 내용이 반영된다.

        $ yum clean all
      
  • yum-utils
    • yum 레포지토리를 관리하고 패키지 관리를 편리하게 할 수 있도록 도와주는 유틸리티
    • yum install yum-utils 를 사용하여 별도 설치해야 한다.
    • 명령어는 생략
  • yum 예제

      $ sudo yum install httpd # httpd 패키지 설치
        
      # httpd 패키지 설치시 "설치를 진행하겠습니까?"와 같은 질의에 사용자 응답을 기다리지 않고 기본적으로 yes로 응답
      $ sudo yum install httpd -y 
        
      # 현재 설치된 패키지 중 업데이트가 가능한 패키지를 체크
      $ sudo yum check-update
        
      # bash 패키지를 업데이트하며 기본 응답은 yes
      $ sudo yum update bash -y
        
      # yum-utils 패키지를 다운받아야 yumdownloader를 사용할 수 있다.
      # unbound 패키지를 설치하지 않고 rpm 파일만 다운받는다.
      $ sudo yum install yum-utils -y
      $ sudo yumdownloader unbound
        
      # yumdownloader로 다운받은 패키지는 localinstall을 통해 설치할 수 있다.
      $ sudo yum localinstall unbound-1.4.20-26.el7.x86_64.rpm
        
      # httpd 패키지 삭제
      $ sudo yum remove httpd
        
      # 패키지 재설치
      $ sudo yum reinstall httpd -y
        
      # /etc/yum.repos.d 디렉터리에 설정된 모든 레포지토리 목록을 출력
      $ sudo yum repolist
        
      # repolist는 활성화된 레포지토리만 출력
      # 비활성화된 레포지토리도 모두 보려면 repolist all을 사용
      $ sudo yum repolsit all
        
      # git 패키지 정보 출력
      $ sudo yum info git
        
      # /etc/yum.repos.d 디렉터리에 .repo 파일을 직접 추가하는 대신 yum-config-manager의 도움을 받아 쉽게 레포지토리를 추가
      $ sudo yum-config-manager --add-repo="https://mirror.aarnet.edu.au/pub/centos/7"
        
      # 특정 레포지토리 활성화하고 패키지를 설치하거나 특정 레포지토리만 비활성화 후 패키지를 설치
      $ sudo yum --enablerepo=disabled-repo install package-example
        
      # 패키지 이름이나 요약 설명에 php 키워드가 들어있는 패키지를 모두 찾음
      $ sudo yum search php
        
      # 특정 명령어나 특정 파일을 제공하는 패키지를 찾는다.
      $ sudo yum provides iscsiadm
      OR
      $ sudo yum provides /etc/httpd/conf/httpd.conf
        
      # yum을 통해 설치, 삭제 등 수행한 동작 이력을 확인
      $ sudo yum history
        
      # 7번 히스토리에 대한 상세정보 확인
      $ sudo yum history info 7
        
      # 7번 히스토리의 동작을 되돌린다.
      $ sudo yum history undo 7 -y
        
      # 7번 히스토리의 동작을 다시 수행
      $ sudo yum history redo 7 -y
        
      # /var/cache/yum 디렉터리의 모든 종류의 캐시 삭제
      $ sudo yum clean all 
        
      # 현재 설치된 패키지 목록 출력 
      $ sudo yum list installed
        
      # 레포지토리에서 설치 가능한 모든 패키지 출력
      $ sudo yum list available
        
      # 서로 연관이 있는 패키지는 패키지 그룹으로 묶을 수 있음
      # 패키지 그룹 목록을 출력
      $ yum grouplist
        
      # 'Basic Web Server' 패키지 그룹의 정보 출력
      yum groupinfo "Basic Web Server"
        
      # 'web server' 패키지 그룹을 설치
      $ yum groupinstall "web server" -y
    

데비안 패키지 관리(Debian Package Management)

  • 데비안 패키지 관리
    • 데비안 계열 운영체제에 패키지 설치를 위해 패키지 간의 의존성 관계, 소프트웨어 환경설정, 패키지 설치 자체를 편리하게 도와주는 소프트웨어 일체
    • 저수준 패키지 관리 도구 : dpkg
    • 상위 수준 패키지 관리 도구 : apt-get, apt, aptitude
      • aptitude : 설치 목록상에서 패키지 검색, 패키지를 자동 또는 수동으로 설치할지 설정, 패키지를 업그레이드 불가 상태로 변경하는 기능 수행
  • dpkg
    • 데비안 패키지 관리 명령어 중 하나
    • 의존성 관계를 고려하여 .deb 확장자의 패키지 설치, 제거, 질의 역할을 수행한다.
    • dpkg 를 활용한 프론트엔드 관리 도구는 aptitude
      • aptitude : dpkg가 제공하는 명령어를 통해 패키지 관리를 제어한다.
    • 패키지 파일 형식은 package_version_architecture.package-type 이다.

        # dpke-name 을 사용해 bar-foo.deb 패키지 이름을 형식에 맞게 변경해준다.
        $ dpkg-name bar-foo.deb
      
    • 패키지 파일 형식 설명

      구성설명
      package패키지 이름
      version패키지 버전으로, 한 버전을 몇 번 빌드했는지 알려주는 릴리즈 정보가 포함되기도 한다.
      architecture- 패키지가 사용 가능한 CPU 아키텍처이다.
      - ex. amd, armel, i386, ia64 등
      type확장자로 .deb가 사용된다.
    • 형식

        	dpkg [option...] action
      
    • 옵션

      옵션의미
      -i, —install- 패키지를 설치한다.
      - R을 사용하면 패키지명 대신 디렉터리를 지정해야 한다.
      -R, —recursive- i 또는 —unpack 옵션과 함께 사용하며 지정한 디렉터리 하위에 있는 모든 .deb 패키지를 설치할 때 사용한다.
      -l, —list설치되어 있는 패키지를 출력한다.
      -i, —info패키지에 대한 정보를 출력한다.
      -c, —contents패키지가 설치하는 파일 정보를 출력한다.
      -L, —listfiles시스템에 지정한 패키지가 설치한 파일을 출력한다.
      -r, —remove- 환경설정 파일을 제외하고 패키지를 제거한다.
      - -p 를 사용하면 환경설정 파일까지 모두 지운다.
      -P, —purge환경설정 파일 포함 패키지를 삭제한다.
      -S, —search지정한 패턴과 일치하는 설치된 패키지 이름을 출력한다.
      -C, —audit설치가 모두 완료되지 않은, 즉 일부만 설치된 패키지를 찾는다.
      —unpack- 환경설정 없이 압축만 해제한다.
      - -R 을 함께 사용할 경우 디렉터리를 지정해야 한다.
      —configure- —unpack 옵션으로 압축 해제된 패키지를 환경설정 할 때 사용한다.
      - -a-pending 을 패키지 이름 대신 사용하면 압축 해제된 패키지 중 환경설정이 되지 않은 패키지를 모두 찾아 환경설정을 한다.
      -s, —status지정한 패키지 상태를 출력한다.
    • 환경설정 파일

      파일설명
      /etc/dpkg/dpkg.cfg기본값을 가지고 있는 환경설정 파일
      /var/log/dpkg.log기본 로그 파일
      /var/lib/dpkg/available사용 가능한 패키지 목록
      /var/lib/dpkg/status- 사용가능한 패키지의 상태를 알려준다.
      - 패키지가 제거되었는지 설치되었는지의 정보를 담고 있다.
    • 예제

        $ sudo dpkg -l # 설치된 모든 패키지 목록 출력
              
        $ sudo dpgk -l '*git*' # git과 관련된 모든 패키지 목록 출력
              
        $ sudo less /var/lib/dpkg/available # 사용가능한 패키지 목록
              
        $ sudo dpkg -r git # git 패이지 삭제
              
        $ sudo dpkg -i vim_4.5-3.deb # vim 패키지 설치
              
        $ sudo dpkg -R -i debpackages/ # debpackages 디렉터리 이하에 존재하는 모든 .deb 패키지 설치
              
        $ sudo dpkg -c vim_4.5-3.deb # vim 패키지의 내용, 즉 포함하고 있는 파일 목록 출력
              
        $ sudo dpkg -s vim # vim 키워드를 포함하는 패키지가 설치되어 있는지 찾음
              
        $ sudo dpkg -L vim # vim 패키지가 설치한 파일과 파일 경로 목록 출력
              
        # 패키지를 압축 해제만 하고 설치하거나 환경설정을 하지 않는다.
        $ sudo dpkg --unpack flashplugin-nonfree_3.2_i386.deb
              
        # 압축 해제된 패키지를 다시 환경설정
        $ sudo dpkg --configure flashplugin-nonfree_3.2_i386.deb 
      
  • apt-get
    • 내부적으로 dpkg 를 사용하여 패키지 설치, 제거, 패키지 관련 명령을 수행하는 고수준 패키지 관리도구
      • 데비안 계열이나 우분투 및 리눅스 민트의 기본 패키지 관리 도구
    • apt-getapt-cache 를 통합한 apt 나 GUI 기반 설치가 가능한 aptitude 등의 명령어를 더 선호한다.
    • 형식

        apt-get [option][command][package]
      
    • 옵션

      옵션의미
      -y, —yes, —assume-yes- 사용자에게 묻는 모든 질의에 yes로 자동 응답한다.
      - 설치를 중단 없이 수행한다.
      - 사용중인 패키지를 변경하거나 필수 패키지를 제거하려는 바와 같이 더 이상 진행 불가할 때 해당 동작은 취소된다.
      —purgeremove 명령을 수행할 때 환경설정까지 같이 제거할 때 사용한다.
    • 명령어

      명령설명
      update- 레포지토리로부터 최신 패키지 설치 정보 목록을 가져올 때 사용한다. - /etc/apt/sources.list 에 지정된 서버로부터 정보를 가져온다.
      upgrade/etc/apt/sources.list 에 지정된 서버로부터 현재 설치된 패키지의 최신 버전을 다운받아 업그레이드한다.
      install- 지정한 패키지를 설치할 때 사용한다.
      - deb 파일들이 /var/cache/apt/archive 에 임시 생성된다.
      remove지정한 패키지를 삭제한다.
      clean서버로부터 다운받아 생성된 /var/cache/apt/archive 내의 패키지를 모두 삭제한다.
    • 예제

        $ sudo apt-get install libc6 # libc6 패키지 설치
              
        $ sudo apt-get remove chromium # 크로미움 패키지 제거
              
        $ sudo apt-get clean # 패키지설치를 위해 임시로 생성되었던 패키지 파일을 디스크 용량 확보 목적 등으로 삭제
              
        # 설치는 하지 않고 패키지만 다운로드한다. 
        # 다운로드한 .deb 패키지는 dpkg --install로 설치할 수 있다.
        $ apt-get download ruby 
      

☑️ 소스코드 컴파일을 통한 소프트웨어 설치

소스코드 컴파일을 통한 소프트웨어 설치

  • 설명
    • 리눅스는 사용자에게 소스코드를 배포하고 시스템에서 소스코드를 직접 컴파일하여 각자 시스템 환경에 맞는 패키지를 생성하는 방식으로 발전하였다.
    • 소스코드는 보통 tar 로 소스코드를 아카이브한 후 파일 크기를 줄이기 위해 gzip이나 bzip2 로 압축한다.
      • gzip 을 통해 압축한 파일은 package-name.version.tar.gz 라는 파일 이름을 갖는다.
      • bzip2 을 통해 압축한 파일은 package-name.version.tar.bz2 라는 이름을 갖는다.
  • 소스코드 컴파일 및 설치 절차

      # tar로 .gz 또는 bz2를 압축해제
      $ tar -xvzf package-name.version.tar.gz
      OR
      $ tar -xvjf package-name.version.tar.bz2
        
      # 해당 디렉터리로 이동
      $ cd package-name.version
        
      # 아래 3가지 명령 입력시 시스템에 맞는 환경설정 및 소스코드 컴파일, 설치까지 간단하게 완료
      $ ./configure
      $ make
      $ sudo make install
    
    • configure 스크립트와 config.h.in 파일을 automake에게 전달해 Makefile.in 을 생성한다.
      • configure : Makefile.in 을 바탕으로 시스템 환경변수와 관련 패키지 설치 유무 등을 고려하여 시스템을 위한 Makefileconfig.h 파일을 생성한다.
      • make : Makefile 에 정의된 컴파일 해야 할 소스코드 경로 및 패키지가 사용하는 라이브러리 정보를 바탕으로 컴파일을 수행한다.
      • make install 명령을 통해 컴파일된 패키지를 시스템에 설치한다.

빌드 도구

  • CMake(Cross Platform Make)
    • 크로스플랫폼에서 소스코드를 빌드하도록 해당 시스템에 적합한 Makefile 의 생성만을 수행하는 기존 make 의 발전된 빌드 도구
    • make 는 유닉스 및 리눅스 시스템에서만 이용 가능하지만, cmake 는 윈도우 계열에서 컴파일을 할 수 있는 Makefile 생성이 가능하다.
      • 즉, 소스코드만 있으면 유닉스, 리눅스, macOS 및 윈도우에서 컴파일이 가능하다.
    • cmake 는 오픈 소스 프로젝트에서 많이 채용한다.
    • cmake 를 통해 Makefile 이 생성되면 make 로 컴파일하면 된다.

컴파일러

  • gcc(GNU Compiler Collection)
    • cc는 GNU 프로젝트에서 개발하였다.
      • C, C++, Objective-C, Fortran, Java, Ada, Go 등 다양한 프로그래밍 언어를 지원하는 컴파일러다.
      • 리눅스 커널뿐 아니라 GNU 프로젝트, 리눅스 등 대부분 프로젝트의 표준 컴파일러로 사용된다.
    • 소스코드를 컴파일하는 컴파일러와 다른 시스템환경에서도 컴파일 가능하도록 하는 툴체인 등 크게 2가지로 구성된다.
    • 형식

        gcc [options] 파일명..
      
    • 옵션

      옵션의미
      -o컴파일시 기본 이름 대신 실행파일의 이름을 지정한다.
      -c- 지정한 소스코드를 컴파일하여 목적 파일(.o)를 생성한다.
      - 목적파일을 하나로 합치는 링크는 수행하지 않는다.
      -std- 컴파일할 언어의 버전을 선택한다.
    • 예제

        # hello.c를 컴파일하여 목적 파일을 생성하고 링크하여 실행 파일 생성
        # 실행 파일 이름은 hellogcc
        $ gcc hello.c -o hellogcc 
              
        # hello.c와 world.c를 컴파일하여 helloworldgcc 실행파일 생성
        $ gcc hello.c world.c -o helloworldgcc
              
        # hello.c를 컴파일하여 목적 파일 (hello.o)만을 생성
        $ gcc -c hello.c
              
        # C언어 11버전으로 hello.cpp를 컴파일하고 hellogcc 실행 파일 생성
        $ gcc -std=c111 hello.cpp -o hellogcc
      

아카이브하기

  • tar(tape archive)
    • 백업하거나 배포할 필요가 있을 때 수많은 파일을 하나의 아카이브 파일로 만드는 유틸리티
      • 타르볼(tarball)이라고도 한다.
    • 각 파일 자체의 데이터, 파일 이름, 타임스탬프, 소유권, 파일 접근 허가권, 디렉터리 구조 등 다양한 파일시스템의 파라미터도 함께 묶인다.
    • 파일 구조는 POSIX.1-1988로 표준화되었고, 후에 POSIX.1-2001로 개정되어 현재까지 널리 사용된다.
    • 유닉스의 tar 는 순수하게 아카이브 역할만 수행하고, 리눅스의 tar 는 compress, gzip, bzip2, xz 등을 압축하는 것도 지원한다.
    • 형식

        tar [options][filename]
      
    • 옵션

      옵션의미
      -c, —create- 새로운 tar 파일 생성 - 인자로 여러 파일 이름을 지정해 tar 파일을 만들 수 있다. - 디렉터리를 지정해 하위 모든 파일과 디렉터리에 대한 tar 파일을 생성할 수 있다. - —no-recursion 옵션이 주어지면 바로 하위 파일만 아카이브된다.
      -x, —extract- 묶인 tar 파일을 여러 파일로 다시 해체한다. - 아카이브된 파일 선택 시 해당 파일만 추출할 수 있다.
      -v, —verbose- 각 명령마다 사용자에게 보여주는 정보량을 늘려주는 옵션이다. - -c 와 함께 사용시 tar 파일에 묶여지는 파일을 확인할 수 있다.
      -f, —file생성되는 tar 파일 이름 지정
      -r, —append이미 생성된 tar 파일에 또 다른 파일들을 추가
      -t, —lis- tar 파일 안에 묶여있는 파일 목록 출력 - 인자로 tar 파일 내의 파일을 지정하면 해당 파일 존재 유무를 확인한다.
      -h, —dereference링크 파일이 가리키고 있는 원본 파일도 tar에 포함
      -C, —directory어떤 명령을 수행할 디렉터리 지정
      -p, —preserve-permissionstar 파일에서 파일을 추출할 때 사용자의 권한을 그대로 유지
      -Z, —compress, —uncompress- compress를 사용하여 압축 - 예전 UNIX 계열 표준 압축 파일인 tarZ를 생성
      -z, —gzip, —gunzip- gzip을 사용하여 압축 - tar.gz 형식으로 생성
      -i, —bzip2- bzip2를 사용하여 압축 - tar.bz2 형식으로 생성
      -J, —xz- xz를 사용하여 압축 - tar.xz 형식으로 생성
      -g, —listed-incremental- 새로운 버전의 GNU 형식 증분 백업 지원 - 스냅샷 파일을 지정 - 기존의 아카이브가 없는 경우 모든 파일과 디렉터리가 묶이며 이를 특별히 레벨 0 덤프라고 한다. 그리고 추가된 파일과 디렉터리 정보는 스냅샷 파일을 바탕으로 변경된다. 두 번째 아카이브 할 때에는 기존의 생성된 스냅샷 파일을 바탕으로 변경된 파일만 아카이브가 되며 스냅샷 파일은 변경된 파일에 대한 정보로 다시 갱신된다. 이를 레벨 1 덤프라고 하며 아카이브를 N번 반복하면 레벨 N 덤프가 된다.
      -G, —incremental구 버전의 GNU 형식 증분 백업을 지원
    • 예제

        $ tar -cf archive.tar file1 file2 # file1과 file2를 묶어 archive.tar 생성
              
        $ tar -tvf archive.tar # archive.tar에 속한 파일들을 자세한 정보와 함께 출력
              
        $ tar -xf archive.tar # archive.tar의 모든 파일들을 추출
              
        $ tar -xzvf archive.tar.gz # archive.tar.gZ를 gzip으로 압축 해제하고 모든 파일 추출 (상세 정보 표시됨)
              
        $ tar -cf archive.tar mydir/ # mydir의 모든 파일과 디렉터리를 대상으로 archive.tar 생성
              
        $ tar -czf archive.tar.gz mydir/ # mydir의 모든 파일과 디렉터리를 대상으로 gzip으로 압축 후 archive.tar.gZ를 생성
              
        $ tar -zxvf myfile.tar.gz # myfile.tar.gZ를 gzip으로 압축해제 후 모든 파일 추출 (상세 정보 표시됨)
              
        $ tar -xvf archive.tar documents/work/linuxmaster.xls # archive.tar의 특정 파일 추출
              
        $ tar -xvf archive.tar --wildcards '*.xls' # archive.tar의 특정 패턴의 파일만 추출
              
        $ tar -rvf archive.tar documents/work/linux.xls # archive.tar에 특정 파일 추가
              
        $ tar -uvf archive.tar documents/work/linux.xls # archive.tar에 있는 파일보다 최신파일인 경우 추가
              
        # 특정 디렉터리의 아카이브 크기를 구함
        # 파일명 대신 -를 주면 tar 실행결과를 표준 출력으로 보내서 wc와 같은 명령어로 그 개수를 셀 수 있다.
        $ tar -cf - dcocuments/work/ | wc -c
              
        # MyPhotos에서 ship.jpg를 제외하고 모든 파일을 묶어 airplain.tar.gz를 생성
        $ tar -czf airplaine.tar.gz --exclude='ship.jpg' MyPhotos 
      

압축하기

  • compress, uncompress
    • 파일 크기를 줄이기 위해 압축 알고리즘으로 렘펠지브(Lempel-Ziv)를 사용하고 파일 권한을 유지하며 압축하는 유틸리티
      • 확장자는 파일명 끝에 .Z를 붙이고, 파일명 중 .Z 를 이미 포함하면 추가로 붙이지 않는다.
      • 파일 사이즈가 줄어들 수 없다면 파일 압축 대상에서 제외된다.
    • 설치

        $ sudo yum install ncompress
      
    • 형식

        compress [options] filename
        uncompress [options] filename
      
    • 옵션

      옵션의미
      -c- 압축이나 압축해제 시 파일 수정없이 출력을 표준출력으로 보낸다.
      - 원본 파일보다 압축 파일의 크기가 크더라도 압축은 진행된다.
      -v- 파일이 얼마나 압축되었는지 출력한다.
      - -c 사용 시 이 옵션은 무시된다.
      -f- 사용자 확인 없이 파일을 덮어쓴다.
      - 파일 크기가 줄어들지 않더라도 압축을 계속 수행한다.
      -r지정한 파일 이름이 디렉터리면 그 내부의 모든 파일까지 압축한다.
    • 예제

        $ compress -v myfile # myfile을 Myfile.Z로 압축
              
        $ compress -rv mydir # mydir 이하의 모든 파일 압축 (a, b, c 파일이 있으면 a.Z, b.Z 식으로 압축)
              
        $ compress -c example.xls > new.Z # 압축 결과를 표준 출력으로 보냄 
              
        # 현재 경로의 모든 파일을 tar로 묶고 그 결과를 표준 출력으로 보내며 compress는 표준 출력을 표준 입력으로 받아 myfiles.tar.Z를 생성
        $ tar cvf - * | compress > myfiles.tar.Z 
              
        # uncompress는 myfiles.tar.Z를 압축해제해 표준 출력으로 보내고 tar는 리다이렉션을 통해 표준입력으로 받아 tar 내의 모든 파일 추출
        $ uncompress -c myfiles.tar.Z | tar xvf -
      
  • gzip, gunzip
    • gzip : 파일 크기를 줄이기 위해 렘펠지브 알고리즘을 사용하여 파일을 압축한다.
      • 가능하면 원본 파일과 동일한 소유권, 접근 권한, 파일 수정 시간 등을 유지하면서 파일 이름 뒤에 .gz 로 교체된다.
      • - 사용 시 표준 입력을 받거나 표준 출력으로 실행 결과를 받거나 보낼 수 있어 다른 명령어와 파이프 조합을 통해 편리하게 사용할 수 있다.
      • 일반 모든 파일을 압축 시도하나, 링크 파일은 제외된다.
    • 형식

        gzip [options] filename
        gunzip [options] filename
      
    • 옵션

      옵션의미
      -d, —decompress- 압축파일을 압축해제할 때 사용한다.
      - gunzip과 zcat도 동일한 동작을 한다.
      -#, (—fast), —best- -1 이나 -fast 사용 시 압축 시간을 최소화하는 방식으로 압축한다. (압축률은 떨어질 수 있음)
      - -9-best 를 사용하면 압축률을 최대로 압축한다. (압축 시간은 오래 걸릴 수 있음)
      - 기본값은 압축 시간과 압축효율을 고려한 -6
      -c, —stdout, —to-stdout실행결과를 표준출력으로 보내며 원본 파일의 변경 없이 유지된다.
      -l, —list- 압축된 파일정보를 출력한다.
      - 압축 크기, 원본 파일 크기, 압축률, 원본 파일 이름 등이 출력된다.
    • 예제

        $ gzip myfiles.tar # myfiles.tar를 압축하여 myfiles.tar.gZ를 생성
              
        $ gzip -c file1 file2 > foo.gz # 여러 파일을 압축해 하나의 파일 생성
              
        # myfiles.tar.gZ 압축을 푼다.
        $ gzip -d myfiles.tar.gz
        OR
        $ gunzip myfile.tar.gz
              
        # myfiles.tar.gZ의 압축을 풀고 tar로 모든 파일 추출
        $ gzip -cd myfiles.tar.gz | tar xvf -
      
    • zcat : zunzip, gzip -d 과 동작이 동일하고, 압축된 파일의 내용을 확인하고 싶을 때 사용한다.

        zcat file.Z | wc -c # file.Z 압축 파일의 원본 파일 크기를 확인
      
  • bzip2, bunzip2
    • 파일 크기를 줄이기 위해 버로우 휠러 알고리즘과 허프만 코딩을 사용하여 압축한다.
    • 압축 효율은 좋지만 압축 속도가 느리다.
    • 압축하면 원본 파일의 파일명 끝에 bz2 가 붙는다.
    • 형식

        bzip2 [options] filename
        bunzip2 [options] filename
      
    • 옵션

      옵션의미
      -d, —decompress- 압축 파일을 압축해제한다.
      - bunzip2와 bzcat 또한 동일하게 압축 해제한다.
      -z, —compress파일 압축함
      -#, (—fast), —best- -1 이나 -fast 사용 시 압축 시간을 최소화하는 방식으로 압축한다. (압축률은 떨어질 수 있음)
      - -9-best 를 사용하면 압축률을 최대로 압축한다. (압축 시간은 오래 걸릴 수 있음)
      - 기본값은 압축 시간과 압축효율을 고려한 -6
      -c, —stdout, —to-stdout실행결과를 표준출력으로 보내며 원본 파일의 변경 없이 유지된다.
      -f, —force이미 출력 파일이 존재해도 덮어쓴다.
    • 예제

        # 주어진 파일 압축
        $ bzip2 -z myfiles.txt
        OR
        $ bzip2 myfile.txt
              
        # 주어진 파일 압축 해제
        $ bzip2 -d myfiles.txt.bz2
        OR
        $ bunzip2 myfile.txt.bz2
      
  • xz, unxz
    • 파일을 압축할 수 있는 유틸리티
    • LZMA 압축 알고리즘을 사용하여 높은 압축률을 보인다.
    • 확장자는 .xz 를 사용하고 파일명을 지정하지 않고 - 를 사용하면 수행 결과를 표준 출력으로 보낸다.
    • 형식

        xz [options] file_name
        unxz [options] file_name
      
    • 옵션

      옵션의미
      -z, —compress압축하는 옵션으로 옵션이 지정되지 않아도 기본으로 압축을 수행한다.
      -d, —decompress- 압축 해제
      - unxz도 동일한 역할 수행
      -l, —list압축된 파일 정보 출력
    • 예제

        # backup.tar를 압축하여 backup.tar.xz 파일 생성
        $ xz backup.tar
        OR
        $ xz -z backup.tar
              
        # backup.tar.xz를 압축해제하여 backup.tar 생성
        $ unxz backup.tar.xz
        OR
        $ xz -d backup.tar.xz
      
  • zip, unzip
    • 다수의 파일을 압축할 수 있다.
    • 다양한 OS에서 압축 기능을 제공한다.
    • 확장자는 .zip 이다.
    • 형식

        zip [options] archive inpath inpath ...
        unzip [options] archive
      
    • 옵션

      옵션의미
      -r디렉터리 압축시 하위의 파일과 디렉터리를 모두 압축
    • 예제

        # backup.tar를 압축해 backup.zip 생성
        $ zip backup backup.tar
              
        # data 디렉터리 아휘 모든 파일 및 디렉터리를 압축해 backup.zip 생성
        $ zip -r backup data
              
        # backup.zip 압축해제
        $ unzip backup.zip
      

© 2021. All rights reserved.

yaejinkong의 블로그