Linuxの基礎 6日目

# 6日目

## 1 ファイルの操作

### 1-1 ファイルの検索
- **locate**コマンドでファイルを検索できる
  - どこで保存したのか忘れてしまったファイルなどを名前で検索したいときは、**locate**コマンドを利用する
    ```
    # ファイルを名前で検索する際のコマンド書式
    locate ファイル名パターン

    # hostsを含むファイルもしくはディレクトリを検索
    $ locate hosts
    /etc/hosts
    /etc/cloud/templates/hosts.alpine.tmpl
    /etc/cloud/templates/hosts.arch.tmpl
    /etc/cloud/templates/hosts.debian.tmpl
    /etc/cloud/templates/hosts.freebsd.tmpl
    /etc/cloud/templates/hosts.gentoo.tmpl
    /etc/cloud/templates/hosts.photon.tmpl
    /etc/cloud/templates/hosts.redhat.tmpl
    /etc/cloud/templates/hosts.suse.tmpl
    (以下省略)
    ```
  - 「*」や「?」などのメタキャラクタを使うこともできる。その場合はファイル名パターンを引用符で囲む必要がある
    ```
    # メタキャラクタを使った検索例
    $ locate '*sh*locate'
    /usr/share/bash-completion/completions/fallocate
    /usr/share/doc/mlocate
    ```
  - 検索結果を絞り込むにはgrepコマンドを使用して絞り込むのが可能
    ```
    # grepを使った絞り込みの例
    # 以下の例はhostsと含まれているファイルとディレクトリを検索し、その検索結果をパイプ「|」で受け渡して、grepコマンドをかけて、「/etc」ディレクトリの配下にあるか検索している
    $ locate hosts | grep '^/etc'
    /etc/hosts
    /etc/cloud/templates/hosts.alpine.tmpl
    /etc/cloud/templates/hosts.arch.tmpl
    /etc/cloud/templates/hosts.debian.tmpl
    /etc/cloud/templates/hosts.freebsd.tmpl
    /etc/cloud/templates/hosts.gentoo.tmpl
    /etc/cloud/templates/hosts.photon.tmpl
    /etc/cloud/templates/hosts.redhat.tmpl
    /etc/cloud/templates/hosts.suse.tmpl
    ```
  - locateコマンドは、リアルタイムでファイルを検索しているのではなく、あらかじめ作成済みのファイル名データベースを使って検索している
    - したがって、ファイル名データベース更新後に作成されたファイルは検索することができない
    - ファイル名データベースを更新するには、**updatedb**コマンドを実行する
    - updatedbコマンドはroot(管理者)ユーザーのみが実行可能
      ```
      # ファイル名データベースの更新
      $ su -
      Password:

      $ updatedb
      ```
- **find**コマンドで多様な条件によるファイル検索ができる
  - ファイル名だけでなく、様々な条件を指定して、リアルタイムでファイル名を検索できるのが**find**コマンドである。1
    - 主な検索式
      | 検索式 | 説明 |
      | ---- | ---- |
      | -name | ファイル名を指定する |
      | -size | ファイルサイズを指定する(例：10c(10バイト), 10k(10KB), +10K(10KB以上)) |
      | -atime | ファイルの最終アクセス日を指定する(例：3(3日前), +3(3日よりも前), -3(3日以内)) |
      | -amin | ファイルの最終アクセス時刻を〇分前で指定する |
      | -mtime | ファイルの最終修正日を指定する |
      | -mmin | ファイルの最終更新時刻を〇分前で指定する |
      | -perm | ファイルのアクセス権を指定する(例：664(rw-rw-r--), +444(少なくとも全ユーザーが読み取りできる)) |
      | -type | ファイルタイプを指定する(例：f(ファイル), d(ディレクトリ), l(シンボリックリング)) |
    - findコマンドの基本的な使い方
      ```
      # リアルタイムでのファイル検索コマンド書式
      find [検索対象パス] [検索式]

      # findコマンドの基本的な使い方
      # 以下の例では、「/usr/bin」ディレクトリの中にある、ファイル名が「c」から始まる(バイナリー)ファイルを検索している
      # 検索対象パスが「/usr/bin」であり、検索条件式を「-name "c*"」としているので
      $ find /usr/bin -name "c*"
      /usr/bin/chvt
      /usr/bin/crontab
      /usr/bin/chgrp
      /usr/bin/cpupower
      /usr/bin/chmem
      /usr/bin/captoinfo
      /usr/bin/cpio
      /usr/bin/clear
      /usr/bin/curl
      /usr/bin/choom
      /usr/bin/cvtsudoers
      /usr/bin/cat

      # 複数の検索条件を指定
      # 以下の例ではファイルサイズが、10KBいない且つ、ファイルのアクセス日が1日以内であること
      $ find -size -10k -atime -1
      ./.bash_profile
      ./.bash_history
      ./.bashrc
      ```
    - findコマンドはただ単にファイルを検索するだけではなく、**-exec**を付けることで、検索して見つかったファイルに対して、何らかの操作を加えることも可能
      ```
      # 検索したファイルに対してコマンド実行する書式
      find [検索対象パス] [検索式] -exec 実行コマンド {} \;

      # 1年以上アクセスされていないファイルを削除
      $ find -atime +366 -exec rm {} \;

      # 1年未満アクセスされていないファイルとディレクトリの名前を確認
      $ find -atime -366 -exec ls {} \;
      ./.bash_profile
      ./.bash_logout
      procps
      ./.lesshst
      ./.bash_history
      ./.viminfo
      ./.bashrc
      ```

### 1-2 テキストファイルの内容検索
- 文字列のパワーんを表記する代表的な表現方法に**正規表現**がある
  - 正規表現
    - コンピュータの世界で文字列を処理するときに避けて通ることができないのは**正規表現**(Regular Expression)である
    - 正規表現とは、文字列のパターンを表記するための手法で、様々なメタキャラクタを利用できる
    - 以下に代表的なメタキャラクタと正規表現を次の表にまとめる
      - メタキャラクタ
        | メタキャラクタ | 説明 |
        | ---- | ---- |
        | . | 任意の1文字にマッチする |
        | * | 直前にある文字の0回以上の繰り返しにマッチする |
        | ? | 直前にある文字の0回または1回の繰り返しにマッチする |
        | + | 直前にある文字の1回以上の繰り返しにマッチする |
        | [] | []内の任意の1文字にマッチする |
        | ^ | 行頭にマッチする(最初にあるときのみ有効) |
        | $ | 行末にマッチする(最後にあるときのみ有効) |
        | \ | 直後に続くメタキャラクタの意味を解除する |
      - 正規表現
        | 正規表現 | 説明 |
        | ---- | ---- |
        | a.c | 「abc」,「a1c」などにマッチし、「Abc」,「ac」などにマッチしない |
        | .* | 0文字以上の文字列にマッチする |
        | [A-Z] | 大文字アルファベット1文字にマッチする |
        | [0-9][0-9] | 2桁の数字にマッチする |
        | ^$ | 空行(改行のみの行)にマッチする |
        | ^# | 行の中ではなく行頭に「#」という文字にマッチする |
        | \.txt | 「.txt」という文字列にマッチする |
        | friends? | 「friends」または「friend」にマッチする |
        | 123+ | 「123」,「1233」にマッチし、「12」などにマッチしない |
- **grep**コマンドでテキストファイルの内容を検索できる
  - **grep**コマンドは、テキストファイルの内容を検索し、指定した正規表現にマッチする行があれば表示するコマンド
    ```
    # テキストファイルの内容を検索するコマンド書式
    grep [オプション] [文字列パターン] [検索対象ファイル]
    ```
    - **grep**コマンドの主なオプション
      | オプション | 説明 |
      | ---- | ---- |
      | -F | 文字列パターンを正規表現ではなく単なる文字列として扱う |
      | -c | マッチした行数だけを表示する |
      | -i | 大文字と小文字を区別しない |
      | -l | マッチした行のあるファイルのみを表示する |
      | -n | 行番号をあわせて表示する |
      | -v | マッチした行ではなくマッチしなかった行を表示する |
      | -E | 拡張正規表現で検索を行う |
      | -e | 一致処理に指定した正規表現を使う |
      ```
      # 文字列「www」を検索
      $ grep www /etc/services
      #       http://www.iana.org/assignments/port-numbers
      http            80/tcp          www www-http    # WorldWideWeb HTTP
      http            80/udp          www www-http    # HyperText Transfer Protocol
      www-ldap-gw     1760/tcp                # www-ldap-gw
      www-ldap-gw     1760/udp                # www-ldap-gw
      www-dev         2784/tcp                # world wide web - development
      www-dev         2784/udp                # world wide web - development
      flirtmitmir     3840/tcp                # www.FlirtMitMir.de
      flirtmitmir     3840/udp                # www.FlirtMitMir.de

      # 文字列「www」を-iオプション付きで検索
      $ grep -i www /etc/services
      #       http://www.iana.org/assignments/port-numbers
      http            80/tcp          www www-http    # WorldWideWeb HTTP
      http            80/udp          www www-http    # HyperText Transfer Protocol
      webcache        8080/tcp        http-alt        # WWW caching service
      webcache        8080/udp        http-alt        # WWW caching service
      www-ldap-gw     1760/tcp                # www-ldap-gw
      www-ldap-gw     1760/udp                # www-ldap-gw
      www-dev         2784/tcp                # world wide web - development
      www-dev         2784/udp                # world wide web - development
      flirtmitmir     3840/tcp                # www.FlirtMitMir.de
      flirtmitmir     3840/udp                # www.FlirtMitMir.de

      # 文字列に「bash」が含まれる行を表示
      $ grep bash 
      /etc/default/useradd:SHELL=/bin/bash

      # grepコマンドによる絞り込み例
      $ ps ax | grep bash
      9 pts/0    Ss+    0:00 -bash
      34 pts/1    Ss     0:00 -bash
      80 pts/1    S+     0:00 grep --color=auto bash
      ```
- **grep**コマンドは正規表現が利用できる
  ```
  # bashrcファイル内にa-zまたは、A-Zで始まる行頭を表示する
  $ grep "^[a-zA-Z]" /etc/bashrc
  if [ -z "$BASHRCSOURCED" ]; then
  fi
  ```

### 1-3 テキストファイルを扱う便利なコマンド
- **head**コマンドや**tail**コマンドを使ってファイルの先頭や末尾だけを表示できる
  - **head**コマンド
    - ファイルの先頭部分だけを表示するコマンドである
    - デフォルトでは先頭10行を表示する
      ```
      # ファイルの先頭を表示するコマンド書式
      head [-行数] [ファイル名]

      # /etc/passwdファイルの先頭10行を表示
      $ head /etc/passwd
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      halt:x:7:0:halt:/sbin:/sbin/halt
      mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      operator:x:11:0:operator:/root:/sbin/nologin

      # パイプを使って、他のコマンド出力の先頭部分を表示することも可能
      # psコマンド出力の先頭5行を表示
      $ ps aux | head -5
      USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root         1  0.0  0.0   2324  1508 ?        Sl   Aug12   0:00 /init
      root         4  0.0  0.0   2324     4 ?        Sl   Aug12   0:00 plan9 --control-socket 5 --log-level 4 --server-fd 6 --pipe-fd 8 --log-truncate
      root         7  0.0  0.0   2332   112 ?        Ss   Aug12   0:00 /init
      root         8  0.0  0.0   2348   120 ?        S    Aug12   0:00 /init
      ```
  - **tail**コマンド
    - headコマンドとは逆に、末尾部分だけを表示するのが**tail**コマンドである。
    - デフォルトでは末尾10行を表示する
      ```
      # ファイルの末尾を表示するコマンド書式
      tail [-行数] [ファイル名]

      # /etc/servicesファイルの末尾10行を表示
      $ tail /etc/services
      aigairserver    21221/tcp               # Services for Air Server
      ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
      ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
      edi_service     34567/udp               # dhanalakshmi.org EDI Service
      axio-disc       35100/tcp               # Axiomatic discovery protocol
      axio-disc       35100/udp               # Axiomatic discovery protocol
      pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
      cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
      cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
      spremotetablet  46998/tcp               # Capture handwritten signatures

      # もちろん、headコマンドの場合と同様に、パイプを使うことも可能
      # psコマンド出力の末尾5行を表示
      root       126  0.0  0.0   2332   112 ?        Ss   01:21   0:00 /init
      root       127  0.0  0.0   2348   120 ?        S    01:21   0:00 /init
      general+   128  0.0  0.0   8404  5412 pts/1    Ss   01:21   0:00 -bash
      general+   218  0.0  0.0  10084  3324 pts/1    R+   02:06   0:00 ps aux
      general+   219  0.0  0.0   5616  1020 pts/1    S+   02:06   0:00 tail -5
      ```
- **sort**コマンドを使ってファイルの内容をソートできる
  - **sort**コマンドは、ファイルの内容をソート(並べ替え)して表示する。
  - デフォルトでは昇順(アルファベット)にソートされる
    ```
    # ファイルの内容をソートするコマンド書式
    sort [オプション] ファイル名

    # sample_sort.txtファイルをソート
    # 上記のコマンドでは、数値がソートされていないことがわかる
    $ cat sample_sort.txt
    1:/bin
    8:/var/spool/mail
    12:/usr/games
    998:/var/lib/chrony
    11:/root
    74:/var/empty/sshd

    # 対して、sortコマンドを使用するとソートが可能
    # しかし、以下のコマンドを見てわかる通り、これは1文字目だけを見て(1→7→8→9)ソートしているからである
    $ sort sample_sort.txt
    11:/root
    12:/usr/games
    1:/bin
    74:/var/empty/sshd
    8:/var/spool/mail
    998:/var/lib/chrony

    # 文字列ではなく数字を数値としてソートしたい場合は、-nオプションを使う
    $ sort -n sample_sort.txt
    1:/bin
    8:/var/spool/mail
    11:/root
    12:/usr/games
    74:/var/empty/sshd
    998:/var/lib/chrony

    # -rオプションを使うと、逆順(降順)にソート可能
    $ sort -nr sample_sort.txt
    998:/var/lib/chrony
    74:/var/empty/sshd
    12:/usr/games
    11:/root
    8:/var/spool/mail
    1:/bin
    ```
  - 主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -n | 数値として並べ替える |
    | -r | 降順で並べ替える |
    | -f | 項目の区切りを指定する |
    | -k | キーを指定して並べ替える |
    | -u | 重複行を省いて並べ替える |
    | -f | 大文字小文字を関係なく並べ替える |
- **nl**コマンドを使って行番号を付けてファイルの内容を表示することができる
  ```
  # ファイルに行番号を付加して表示するコマンド書式
  nl [ファイル名]

  # sampleファイルに行番号を付けて表示
  nl sample_sort.txt
      1  1:/bin
      2  8:/var/spool/mail
      3  12:/usr/games
      4  998:/var/lib/chrony
      5  11:/root
      6  74:/var/empty/sshd
  ```
- **cutコマンド**を使ってファイルのそれぞれの行から指定したフィールドのみを取り出すことができる
  - たとえば、「:」で区切られた行の第2、第4フィールドだけを取り出すといったことが可能
    ```
    # 指定したフィールドのみを取り出すコマンド書式
    cut [オプション] [ファイル名]

    # /etc/passwdファイルの第1および第3フィールドを出力(一部抜粋)
    $ cut -d: -f1,3 /etc/passwd
    root:0
    bin:1
    daemon:2
    adm:3
    lp:4
    sync:5
    (以下省略)
    ```
  - 主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -b | 必要な項目をバイト数で指定する |
    | -d | 区切り文字を指定する |
    | -f | 必要な項目を項目数で指定する |

- **wc**コマンドを使ってファイルの行数、単語数、バイト数を表示することができる
  ```
  # ファイルの行数などを表示
  wc [オプション] [ファイル名]

  # /etc/hostsファイルの行数、単語数、バイト数を表示
  $ wc /etc/hosts
  17  62 551 /etc/hosts

  # ファイル数を確認
  # -lオプションを使うと、行数だけを表示する
  # 次の例では、/etcディレクトリ以下にあるファイルやディレクトリの数を調べている
  $ ls /etc | wc -l
  189
  ```
  - 主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -c | バイト数を表示する |
    | -m | 文字数を表示する（マルチバイト文字に対応） |
    | -l | 改行の数を表示する |
    | -w | 単語数を表示する |
    | -L | 最も長い行の長さを表示する |

## 2 ソフトウェアとパッケージ

### 2-1 パッケージとは?
- ソフトウェアをインストールする単位がパッケージである
  - ほとんどのLinuxディストリビューションでは、ソフトウェアを**パッケージ**という単位で管理している
  - **パッケージ**
    - 実行プログラムや設定ファイル、取り扱い説明のドキュメントファイルなどが1つのファイルにまとめられている
    - ソフトウェアが動作するファイルは、パッケージ内だけにまとめられているわけではなく、いろいろなプログラムが共通して利用するライブラリや、他のパッケージが必要となることもある
      - 例えば、パッケージAがパッケージBに含まれるファイルを利用しているとすれば、パッケージAのインストールに先立ってパッケージBのインストールが必要になる
      - また、パッケージBを削除すると、パッケージAのソフトウェアは実行できなくなる
      - 上記のような関係を**依存関係**という
- Linuxで使われるパッケージの形式は複数あり、互換性はない
  - Red Hat系ディストリビューション
    - RPMパッケージ
  - Debian系ディストリビューション
    - debパッケージ
- パッケージのインストール状態、パッケージのバージョン、依存関係の情報を管理する「**パッケージ管理システム**」がある
  - パッケージ管理システムには以下のものがある
    - CentOSやFedoraで採用される**YUM**がある
    - Debian GNU/LinuxやUbuntuで採用される**APT**がある

### 2-2 パッケージの管理(CentOS)
- パッケージをインストールするときは依存関係のあるパッケージも必要となる
- RPMパッケージはrpmコマンドで管理する
  - RPMパッケージ
    - レッドハット社によって開発されたパッケージ形式である
    - 現在では、Red Hat Enterprise LinuxをはじめCentOS、Fedora、Vine Linux、openSUSEなど、数多くのディストリビューションに採用されている
    - RPMパッケージに関する操作は**rpm**コマンドで行う
      ```
      # RPMパッケージを管理するコマンド書式
      rpm オプション

      # インストール済みのRPMパッケージ一覧を表示
      # -qaオプションを付けるとインストール済みのRPMパッケージ一覧を表示
      $ rpm -qa
      tzdata-2023c-1.el9.noarch
      fonts-filesystem-2.0.5-7.el9.1.noarch
      adobe-source-code-pro-fonts-2.030.1.050-12.el9.1.noarch
      dejavu-sans-fonts-2.37-18.el9.noarch
      langpacks-core-font-en-3.0-16.el9.noarch
      abattis-cantarell-fonts-0.301-4.el9.noarch
      geolite2-country-20191217-6.el9.noarch
      geolite2-city-20191217-6.el9.noarch
      gawk-all-langpacks-5.1.0-6.el9.x86_64
      quota-nls-4.06-6.el9.noarch
      python3-setuptools-wheel-53.0.0-12.el9.noarch
      publicsuffix-list-dafsa-20210518-3.el9.noarch
      pcre2-syntax-10.40-2.el9.noarch
      (以下省略)

      # vim-commonパッケージの説明を表示
      # -qiオプションを付けると指定したパッケージの説明を表示
      $ rpm -qi vim-common
      Name        : vim-common
      Epoch       : 2
      Version     : 8.2.2637
      Release     : 20.el9
      Architecture: x86_64
      Install Date: Tue 08 Aug 2023 06:39:11 AM JST
      Group       : Unspecified
      Size        : 31861155
      License     : Vim and MIT
      Signature   : RSA/SHA256, Sat 11 Feb 2023 05:50:23 AM JST, Key ID 05b555b38483c65d
      Source RPM  : vim-8.2.2637-20.el9.src.rpm
      Build Date  : Fri 10 Feb 2023 01:35:24 AM JST
      Build Host  : x86-04.stream.rdu2.redhat.com
      Packager    : builder@centos.org
      Vendor      : CentOS
      URL         : http://www.vim.org/
      Summary     : The common files needed by any version of the VIM editor
      Description :
      VIM (VIsual editor iMproved) is an updated and improved version of the
      vi editor.  Vi was the first real screen-based editor for UNIX, and is
      still very popular.  VIM improves on vi by adding new features:
      multiple windows, multi-level undo, block highlighting and more.  The
      vim-common package contains files which every VIM binary will need in
      order to run.

      If you are installing vim-enhanced or vim-X11, you'll also need
      to install the vim-common package.

      # パッケージがインストールされているかどうかを確認する
      # -qオプションを付けると指定したパッケージがインストールされているかを確認することができる
      $ rpm -q postfix
      postfix-3.5.9-21.el9.x86_64

      $ rpm -q httpd
      httpd-2.4.57-5.el9.x86_64

      # htopパッケージをインストール
      $ su -
      Password:
      $ rpm -ivh htop-2.2.0-3.el7.x86_64.rpm

      # htopパッケージをアップグレード
      $ rpm -Uvh htop-2.2.0-3.el7.x86_64.rpm

      # htopパッケージをアンインストール
      $ rpm -e htop
      ```
      - 主なオプション(rpmコマンドではオプションは必須)
        | オプション | 説明 |
        | ---- | ---- |
        | -ivh パッケージファイル名 | 指定したパッケージをインストールする |
        | -Uvh パッケージファイル名 | 指定したパッケージをアップグレードする |
        | -e パッケージ名 | 指定したパッケージをアンインストールする |
        | -q パッケージ名 | 指定したパッケージがインストールされているのかを確認する |
        | -qa | インストール済みのパッケージを一覧表示する |
        | -qi パッケージ名 | 指定したパッケージの説明を表示する |
- パッケージ管理を統合的に行えるシステムとして**YUM**がある
  - **YUM**とは?
    - CentOSでは、より高度なパッケージ管理を行うYUM(Yellowdog Updater Modified)というパッケージ管理システムを使ってRPM形式のパッケージを取り扱う
    - YUMの特徴は次のとおりである
      - パッケージをインターネット上で検索できる
      - 必要なパッケージをインターネット上から自動的にダウンロードできる
      - rpmコマンドを使う時のように、インストールやアップグレードするパッケージをあらかじめダウンロードしておかなくてもよい
      - YUMを利用する際は**yum**コマンドを利用する
- YUMでは**yum**コマンドを使ってパッケージを管理する
  ```
  # YUMのパッケージ管理コマンド書式
  $ yum サブコマンド

  # httpdパッケージをインストール
  # パッケージにインストールやアップグレード、アンインストールにはroot(管理者)ユーザーの権限が必要
  # httpdパッケージをインストールすると、依存関係のあるパッケージも自動でインストールされる
  $ su -
  Password:
  $ yum install httpd
  Last metadata expiration check: 0:00:12 ago on Sun 13 Aug 2023 05:45:13 AM JST.
  Dependencies resolved.
  ======================================================================================================================== Package                           Architecture          Version                         Repository                Size
  ========================================================================================================================Installing:
  httpd                             x86_64                2.4.57-5.el9                    appstream                 47 k
  Installing dependencies:
  apr                               x86_64                1.7.0-11.el9                    appstream                123 k
  apr-util                          x86_64                1.6.1-23.el9                    appstream                 95 k
  apr-util-bdb                      x86_64                1.6.1-23.el9                    appstream                 13 k
  centos-logos-httpd                noarch                90.4-1.el9                      appstream                252 k
  httpd-core                        x86_64                2.4.57-5.el9                    appstream                1.4 M
  httpd-filesystem                  noarch                2.4.57-5.el9                    appstream                 14 k
  httpd-tools                       x86_64                2.4.57-5.el9                    appstream                 81 k
  mailcap                           noarch                2.1.49-5.el9                    baseos                    33 k
  Installing weak dependencies:
  apr-util-openssl                  x86_64                1.6.1-23.el9                    appstream                 15 k
  mod_http2                         x86_64                1.15.19-4.el9                   appstream                149 k
  mod_lua                           x86_64                2.4.57-5.el9                    appstream                 61 k

  Transaction Summary
  ========================================================================================================================Install  12 Packages

  Total download size: 2.2 M
  Installed size: 6.5 M
  Is this ok [y/N]: y
  Downloading Packages:
  (1/12): apr-util-1.6.1-23.el9.x86_64.rpm                                                563 kB/s |  95 kB     00:00
  (2/12): mailcap-2.1.49-5.el9.noarch.rpm                                                 188 kB/s |  33 kB     00:00
  (3/12): apr-1.7.0-11.el9.x86_64.rpm                                                     658 kB/s | 123 kB     00:00
  (4/12): apr-util-bdb-1.6.1-23.el9.x86_64.rpm                                            274 kB/s |  13 kB     00:00
  (5/12): apr-util-openssl-1.6.1-23.el9.x86_64.rpm                                        292 kB/s |  15 kB     00:00
  (6/12): httpd-2.4.57-5.el9.x86_64.rpm                                                   1.8 MB/s |  47 kB     00:00
  (7/12): centos-logos-httpd-90.4-1.el9.noarch.rpm                                        3.5 MB/s | 252 kB     00:00
  (8/12): httpd-filesystem-2.4.57-5.el9.noarch.rpm                                        318 kB/s |  14 kB     00:00
  (9/12): httpd-tools-2.4.57-5.el9.x86_64.rpm                                             2.2 MB/s |  81 kB     00:00
  (10/12): mod_lua-2.4.57-5.el9.x86_64.rpm                                                2.0 MB/s |  61 kB     00:00
  (11/12): mod_http2-1.15.19-4.el9.x86_64.rpm                                             3.4 MB/s | 149 kB     00:00
  (12/12): httpd-core-2.4.57-5.el9.x86_64.rpm                                             6.4 MB/s | 1.4 MB     00:00
  ------------------------------------------------------------------------------------------------------------------------Total                                                                                   1.7 MB/s | 2.2 MB     00:01
  Running transaction check
  Transaction check succeeded.
  Running transaction test
  Transaction test succeeded.
  Running transaction
    Preparing        :                                                                                                1/1
    Installing       : apr-1.7.0-11.el9.x86_64                                                                       1/12
    Installing       : apr-util-bdb-1.6.1-23.el9.x86_64                                                              2/12
    Installing       : apr-util-openssl-1.6.1-23.el9.x86_64                                                          3/12
    Installing       : apr-util-1.6.1-23.el9.x86_64                                                                  4/12
    Installing       : httpd-tools-2.4.57-5.el9.x86_64                                                               5/12
    Running scriptlet: httpd-filesystem-2.4.57-5.el9.noarch                                                          6/12
    Installing       : httpd-filesystem-2.4.57-5.el9.noarch                                                          6/12
    Installing       : centos-logos-httpd-90.4-1.el9.noarch                                                          7/12
    Installing       : mailcap-2.1.49-5.el9.noarch                                                                   8/12
    Installing       : httpd-core-2.4.57-5.el9.x86_64                                                                9/12
    Installing       : mod_lua-2.4.57-5.el9.x86_64                                                                  10/12
    Installing       : mod_http2-1.15.19-4.el9.x86_64                                                               11/12
    Installing       : httpd-2.4.57-5.el9.x86_64                                                                    12/12
    Running scriptlet: httpd-2.4.57-5.el9.x86_64                                                                    12/12
  /sbin/ldconfig: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link


    Verifying        : mailcap-2.1.49-5.el9.noarch                                                                   1/12
    Verifying        : apr-1.7.0-11.el9.x86_64                                                                       2/12
    Verifying        : apr-util-1.6.1-23.el9.x86_64                                                                  3/12
    Verifying        : apr-util-bdb-1.6.1-23.el9.x86_64                                                              4/12
    Verifying        : apr-util-openssl-1.6.1-23.el9.x86_64                                                          5/12
    Verifying        : centos-logos-httpd-90.4-1.el9.noarch                                                          6/12
    Verifying        : httpd-2.4.57-5.el9.x86_64                                                                     7/12
    Verifying        : httpd-core-2.4.57-5.el9.x86_64                                                                8/12
    Verifying        : httpd-filesystem-2.4.57-5.el9.noarch                                                          9/12
    Verifying        : httpd-tools-2.4.57-5.el9.x86_64                                                              10/12
    Verifying        : mod_http2-1.15.19-4.el9.x86_64                                                               11/12
    Verifying        : mod_lua-2.4.57-5.el9.x86_64                                                                  12/12

  Installed:
    apr-1.7.0-11.el9.x86_64                  apr-util-1.6.1-23.el9.x86_64             apr-util-bdb-1.6.1-23.el9.x86_64
    apr-util-openssl-1.6.1-23.el9.x86_64     centos-logos-httpd-90.4-1.el9.noarch     httpd-2.4.57-5.el9.x86_64
    httpd-core-2.4.57-5.el9.x86_64           httpd-filesystem-2.4.57-5.el9.noarch     httpd-tools-2.4.57-5.el9.x86_64
    mailcap-2.1.49-5.el9.noarch              mod_http2-1.15.19-4.el9.x86_64           mod_lua-2.4.57-5.el9.x86_64

  Complete!

  # nginxパッケージの情報を表示
  # infoサブコマンドを使用すると、指定したパッケージの情報を表示する
  $ yum info nginx
  Last metadata expiration check: 0:38:02 ago on Sun 13 Aug 2023 05:45:13 AM JST.
  Available Packages
  Name         : nginx
  Epoch        : 1
  Version      : 1.22.1
  Release      : 2.el9
  Architecture : x86_64
  Size         : 39 k
  Source       : nginx-1.22.1-2.el9.src.rpm
  Repository   : appstream
  Summary      : A high performance web server and reverse proxy server
  URL          : https://nginx.org
  License      : BSD
  Description  : Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
              : IMAP protocols, with a strong focus on high concurrency, performance and low
              : memory usage.
  
  # キーワード「ruby」でパッケージ検索
  # searchサブコマンドを使用すると、指定したパッケージを検索する
  $ yum search ruby
  Last metadata expiration check: 0:40:49 ago on Sun 13 Aug 2023 05:45:13 AM JST.
  ============================================== Name Exactly Matched: ruby ==============================================
  ruby.i686 : An interpreter of object-oriented scripting language
  ruby.x86_64 : An interpreter of object-oriented scripting language
  ============================================= Name & Summary Matched: ruby =============================================
  kf5-kross-ruby.x86_64 : KF5 Kross plugin for ruby
  libselinux-ruby.x86_64 : SELinux ruby bindings for libselinux
  mapserver-ruby.x86_64 : Ruby/Mapscript map making extensions to Ruby
  munin-plugins-ruby.noarch : Ruby plugins for Munin resource monitoring
  remctl-ruby.x86_64 : Ruby interface to remctl
  rrdtool-ruby.x86_64 : Ruby RRDtool bindings
  ruby-augeas.x86_64 : Ruby bindings for Augeas
  ruby-build.x86_64 : Compile and install Ruby
  ruby-build-rbenv.x86_64 : rbenv plugin to compile and install Ruby

  # システムをアップデートする
  $ yum update
  ```
  - yumコマンドの主なサブコマンド
    | サブコマンド | 説明 |
    | ---- | ---- |
    | update | システム全体をアップデートする |
    | install パッケージ名 | 指定したパッケージをインストールする |
    | remove パッケージ名 | 指定したパッケージをアンインストールする |
    | update パッケージ名 | 指定したパッケージをアップデートする |
    | list | パッケージを一覧表示する(未インストールも含む) |
    | info パッケージ名 | 指定したパッケージの情報を表示する |
    | search "キーワード" | 指定したキーワードでパッケージを検索する |

## 3 ファイルシステム

### 3-1 ハードウェアとLinux
- コンピュータを構成するパーツや周辺機器をデバイスという
  - 主なコンピュータを構成するパーツ
    | パーツの名称 | 説明 |
    | ---- | ---- |
    | マザーボード | 各種デバイスを設置するベースとなる基盤。様々なポートやチップが搭載されている |
    | プロセッサ(CPU) | コンピュータの頭脳に相当する。Intel社のCore iシリーズやCeleronといった製品が有名 |
    | メモリ | 一時的にデータを記憶しておく装置。電源を切るとデータは消えてしまう。Linuxを動かすには1GB～8GB程度が必要 |
    | ハードディスク | 時期を使ってデータを記録する記録装置。比較的低価格で大容量だが、読み書きの速度は遅い |
    | SSD | フラッシュメモリを使った記憶装置。ハードディスクよりも高速だが、やや高価 |
    | 光学ドライブ | データをバックアップしたり配布用のメディアに書き込んだりする装置。CD-ROM/DVD-ROM/Blu-ray Diskなどのメディアがある |
    | テープドライブ | カセット型カートリッジの磁気テープに記録する装置。サーバのバックアップに使われる。低価格で大容量 |
    | 電源 | マザーボードやパーツに電源供給する。パーツの組み合わせによって電力消費量が異なるので、適切な容量の電源を選ぶ必要がある |
    | USP | 無停電電源装置。停電するとコンピュータに信号を送り、安全にシャットダウンするまで、バッテリーから電力を供給する |
- **デバイスドライバ**は、OSがデバイスを認識し、適切に動作させるためのプログラム
  - デバイスドライバは、デバイスに付属されたCD-ROMからインストールしたり、インターネット上からダウンロードしたりしてOSに組み込まれる
  - Linuxの場合、デバイスドライバはカーネルのパーツとして提供される
    - カーネルはそれらのパーツを、必要に応じて組み込んだり取り外したりできる
    - このようなパーツは、**カーネルモジュール**と呼ばれる
  - デバイスドライバがカーネルに組み込まれていれば、対応するデバイスを利用することができる

### 3-2 ファイルシステムとは?
 - デバイスの入出力を扱う特殊な**デバイスファイル**がある
   - デバイスファイルとは、コンピュータに接続した周辺機器などをファイルシステム上のファイルのように扱う
   - ファイルの読み書きと同じ手順でデータの入出力を制御できるようにしたもの
   - デバイスファイルは「**/dev**」ディレクトリ以下に配置される
     - /devディレクトリ以下に数多くのファイルがあることがわかる。
     - Linuxカーネルがハードウェアを検知すると、**udev**という仕組みによって自動的に作成される
     - 管理者がデバイスファイルを作成する必要はない
     ```
     # /dev以下のファイルやディレクトリを一覧表示
     $ ls /dev
     autofs           fuse   loop1         nvram  ram15   sdb  stderr  tty16  tty27  tty38  tty49  tty6   urandom    zero
     block            hvc0   loop2         ppp    ram2    sdc  stdin   tty17  tty28  tty39  tty5   tty60  vcs
     bsg              hvc1   loop3         ptmx   ram3    sdd  stdout  tty18  tty29  tty4   tty50  tty61  vcs1
     (以下省略)
     ```
   - 主なデバイスファイル
     | デバイスファイル | 説明 |
     | ---- | ---- |
     | /dev/sda | 1番目のハードディスク |
     | /dev/sda1 | 1番目のハードディスクの1番目の基本パーティション |
     | /dev/sda2 | 1番目のハードディスクの2番目の基本パーティション |
     | /dev/sda3 | 1番目のハードディスクの3番目の基本パーティション |
     | /dev/sda4 | 1番目のハードディスクの4番目の基本パーティション |
     | /dev/sda5 | 1番目のハードディスクの1番目の論理パーティション |
     | /dev/sda6 | 1番目のハードディスクの2番目の論理パーティション |
     | (以下省略) |  |
     | /dev/sdb | 2番目のハードディスク |
     | /dev/sdc | 3番目のハードディスク |
     | /dev/sr0 | 1番目のCD/DVD/BDドライブ |
     | /dev/st0 | 1番目のテープドライブ |
   - パーティションの作成
     - 1台のハードディスクは複数の領域(パーティション)に分割して利用することができる
     - パーティションは基本的に4つにわけることができる
       - **基本パーティション(物理パーティション)**
         - ハードディスクのデバイスファイル名が/dev/sdaであれば、基本パーティションは「**/dev/sda1 ~ /dev/sda4**」になる
     - 最大4つのパーティションのうち、1つだけは**拡張パーティション**に変更できる
       - 拡張パーティションとは、その中にさらに複数の論理的なパーティションを作成して利用できるパーティションである
       - ハードディスク/dev/sdaの場合、論理パーティションは「**/dev/sda5**」以降になる
     - パーティションを分割するメリット
       - システムに障害が発生したとき、ファイルシステムの一部が壊れてしまうことがあるが、パーティションを分割していれば、被害を1つのパーティション内だけにとどめることができる
       - 大量のファイルが書き込まれた場合、パーティションに分割していなければ、システムの運用自体に悪影響が出る可能性がある
       - バックアップもパーティション単位で行うことが多いので、パーティションに分けていれば運用しやすくなる
     - パーティションはLinuxのインストール時に作成することが可能だが、インストール後も**fdisk**コマンドを使って操作することが可能。
       - ただし、既存のパーティションを変更すると、システムが影響を受けてしまうので注意が必要!!
       ```
       # パーティションの操作コマンド書式
       # fdiskコマンドはroot(管理者)ユーザーだけが実行可能
       fdisk デバイスファイル名

       # /dev/sdb内にパーティションを作成
       $ fdisk /dev/sdb

       Welcome to fdisk (util-linux 2.23.2).

       Changes will remain in memory only, until you decide to write them.
       Be careful before using the write command.

       Command (m for help): n
       Partition type:
         p   primary (0 primary, 0 extended, 4 free)
         e   extended
       Select (default p): p
       Partition number (1-4, default 1): 1
       First sector (2048-16777215, default 2048):
       Using default value 2048
       Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215): +1G
       Partition 1 of type Linux and of size 1 GiB is set

       Command (m for help): p

       Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
       Units = sectors of 1 * 512 = 512 bytes
       Sector size (logical/physical): 512 bytes / 512 bytes
       I/O size (minimum/optimal): 512 bytes / 512 bytes
       Disk label type: dos
       Disk identifier: 0xe5675bb6

         Device Boot      Start         End      Blocks   Id  System
        /dev/sdb1            2048     2099199     1048576   83  Linux

       Command (m for help): w
       The partition table has been altered!

       Calling ioctl() to re-read partition table.
       Syncing disks.
       ```
     - 参考URL
       - https://ameblo.jp/bakery-diary/entry-12639340661.html
       - https://qiita.com/kakkie/items/8f960f2dc5eb6e591d9d
 - ディスク上のデータを管理する仕組みが**ファイルシステム**である
   - ファイルシステムとは、ハードディスクなど外部記憶装置のデータをファイルとして管理する仕組み
   - ハードディスクを利用するには、ディスク上にパーディションを作成し、パーティション内にファイルシステムを作成する
 - ファイルシステムを作成するには**mkfs**コマンドを使う
   - パーティションを作成しただけでは、まだその中にファイルを保存することができない
   - ファイルやディレクトリでデータを管理できるようにするには、パーティションの中にファイルシステムを作成する必要がある
   - ファイルシステムの種類はOSによって異なり、Linuxでは**ext4**をはじめとする数十種類のファイルシステムを扱うことが可能
   - ルートファイルシステム(/ディレクトリが格納されているファイルシステム)として、**ext3**や**ext4**をデフォルトで採用しているディストリビューションが多い
   - 主なファイルシステムの種類
     | ファイルシステム | 説明 |
     | ---- | ---- |
     | ext2 | 一昔前のLinux標準ファイルシステム |
     | ext3 | ext2を改良し機能強化したファイルシステム |
     | ext4 | ext3を改良したファイルシステムで、現在多くのディストリビューションで標準ファイルシステムとなっている |
     | XFS | 高速かつ堅牢なファイルシステム |
     | Btrfs | Linux向けに開発されている、高速かつ多機能なファイルシステム |
     | NTFS | Windowsのファイルシステム |
     | FAT | デジカメなどでよく使われているファイルシステム |
     | ISO9660 | CD-ROMで使われているファイルシステム |
     | UDF | DVDで使われているファイルシステム |
   - ファイルシステムを作成する際には**mkfs**(MaKe FileSystem)コマンドを使い、mkfsコマンドはroot(管理者)ユーザーだけが実行できる
     ```
     # ファイルシステムを作成する際のコマンド書式
     mkfs [-t ファイルシステム] デバイスファイル名

     # ext4ファイルシステムの作成
     # 次の例では、/dev/sda3にext4ファイルシステムを作成
     $ mkfs -t ext4 /dev/sda3

     mke2fs 1.42.9 (28-Dec-2013)
     /dev/sda3 is mounted; will not make a filesystem here!

     ```
     - 主なオプション
       | オプション | 説明 |
       | ---- | ---- |
       | -t | ファイルシステムのタイプを指定。指定しなかった場合(デフォルト)は、ext2が用いられる |
       | -c | ファイルシステムを作成する前に、デバイスに対して不良ブロックの検査を行う |
 - Linuxの標準的なファイルシステムは**ext4**である

### 3-3 マウントとアンマウント
- ディレクトリツリーに他のファイルシステムを接続することを**マウント**という
  - Windowsでは、ハードディスクはCドライブとDドライブ、DVDドライブはEドライブUSBメモリを接続するとFドライブというように、デバイスごとにドライブ管理されている
  - Linuxにはドライブという概念はなく、Linuxでは、DVDドライブも外付けハードディスクもUSBメモリも、すべて「/ディレクトリ」以下のディレクトリツリーに接ぎ木してい管理している。これを**マウント**という
  - **マウントポイント**
    - デバイスを接続するディレクトリのことである。マウントポイント任意のディレクトリで問題ない
    ```
    # マウントの実行
    mount デバイスファイル マウントポイント

    # DVD-ROMをマウント
    # DVD-ROMをマウントする前に、VirtualBoxの仮想環境(CentOS)に光学ドライブのディスクイメージ(ファイル)を追加しておくこと
    $ su -
    Password:
    $ ls /media/dvdrom/

    $ mount /dev/sr0 /media/dvdrom/
    mount: /dev/sr0 is write-protected, mounting read-only

    # ls /media/dvdrom
    CentOS7vm.vbox  CentOS7vm.vbox-prev  CentOS7vm.vdi  Logs  Snapshots  sdb.vdi
    ```
    - 最近のディストリビューションの多くでは、CDやDVD-ROMを挿入すると自動的にマウントが実行される
    - その場合は、CDやDVD-ROMのタイトル(ボリューム名)がマウントポイントに使われる
  - /etc/fstabファイル
    - 「/etc/fstab」ファイルには、マウント情報が設定されている
    - CD/DVD-ROMなど、頻繁に利用することが予想されるデバイスについては、「/etc/fstab」ファイルに設定を記載することによって、デバイスファイルを名かマウントポイントを指定するだけでマウントが可能
    - 最近のディストリビューションでは、/etc/fstabはシステムによって自動的に処理される。そのため、手動での書き換えは好ましくない場合がある
    ```
    # /etc/fstabファイルの例
    $ cat /etc/fstab

    #
    # /etc/fstab
    # Created by anaconda on Fri Apr 26 19:22:27 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=37abee08-086b-46bf-a636-b4b6f26d7380 /                       xfs     defaults        0 0
    UUID=ee1298ef-5f4f-4199-aae1-9a8d241ec4d8 /boot                   ext4    defaults        1 2
    UUID=710ad3cb-59d3-48d9-a17e-f0adce4c3594 swap                    swap    defaults        0 0
    /dev/sr0                                  /media/dvdrom           udf,iso9660 ro          0 0

    # デバイスファイル名だけでマウント
    $ mount /dev/sr0

    # マウントポイントだけでマウント
    $ mount /media/dvdrom
    ```
- 外部メディアはマウントすることで利用できるようになる
- マウントを解除することを**アンマウント**という
  ```
  # アンマウントの実行
  umount デバイスファイル or マウントポイント

  # ディスクの空き領域を確認する
  # dfコマンドを利用することで、どのファイルシステムがマウントされているのかを確認することができる
  $ df
  Filesystem     1K-blocks    Used Available Use% Mounted on
  /dev/sda2       31236200 1534384  29701816   5% /
  devtmpfs          496672       0    496672   0% /dev
  tmpfs             507484       0    507484   0% /dev/shm
  tmpfs             507484    6920    500564   2% /run
  tmpfs             507484       0    507484   0% /sys/fs/cgroup
  /dev/sda1         194235  155473     24426  87% /boot
  tmpfs             101500       0    101500   0% /run/user/1000
  /dev/sr0         2229234 2229234         0 100% /media/dvdrom
  tmpfs             101500       0    101500   0% /run/user/0

  # DVD-ROMをアンマウント
  $ umount /dev/sr0

  # ディスクの空き領域を再確認
  # /dev/sr0がアンマウントされていることを確認
  $ df
  Filesystem     1K-blocks    Used Available Use% Mounted on
  /dev/sda2       31236200 1534392  29701808   5% /
  devtmpfs          496672       0    496672   0% /dev
  tmpfs             507484       0    507484   0% /dev/shm
  tmpfs             507484    6920    500564   2% /run
  tmpfs             507484       0    507484   0% /sys/fs/cgroup
  /dev/sda1         194235  155473     24426  87% /boot
  tmpfs             101500       0    101500   0% /run/user/1000
  tmpfs             101500       0    101500   0% /run/user/0

  # 実際に/media/dvdromがアンマウントされていることを確認する
  # /media/dvdromを確認することで何も表示されていないことが確認でき、DVD-ROMがアンマウントされていることが確認できる
  $ ls /media/dvdrom
  ```

### 3-4 ディレクトリの配置と役割
- ディレクトリやファイルの配置はFHSで規定されている
  - ファイルシステム内のレイアウト、つまり/ディレクトリ以下にどのようなディレクトリやファイルを配置するかについては、**FHS**(ファイルシステム階層標準:Filesystem Hierarchy Standard)として標準化が進められている
- 多くのディストリビューションがFHSに準拠しているが、ディストリビューションごとに異なる配置もある
  - 主要なディストリビューションはFHSに準拠しているが、一部のファイルやディレクトリにディストリビューション固有のものが見られる
  - ここでは、FHSで規定されている重要なディレクトリの配置を紹介する
    | オプション | 説明 |
    | ---- | ---- |
    | /bin | 一般ユーザーでも利用可能な、システム管理に必須のコマンドを格納 |
    | /boot | Linuxの起動に必要なファイルやLinuxカーネルを格納 |
    | /dev | デバイスファイルを格納 |
    | /etc | システムの設定ファイルや、サービスの起動スクリプトファイルなどを格納 |
    | /home | ユーザーごとのホームディレクトリを格納 |
    | /lib | 共有ライブラリファイル、カーネルモジュール(デバイスドライバなど)を格納 |
    | /mnt | マウントポイントとなるディレクトリを格納 |
    | /opt | ソフトウェアのインストール先(実際にはあまり利用されない) |
    | /proc | カーネル情報にアクセスするための仮想ファイルシステム |
    | /root | rootユーザーのホームディレクトリ |
    | /sbin | システム管理に必須のコマンドを格納。rootユーザーのみ利用可能 |
    | /tmp | 一時ファイルを格納 |
    | /usr | プログラムやソフトウェア、ライブラリなどを格納 |
    | &nbsp;&nbsp; /usr/bin | 一般ユーザーコマンド(緊急時のシステム管理に必須でない)を格納 |
    | &nbsp;&nbsp; /usr/sbin | 管理者コマンド(緊急時のシステム管理に必須でない)を格納 |
    | &nbsp;&nbsp; /usr/lib | 共有ライブラリを格納 |
    | &nbsp;&nbsp; /usr/local | システムごとにインストールしたプログラムやドキュメントを格納 |
    | &nbsp;&nbsp; /usr/share | システムアーキテクチャに依存しないファイルやドキュメントを格納 |
    | &nbsp;&nbsp; /usr/src | プログラムのソースコードを格納 |
    | /var | 頻繁に書き換えが発生するファイルを格納 |
    | &nbsp;&nbsp; /var/cache | 一時的なキャッシュファイルを格納 |
    | &nbsp;&nbsp; /var/log | ログファイルを格納 |