tag:crieit.net,2005:https://crieit.net/tags/Linux/feed 「Linux」の記事 - Crieit Crieitでタグ「Linux」に投稿された最近の記事 2024-02-27T00:48:40+09:00 https://crieit.net/tags/Linux/feed tag:crieit.net,2005:PublicArticle/18777 2024-02-27T00:46:48+09:00 2024-02-27T00:48:40+09:00 https://crieit.net/posts/Raspberry-Pi-5-Ubuntu-24-04-LTS-SSH Raspberry Pi 5 に Ubuntu 24.04 LTS を入れて SSH するまで <p>ついに日本でも、 Raspberry Pi 5 の技適対応モデルが発売された。</p> <p>Raspberry Pi にインストールする OS と言えば、まずは <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.com/software/">Raspberry Pi OS (旧 Raspbian)</a> だが、同じ Debian ベースの <a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/download/raspberry-pi">Ubuntu</a> も Raspberry Pi 向けの公式イメージを出している。</p> <p>但し、 Raspberry Pi 5 に対応しているのは、 Ubuntu 23.10 (コードネーム: mantic) 以降のみとなる。</p> <p>現在リリース済みの 23.10 は「非LTS」バージョンとなり、サポートが 9ヶ月 (2024年6月まで) と短い。<br /> 常用するなら、サポートが 5年 (ESM なら 10年) と長い LTS バージョンが望ましいが、残念ながら 22.04 LTS Raspberry Pi 5 に非対応だ。</p> <p>LTS バージョンの次回リリースは 24.04 LTS (コードネーム: noble / 2024年4月リリース予定) で、現在絶賛開発中だ。</p> <p>そんな開発中の 24.04 LTS も、デイリースナップショットが手に入る。<br /> そいつを使って<strong>ディスプレイやキーボードが無い状態</strong>で、インストールから SSH 接続までやってみよう。</p> <p>Raspberry Pi 5 をターゲットに書いているが、 Raspberry Pi 3, 4, Raspberry Pi Zero 2 W でも同じ手順でできるはずだ。</p> <p>なお、この記事は 24.04 LTS がリリースされたら、それに併せて内容に書き換えていくつもり。</p> <h2 id="TL;DR"><a href="#TL%3BDR">TL;DR</a></h2> <ul> <li>microSD カードに Ubuntu の OS イメージを焼いたあと、 RasPi に挿す<strong>前</strong>に初回起動時の設定を書き換える</li> <li>cloud-init の挙動を理解しよう</li> <li>ディスプレイなし & 無線LAN Only だと少し工夫がいる</li> <li>今回の記事の内容は、<a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/?p=1404">Raspberry Pi に Ubuntu を入れて SSH でログインするまでの A to B | Aqua Ware つぶやきブログ</a> の二番煎じ <ul> <li>Ubuntu 24.04 LTS に合わせて内容はアップデートされている</li> </ul></li> </ul> <h2 id="準備するもの"><a href="#%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE">準備するもの</a></h2> <ul> <li>Raspberry Pi 5 <ul> <li>Raspberry Pi 3, 4 でも同じ手順でいけるはず</li> </ul></li> <li>4GB 以上の micorSD カード <ul> <li>IOPS が高い、「アプリケーションパフォーマンスクラス」が A2 のものが良いだろう。値段や速度を考えると、実用上は 64GB 以上になるだろうか。</li> <li>私は、<a target="_blank" rel="nofollow noopener" href="https://amzn.to/42J1AeI">ARCANITE 64GB microSDXCカード 【A2】、UHS-I U3、V30、4K、C10</a> 値段の割にパフォーマンスが良かったため、これを使った。</li> <li>後述するが、最終的には NVMe SSD にした方が断然良い</li> </ul></li> <li>microSD を書き込める PC (Win, Linux, mac)</li> <li>インターネットに繋がる Wi-Fi または イーサネットケーブル</li> </ul> <p>以下もあると便利だが、今回の手順では無くても問題ない。</p> <ul> <li>micro-HDMI で繋がるディスプレイ 又は 変換コネクタ</li> <li>RasPi に繋げる USB キーボード</li> </ul> <h2 id="イメージファイルの取得"><a href="#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%8F%96%E5%BE%97">イメージファイルの取得</a></h2> <p>正式リリース前の Raspberry Pi 向けデイリースナップショットイメージは、以下のいずれかから手に入る。</p> <p>今回は、サーバーOS的に SSH して使う事が目的なので、<strong>後者のサーバー版</strong>を利用する。</p> <ul> <li>Raspberry Pi 向けデスクトップ版イメージ <ul> <li><a target="_blank" rel="nofollow noopener" href="https://cdimage.ubuntu.com/daily-preinstalled/current/">https://cdimage.ubuntu.com/daily-preinstalled/current/</a></li> </ul></li> <li>Raspberry Pi や、汎用 64-bit ARM, RISC-V 向けサーバー版イメージ <ul> <li><a target="_blank" rel="nofollow noopener" href="https://cdimage.ubuntu.com/ubuntu-server/daily-preinstalled/current/">https://cdimage.ubuntu.com/ubuntu-server/daily-preinstalled/current/</a></li> </ul></li> </ul> <p>リンク先から、 <code>noble-preinstalled-server-arm64+raspi.img.xz</code> を選択してダウンロードしよう。</p> <p>24.04 LTS が正式リリースされれば、 <a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/download/raspberry-pi">Install Ubuntu on a Raspberry Pi | Ubuntu</a> のページからダウンロードできるようになるはずだ。</p> <h2 id="ブータブル SD の焼き込み"><a href="#%E3%83%96%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB+SD+%E3%81%AE%E7%84%BC%E3%81%8D%E8%BE%BC%E3%81%BF">ブータブル SD の焼き込み</a></h2> <p>ダウンロードしたイメージファイルを、ブート可能な状態で microSD に書き込む。<br /> ダウンロードしたファイルをただ SD カードに保存するのではなく、専用のツールで書き込む必要があるぞ。</p> <p>方法は色々あるのだが、今回は個人的にオススメな <a target="_blank" rel="nofollow noopener" href="https://www.balena.io/etcher/">balenaEtcher</a> を使った方法で紹介しよう。</p> <ol> <li>microSD を SDカードスロットに挿す</li> <li>balenaEtcher を DL & 起動する。 <ul> <li>DLする balenaEtcher は Portable 版で良い</li> </ul></li> <li>前項でダウンロードするした <code>***.img.xz</code> を選択して、書き込みを開始する <ul> <li><code>***.img.xz</code> は、 <code>***.img</code> ファイルを <code>.xz</code> 形式で圧縮したものなのだが、手動で解凍せず直接 balenaEtcher で選択してしまって問題ない。 balenaEtcher は書き込み時にオンザフライで解凍する。</li> </ul></li> </ol> <p>なお、リリース済みの Ubuntu (や Raspberry Pi OS など) であれば、一般的に <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.com/software/">Raspberry Pi Imager</a> というツールを使った方法がオススメされるのだが、DLが遅いからか、全体的に時間がかかるので私はあまりオススメしない。</p> <h2 id="system-boot パーティション内の cloud-init 等の設定を書き換える"><a href="#system-boot+%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E5%86%85%E3%81%AE+cloud-init+%E7%AD%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">system-boot パーティション内の cloud-init 等の設定を書き換える</a></h2> <p>作成した micorSD を早速 RasPi に挿す <strong>…前に</strong> 、 初回セットアップ設定を書き換える。</p> <p>一度書き込んだ microSD を再び PC に挿し直すと、 <code>"system-boot"</code> という 500MB 位の FAT32 パーティションが開けるはずだ。</p> <p>ここには、 cloud-init という仕組みで初回起動時の設定を定義するファイルがいくつか含まれている。<br /> これらを書き換えていく。</p> <p>書き換え後のファイルは <a target="_blank" rel="nofollow noopener" href="https://gist.github.com/advanceboy/c9b020fe09ababd390c0e95d74dfde7e">こちらの Gist</a> に置いてあるので、結果だけ欲しい人はここから DL をば。</p> <h3 id="cloud-init の network-config"><a href="#cloud-init+%E3%81%AE+network-config">cloud-init の network-config</a></h3> <p>以下のように書き換える。<br /> (元のファイルからの差分を <code>diff</code> のフォーマットで表示している。 以降同様。)</p> <pre><code class="diff">--- network-config.org +++ network-config @@ -22,23 +22,11 @@ ethernets: eth0: dhcp4: true optional: true -# wifis: -# wlan0: -# dhcp4: true -# optional: true -# access-points: -# myhomewifi: -# password: "S3kr1t" -# myworkwifi: -# password: "correct battery horse staple" -# workssid: -# auth: -# key-management: eap -# method: peap -# identity: "[email protected]" -# password: "passw0rd" -# ca-certificate: /etc/my_ca.pem - -# regulatory-domain: GB + wifis: + wlan0: + dhcp4: true + access-points: + "SSID-of-myhomewifi": + password: "password-of-myhomewifi" </code></pre> <p>Ubuntu では Netplan を使ってネットワークが管理されるため、 Netplan の形式で記述する。</p> <p>規定値では IPv4 の有線イーサネットのみ、 DHCP 自動取得で接続されるようになっている。<br /> 必要に応じて、上述のように Wi-Fi で接続する SSID 等の情報を追記したり、逆に有線LANを使わないなら <code>ethernet:</code> プロパティごと削除してしまってもよいだろう。</p> <p>SSID やパスワードは、各自の環境のものに置き換えて書き換えてほしい。</p> <p>コメントアウトされている wifi の記述例では、 <code>wifis.wlan0.optional</code> を <code>true</code> に設定しているが、もし Wi-Fi 単独でネットワークに接続するつもりならこの設定は行わないようにしよう。<br /> さもないと、OS起動の度に2分も余計に時間かかる羽目になる。<br /> これは、 <code>systemd-networkd-wait-online.service</code> デーモンが、(optional true を指定していない) 有効なネットワークの接続をタイムアウトするまで待機してしまうためだ。</p> <p>network-config 自体のリファレンスはこちら。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/23.4.1/reference/network-config.html">https://cloudinit.readthedocs.io/en/23.4.1/reference/network-config.html</a></p> <h3 id="cloud-init の user-data"><a href="#cloud-init+%E3%81%AE+user-data">cloud-init の user-data</a></h3> <p>こちらは書き換え箇所が多いので、何箇所かに分けて説明していく。</p> <p>まず最初はユーザー名まわり。</p> <pre><code class="diff">--- user-data.org +++ user-data @@ -17,13 +17,17 @@ # Some additional examples are provided in comments below the default # configuration. +# Override the `default_user` configuration from `/etc/cloud/cloud.cfg`. The `user` dictionary keys supported for the default_user are the same as the `users` schema. +user: + name: newusername + # On first boot, set the (default) ubuntu user's password to "ubuntu" and # expire user passwords chpasswd: expire: true users: - - name: ubuntu - password: ubuntu + - name: newusername + password: newpassword type: text ## Set the system's hostname. Please note that, unless you have a local DNS </code></pre> <p>規定では、 cloud-init パッケージの <code>/etc/cloud/cloud.cfg</code> ファイルの定義によって、 "ubuntu" というユーザーが作成される。</p> <p>しかし、 既知のユーザー名をそのまま使うのはセキュリティ的にも若干不安があるし、 作成後のユーザー名を書き換えるのは若干面倒なので、作成されるデフォルトのユーザー名自体を、他の名前 (上記例だと "newusername") に書き換えてしまおう。</p> <p>また、 <code>chpasswd</code> による、初回アクセス時のパスワード変更対象とするユーザー名も、併せて変更しておく。</p> <p>--</p> <p>次にホスト名とキーボード周りの設定。</p> <pre><code class="diff">@@ -31,14 +35,14 @@ ## setting the hostname here will not make the machine reachable by this name. ## You may also wish to install avahi-daemon (see the "packages:" key below) ## to make your machine reachable by the .local domain -#hostname: ubuntu +hostname: ubuntu-raspi5 ## Set up the keyboard layout. See localectl(1), in particular the various ## list-x11-* sub-commands, to determine the available models, layouts, ## variants, and options -#keyboard: -# model: pc105 -# layout: gb +keyboard: + model: pc105 + layout: jp # variant: # options: ctrl:nocaps </code></pre> <p>ここはまぁ、見た通りなので追加での説明はいらないかな。</p> <p>--</p> <p>お次は SSH まわり。</p> <pre><code class="diff">@@ -53,6 +57,8 @@ #ssh_import_id: #- lp:my_launchpad_username #- gh:my_github_username +ssh_authorized_keys: +- ssh-rsa AAAA<中略>== rsa-key-of-user1 ## Add users and groups to the system, and import keys with the ssh-import-id ## utility </code></pre> <p><code>ssh_authorized_keys</code> に直接指定するか、<code>ssh_import_id:</code> のところで自分の GitHub のユーザー名を指定してインポートすることにより、 デフォルトのユーザー (上記例だと "newusername") に登録する公開鍵を指定する。</p> <p>SSH に登録するパスワードログインは規定で禁止されているので、この設定をしておかないと SSH による遠隔からのアクセスができない。</p> <p>--</p> <p>タイムゾーンや起動後の処理まわり。</p> <pre><code class="diff">@@ -82,8 +88,13 @@ #- python3-gpiozero #- [python3-serial, 3.5-1] +# locale and timezone +timezone: Asia/Tokyo + ## Write arbitrary files to the file-system (including binaries!) -#write_files: +write_files: +- path: /etc/cloud/cloud-init.disabled + defer: true #- path: /etc/default/console-setup # content: | # # Consult the console-setup(5) manual page. </code></pre> <p>とりあえずタイムゾーンは日本標準時にしておこう。</p> <p>次に、 <code>write_files:</code> のほうだが、これは次回以降のブート時に cloud-init が余計に起動しないようにするための設定だ。</p> <p>cloud-init の設定の大半は、 初回ブート時にただ一度だけ実行されるのだが、 cloud-init サービス自体は基本的に毎回常に起動して、サービスとして常駐しっぱなしになっている。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/topics/modules.html">Modules</a> で、 <code>Module frequency: per always</code> となっているモジュールの実行などは、ブートする度に毎回実行される。<br /> そうすると、場合によっては cloud-init の実行ログがログイン画面を覆ってしまうことが毎回の起動ごとに発生して鬱陶しい。<br /> このため、 <code>/etc/cloud/cloud-init.disabled</code> という <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/howto/disable_cloud_init.html#method-1-text-file">空ファイルを作成しておく</a> ことで、 次回以降の起動時に cloud-init を無効にしている。</p> <p><code>defer: true</code> が指定されている部分についてだが、これは cloud-init の初期化処理が大きく分けて Network (<code>cloud_init_modules</code>), Config (<code>cloud_config_modules</code>), Final (<code>cloud_final_modules</code>) という <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/explanation/boot.html">3ステージ に分かれて</a> いることに関係する。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/reference/modules.html#write-files"><code>write_files:</code> モジュール</a> は Ubuntu の既定だと Network ステージに実行されてしまい、このタイミングで <code>cloud-init.disabled</code> ファイルが作成されてしまうと、 Config や Final ステージの処理が実行されなくなってしまう。<br /> このため、 <code>defer</code> オプションを true にして Final ステージで <code>cloud-init.disabled</code> ファイルが作成されるよう調整しているのだ。</p> <p>なお、どのモジュールがどのステージで実行されるかは、 <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/reference/base_config_reference.html#example"><code>/etc/cloud/cloud.cfg</code></a> で定義されている。<br /> (各ディストリビューション毎の <a target="_blank" rel="nofollow noopener" href="https://git.launchpad.net/ubuntu/+source/cloud-init/tree/config/cloud.cfg.tmpl?h=ubuntu/noble"><code>cloud.cfg</code> のテンプレートソースはこちら</a>)</p> <hr /> <p>最後に、コマンドの実行。<br /> 以下の <code>192.168.0.2</code> の部分は、 ssh で RasPi に接続するゲスト PC の IPアドレス に書き換えてくれ。</p> <pre><code class="diff">@@ -106,7 +117,9 @@ # permissions: '0644' ## Run arbitrary commands at rc.local like time -#runcmd: +runcmd: +# after wlan0 is connected, write the arp entry to target machine on background job +- [ sh, -c, 'sleep 2; ping -c 4 192.168.0.2' ] #- [ ls, -l, / ] #- [ sh, -xc, "echo $(date) ': hello world!'" ] #- [ wget, "http://ubuntu.com", -O, /run/mydir/index.html ] </code></pre> <p>このコマンドは、仮に ssh ゲストの IP アドレスが <code>192.168.0.2</code> であると仮定して、そこへ向かって Ping を打っている。<br /> なぜなら、 ゲストPC から RaspPi の IP アドレスを ARP コマンドで確実に調べられるようにするためだ。</p> <p>RasPi に繋げるディスプレイがないことを前提とすると、 SSH するために DHCP によって RasPi に割り当てられた IP アドレスをどうやって調べるのか、と言う問題に直面する。</p> <p>RasPi の MAC アドレスの先頭 24bit は、 Raspberry 財団の所持する OUI から割り当てられるはずなので、以下のいずれかになるはずだ。</p> <pre><code>28:CD:C1 2C:CF:67 B8:27:EB D8:3A:DD DC:A6:32 E4:5F:01 </code></pre> <p>通常、 RasPi がオンラインになったときに、 ARPリクエストがブロードキャストされるため、 同一ネットワーク内の PC の ARP テーブルに RasPi のレコードが追加され、 以下のような arp コマンドで対象の IP アドレスを調べることができるようになる。。。 <strong>多くの場合は。</strong></p> <pre><code class="powershell">while(1) { arp -a | ?{ $_ -match '\s(28-cd-c1|2c-cf-67|b8-27-eb|d8-3a-dd|dc-a6-32|e4-5f-01)' }; Start-Sleep -Seconds 1} </code></pre> <p>ところが、 RasPi が Wi-Fi で繋いでいる先が (単なるアクセスポイントではなく) ルーターだったりすると、 RasPi が 同じサブネット内に ARPリクエスト をブロードキャストしたのにも関わらず、 ルーターが無駄に気を利かせて ARPリクエスト を代替して投げてしまい、 同じサブネットの別の端末の ARP テーブルには、 RasPi の MAC アドレスのレコードが記録されないことがある。</p> <p>そこで、 RasPi 側から SSH のアクセス元となる PC を指定して ping を投げることで、 その PC の ARP テーブルに確実に RasPi が載るようにしている。</p> <p>--</p> <p>ここまで書き換えたら、 SD カードを取り外して RasPi に挿し、いよいよ起動する。</p> <h3 id="cloud-init 周りの補足"><a href="#cloud-init+%E5%91%A8%E3%82%8A%E3%81%AE%E8%A3%9C%E8%B6%B3">cloud-init 周りの補足</a></h3> <p>system-boot パーティション内の中身について、もう少し細かい仕組み周りを深堀りして補足したい。<br /> 興味が無ければ、読み飛ばしてしまって次の章に進んでもらって問題ない。</p> <p>system-boot パーティション直下にある <code>README</code> というファイルを開くと、このパーティションに存在するファイルの概要が簡単に書いてある。</p> <pre><code class="text:README">================== The Boot Partition ================== This file belongs to the boot partition of the Ubuntu Server for Raspberry Pi. ... </code></pre> <p>このパーティションには、Raspberry Pi に於ける BIOS の代替となる <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.com/documentation/computers/config_txt.html">config.txt</a> といった H/W 設定用のファイルや、 cloud-init の構成ファイルなどが含まれていることがわかる。</p> <p>このうち、<strong>cloud-init</strong> は Infrastructure as Code (IaC) の一種だ。<br /> その名の通り、 AWS などのクラウド上の仮想マシンの初期設定を念頭においた仕組みだが、それに留まらず、一般的な Linux インスタンスの初期設定に活用される。<br /> 設定内容は、YAML形式の設定ファイルを使用して記述し、クラウドやディストリビューションの違いをある程度吸収して初期設定を行うことができる。<br /> Ubuntu の OS のイメージ内には、事前に cloud-init のサービス(デーモン)が組み込まれており、OS の起動時に何らかの方法で指定された設定ファイルを読み取って、初回設定処理が実行される仕組みとなっている。</p> <p>Raspberry Pi 用の Ubuntu Server イメージでは、この cloud-init 用の設定ファイルが上記の <code>system-boot</code> パーティションから取得される。<br /> イメージ内のデフォルト値の定義と、<code>system-boot</code> パーティション内のユーザー定義が組み合わされ、初期設定が進められるワケだ。</p> <p>たとえば、今回 microSD に書き込んだイメージをそのまま書き換えずに Ubuntu を起動すると、ユーザー認証が以下のように構成される。</p> <ol> <li><code>ubuntu</code> というユーザーID</li> <li><code>ubuntu</code> というパスワード</li> <li>初回起動時にパスワードの変更を求める</li> <li>SSH サーバーの起動</li> </ol> <p>このうち、 (1), (4) は、OSに組み込まれた <code>/etc/cloud/cloud.cfg</code> の定義によるもの。<br /> そして、 (2), (3) は <code>system-boot</code> パーティション内の <code>user-data</code> ファイル内の以下の部分の定義によるモノだ。</p> <pre><code class="yaml:user-data">#cloud-config chpasswd: expire: true users: - name: ubuntu password: ubuntu type: text </code></pre> <p>このデフォルトの構成だと流石にセキュリティ的にアレなので、書き換えを行っている… というのが、前項の設定の真相となる。</p> <h2 id="Raspberry Pi に割り当てられた IP アドレスを調べられるようにして起動"><a href="#Raspberry+Pi+%E3%81%AB%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%89%E3%82%8C%E3%81%9F+IP+%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%89%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%A6%E8%B5%B7%E5%8B%95">Raspberry Pi に割り当てられた IP アドレスを調べられるようにして起動</a></h2> <p>こんな感じでひととおりファイルを書き換えたら、いよいよ RasPi を起動する。</p> <p>…と、その前に、 ssh でつなぐ予定のゲスト端末で、管理者権限で以下のコマンドを実行し、端末内の「arp テーブル」をリセットする。</p> <pre><code class="powershell">arp -d * </code></pre> <p>その後、ようやくだが RasPi に microSD を挿して起動させよう。<br /> 初回ブート時の設定を適用しながら起動してくれる。</p> <p>ssh でつなぐ予定のゲスト端末の PowerShell で、以下のような arp コマンドのループを実行し、ゲストPC から RasPi の IPアドレスを調べよう。<br /> 初回起動され安定しただろうところ(SDカードの I/O 性能によるが 1~5分?)で、 RasPi の IP アドレスがヒットしてくるようになるはずだ。</p> <pre><code class="powershell">while(1) { arp -a | ?{ $_ -match '\s(28-cd-c1|2c-cf-67|b8-27-eb|d8-3a-dd|dc-a6-32|e4-5f-01)' }; Start-Sleep -Seconds 1} </code></pre> <p>公開鍵の登録が適切に行えれば、その IP アドレスに対し SSH できるはずだ。</p> <p>初回アクセス時は、以下のようなパスワード変更を求められる。</p> <pre><code>WARNING: Your password has expired. You must change your password now and login again! Changing password for newusername. </code></pre> <p>古いパスワード ("newpassword") と変更後のパスワードを改めて入れる。</p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>一般的な1列端子の microSD で最速な UHS-I SDR104 のバスインターフェースに Raspberry Pi 5 が対応したことや、最近の安価な microSD の I/O 速度もだいぶ向上したのも相まって、 RasPi 4B が登場した頃と比べると、体感できる I/O 性能が大きく向上している。<br /> おかげで、起動やパッケージのインストール、更新などが快適になった。</p> <p>だいぶ高価になってしまった価格的な面からも、 Raspberry Pi の 非Zero/Pico シリーズは「Linuxが動くマイコン」から「小型のLinuxマシン」という面がより強くなったと感じる。<br /> (それはどうなんだという気もするけど。)</p> <p>更に RasPi 5 では PCI Express (PCIe) にも対応しているため、 NVMe で繋いだ SSD からブートさせると、更に桁違いの高速化が臨める。</p> <p>近いうちに、そちらも試してみようと思う。</p> <p>…ただ、どうせ PCIe に対応するなら、microSD Express に対応してくれれば、 NVMe 用 HAT とか買い足さんで済むから良かったのにな~…と、思わんでもない。<br /> しかし、2019年にSD7.1の規格として登場してから4年も経った2024年現在その製品が売られているとこを見たことないので、まぁ無理な相談か。</p> advanceboy tag:crieit.net,2005:PublicArticle/18622 2023-10-20T20:06:09+09:00 2023-10-20T20:06:09+09:00 https://crieit.net/posts/EOF EOF制御文字を削除する <pre><code>#末尾にEOF制御文字があれば、1行削除する if tail -n 1 ${DATA} | grep -q "^¥Z$"; then sed -i "s/^¥Z$//g" ${DATA} fi </code></pre> speasmen88 tag:crieit.net,2005:PublicArticle/18285 2022-08-21T03:02:03+09:00 2023-02-28T06:38:46+09:00 https://crieit.net/posts/OCI-Linux OCIでディスク追加&Linuxのパーティション/LVM拡張 <h1 id="1.ディスク追加"><a href="#1.%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E8%BF%BD%E5%8A%A0">1.ディスク追加</a></h1> <h2 id="1.1. 新規ブロックボリュームを作成"><a href="#1.1.+%E6%96%B0%E8%A6%8F%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E6%88%90">1.1. 新規ブロックボリュームを作成</a></h2> <p>Webコンソールで、<br /> 「ストレージ」>「ブロックボリューム」<br /> から新規ディスク作成。<br /> <a href="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046300fa3e8f18f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046300fa3e8f18f.png?mw=700" alt="image.png" /></a></p> <h2 id="1.2. インスタンスにアタッチ"><a href="#1.2.+%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E3%82%A2%E3%82%BF%E3%83%83%E3%83%81">1.2. インスタンスにアタッチ</a></h2> <p>対象インスタンスに移動し、<br /> 「アタッチされたブロックボリューム」>「ブロックボリュームのアタッチ」<br /> アタッチメントタイプはiSCSIを選択。</p> <p><a href="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046300fd8f44d6e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046300fd8f44d6e.png?mw=700" alt="image.png" /></a></p> <h2 id="1.3. アタッチされたディスクをOSに認識させる"><a href="#1.3.+%E3%82%A2%E3%82%BF%E3%83%83%E3%83%81%E3%81%95%E3%82%8C%E3%81%9F%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%92OS%E3%81%AB%E8%AA%8D%E8%AD%98%E3%81%95%E3%81%9B%E3%82%8B">1.3. アタッチされたディスクをOSに認識させる</a></h2> <p>コンソール上で「アタッチ済」になっていてもOSではまだ認識していない。<br /> <a href="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046300fea2a6373.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046300fea2a6373.png?mw=700" alt="image.png" /></a></p> <pre><code class="shell-session">$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk tqsda1 8:1 0 100M 0 part /boot/efi tqsda2 8:2 0 1G 0 part /boot mqsda3 8:3 0 45.5G 0 part tqocivolume-root 252:0 0 35.5G 0 lvm / mqocivolume-oled 252:1 0 10G 0 lvm /var/oled </code></pre> <p>iSCSIコマンドを新規ディスクのアタッチ対象サーバで実行する。<br /> <a href="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046300fef18739f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046300fef18739f.png?mw=700" alt="image.png" /></a><br /> <a href="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046301004fe916c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b156334672193046301004fe916c.png?mw=700" alt="image.png" /></a></p> <p>記載されているコマンドを1行ずつ、実行結果を確認しながら実行していく。<br /> 3行実行後に見てみると認識されている。</p> <pre><code class="shell"># lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk tqsda1 8:1 0 100M 0 part /boot/efi tqsda2 8:2 0 1G 0 part /boot mqsda3 8:3 0 45.5G 0 part tqocivolume-root 252:0 0 35.5G 0 lvm / mqocivolume-oled 252:1 0 10G 0 lvm /var/oled sdb 8:16 0 50G 0 disk </code></pre> <p>MOUNTPOINTに何も記載されていないので、まだ新規追加されたディスクをOSは認識しているがマウントされていないので、このディスクに操作を行えない。</p> <h1 id="2. パーティショニング"><a href="#2.+%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0">2. パーティショニング</a></h1> <p>パーティションテーブルの表示</p> <pre><code class="shell"># parted /dev/sda print Model: ORACLE BlockVolume (scsi) Disk /dev/sda: 53.7GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 106MB 105MB fat16 EFI System Partition boot, esp 2 106MB 1180MB 1074MB xfs 3 1180MB 50.0GB 48.8GB lvm </code></pre> <h2 id="2.1 ①partedコマンドでパーティション作成"><a href="#2.1+%E2%91%A0parted%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E4%BD%9C%E6%88%90">2.1 ①partedコマンドでパーティション作成</a></h2> <p>partedコマンドを使用して新しいパーティション作成。<br /> fdiskコマンドは2TB以下の場合に利用。2TB以上の場合はpartedコマンド,gdiskコマンド。</p> <pre><code class="shell"># parted /dev/sdb GNU Parted 3.2 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel New disk label type? msdos (parted) mkpart Partition name? []? userdata File system type? [ext2]? xfs Start? 2048s End? 10GB (parted) quit Information: You may need to update /etc/fstab. </code></pre> <p>2個目のパーティションを作成</p> <pre><code class="shell"># parted /dev/sdc GNU Parted 3.2 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mkpart Partition type? primary/extended? primary File system type? [ext2]? xfs Start? 10GB End? 30GB (parted) q Information: You may need to update /etc/fstab. </code></pre> <p>ファイルシステムは以下が参考になる。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/sion_cojp/items/c8e015db39ddbf43012e">https://qiita.com/sion_cojp/items/c8e015db39ddbf43012e</a></p> <pre><code class="shell"># udevadm settle </code></pre> <p>状況把握</p> <pre><code class="shell"># parted /dev/sdc print Model: ORACLE BlockVolume (scsi) Disk /dev/sdc: 53.7GB Sector size (logical/physical): 512B/4096B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 10.0GB 9999MB primary 2 10.0GB 30.0GB 20.0GB primary </code></pre> <p>partedコマンドで作成したパーティションは以下の手順でファイルシステムを作成する。</p> <pre><code class="shell"># mkfs.xfs /dev/sdb1 meta-data=/dev/sdb1 isize=512 agcount=4, agsize=610304 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 data = bsize=4096 blocks=2441216, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 </code></pre> <p>もしファイルシステムがext4の場合は</p> <pre><code>mkfs.ext4 </code></pre> <p>状況把握</p> <pre><code class="shell"># parted /dev/sdc print Model: ORACLE BlockVolume (scsi) Disk /dev/sdc: 53.7GB Sector size (logical/physical): 512B/4096B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 10.0GB 9999MB primary xfs 2 10.0GB 30.0GB 20.0GB primary xfs 3 30.0GB 53.7GB 23.7GB extended </code></pre> <p>partedコマンドで状況把握</p> <pre><code class="shell"># parted /dev/sdc print Model: ORACLE BlockVolume (scsi) Disk /dev/sdc: 53.7GB Sector size (logical/physical): 512B/4096B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 10.0GB 9999MB primary 2 10.0GB 30.0GB 20.0GB primary 3 30.0GB 53.7GB 23.7GB extended </code></pre> <h2 id="2.2 ②fdiskコマンドでパーティション作成"><a href="#2.2+%E2%91%A1fdisk%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E4%BD%9C%E6%88%90">2.2 ②fdiskコマンドでパーティション作成</a></h2> <p>2個目のパーティション作成。<br /> fdiskコマンドは2TB以下の場合に利用。2TB以上の場合はgdiskコマンドやartedコマンド。</p> <pre><code class="shell"># fdisk /dev/sdc Welcome to fdisk (util-linux 2.32.1). 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 (container for logical partitions) Select (default p): Using default response p. Partition number (1-4, default 1): First sector (2048-104857599, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-104857599, default 104857599): 54857599 Created a new partition 1 of type 'Linux' and of size 26.2 GiB. Command (m for help): t Selected partition 1 Hex code (type L to list all codes): 8e Changed type of partition 'Linux' to 'Linux LVM'. Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): Using default response p. Partition number (2-4, default 2): First sector (54857600-104857599, default 54857728): Last sector, +sectors or +size{K,M,G,T,P} (54857728-104857599, default 104857599): Created a new partition 2 of type 'Linux' and of size 23.9 GiB. Command (m for help): t Partition number (1,2, default 2): Hex code (type L to list all codes): 8e Changed type of partition 'Linux' to 'Linux LVM'. Command (m for help): w    ←書き込み The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. </code></pre> <p>fdiskコマンドで状況把握</p> <pre><code class="shell"># fdisk -l /dev/sdc Disk /dev/sdb: 50 GiB, 53687091200 bytes, 104857600 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 1048576 bytes Disklabel type: dos Disk identifier: 0x538e2757 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 54857599 54855552 26.2G 8e Linux LVM /dev/sdb2 54857728 104857599 49999872 23.9G 8e Linux LVM </code></pre> <h2 id="2.3 LVM作成"><a href="#2.3+LVM%E4%BD%9C%E6%88%90">2.3 LVM作成</a></h2> <p>LVを作成していく。</p> <h3 id="2.3.1 Physical Volume作成"><a href="#2.3.1+Physical+Volume%E4%BD%9C%E6%88%90">2.3.1 Physical Volume作成</a></h3> <p>対象を確認。</p> <pre><code class="shell"># lsblk sdb 8:16 0 50G 0 disk ├─sdb1 8:17 0 26.2G 0 part ├─sdb2 8:18 0 23.9G 0 part </code></pre> <p>対象に対して作成</p> <pre><code class="shell-session"># pvcreate /dev/sdb1 /dev/sdb2 Physical volume "/dev/sdb1" successfully created. Physical volume "/dev/sdb2" successfully created. </code></pre> <p>確認。</p> <pre><code class="shell"># pvs PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 --- <26.16g <26.16g /dev/sdb2 lvm2 --- 23.84g 23.84g </code></pre> <h3 id="2.3.2 Volume Group作成"><a href="#2.3.2+Volume+Group%E4%BD%9C%E6%88%90">2.3.2 Volume Group作成</a></h3> <p>作成。</p> <pre><code class="shell"># vgcreate vg01 /dev/sdb1 Volume group "vg01" successfully created # vgcreate vg02 /dev/sdb2 Volume group "vg02" successfully created </code></pre> <p>確認。</p> <pre><code class="shell"># vgs VG #PV #LV #SN Attr VSize VFree vg01 1 0 0 wz--n- 26.15g 26.15g vg02 1 0 0 wz--n- <23.84g <23.84g </code></pre> <h3 id="2.3.3 Logical Volume作成"><a href="#2.3.3+Logical+Volume%E4%BD%9C%E6%88%90">2.3.3 Logical Volume作成</a></h3> <p>作成</p> <pre><code class="shell"># lvcreate -n lv01 -l +100%FREE vg01 Logical volume "lv01" created. # lvcreate -n lv02 -l +100%FREE vg02 Logical volume "lv02" created. </code></pre> <p>確認</p> <pre><code class="shell"># lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv01 vg01 -wi-a----- 26.15g lv02 vg02 -wi-a----- <23.84g </code></pre> <h2 id="2.4 ファイルシステムの作成&マウント"><a href="#2.4+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E4%BD%9C%E6%88%90%EF%BC%86%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88">2.4 ファイルシステムの作成&マウント</a></h2> <p>作成したブロックデバイスにファイルシステムを作成する。<br /> ファイルシステムがxfsの場合は以下。</p> <pre><code class="shell"># mkfs.xfs /dev/vg01/lv01 meta-data=/dev/vg01/lv01 isize=512 agcount=4, agsize=1713920 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=0 inobtcount=0 data = bsize=4096 blocks=6855680, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=3347, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # mkfs.xfs /dev/vg02/lv02 meta-data=/dev/vg02/lv02 isize=512 agcount=4, agsize=1562368 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=0 inobtcount=0 data = bsize=4096 blocks=6249472, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=3051, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 </code></pre> <p>もしファイルシステムがext4の場合は</p> <pre><code>mkfs.ext4 </code></pre> <p>ファイルシステムの手動マウント。</p> <pre><code class="shell"># mount /dev/vg01/lv01 /mnt/newspace1 # mount /dev/vg02/lv02 /mnt/newspace2 </code></pre> <p>または</p> <pre><code class="shell"># mount /dev/sdb1 /mnt/newspace </code></pre> <p>現在マウントされてるファイルシステム、マウントポイントを表示。</p> <pre><code class="shell"># mount|grep sdb1 /dev/sdb1 on /mnt/newspace type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota) </code></pre> <h3 id="2.4.1 ファイルシステムの永続マウント"><a href="#2.4.1+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E6%B0%B8%E7%B6%9A%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88">2.4.1 ファイルシステムの永続マウント</a></h3> <p>今のままだとOS再起動時にマウントされない。<br /> /etc/fstabにエントリーを追加。</p> <p>まずは情報確認。</p> <pre><code class="shell"># lsblk -fp NAME FSTYPE LABEL UUID MOUNTPOINT /dev/sda tq/dev/sda1 vfat 2314-8847 /boot/efi tq/dev/sda2 xfs a619a666-d067-48a1-84c0-597037623f97 /boot mq/dev/sda3 LVM2_member 5QtWJg-49vg-4Ces-2Iv3-MRP5-dNdG-nLQwgd tq/dev/mapper/ocivolume-root xfs b74c7d6e-a842-4ab7-a47e-2ac332edaa3d / mq/dev/mapper/ocivolume-oled xfs 0950a10f-ab7a-4ade-81df-abfe0b973620 /var/oled /dev/sdb /dev/sdb1 xfs 1f50f554-f853-4ca1-84a3-f478a42a8b5e /mnt/newspace /dev/sdb2 xfs 5a6d9dcc-ab9f-4dc0-a9a1-08f596d7b7a0 /mnt/newspace2 </code></pre> <p>/etc/fstabに追加する。</p> <pre><code class="shell">#### UUID=1f50f554-f853-4ca1-84a3-f478a42a8b5e /mnt/newspace xfs defaults 0 0 </code></pre> <p>第1フィールド UUID<br /> 第2フィールド マウントポイント<br /> 第3フィールド ファイルシステム(xfsやext4)<br /> 第4フィールド オプションをカンマ区切りで記入。なければ「defaults」<br /> 第5フィールド 0<br /> 第6フィールド xfsファイルシステムの場合は0。ext4ファイルシステムの場合、ルートファイルシステムには1を、その他は2を。</p> <h1 id="3.ディスク拡張"><a href="#3.%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E6%8B%A1%E5%BC%B5">3.ディスク拡張</a></h1> <h2 id="3.1.パーティション拡張"><a href="#3.1.%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E6%8B%A1%E5%BC%B5">3.1.パーティション拡張</a></h2> <h3 id="3.1.1 OCIコンソールからオンラインディスク拡張とOS認識"><a href="#3.1.1+OCI%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%8B%E3%82%89%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E6%8B%A1%E5%BC%B5%E3%81%A8OS%E8%AA%8D%E8%AD%98">3.1.1 OCIコンソールからオンラインディスク拡張とOS認識</a></h3> <p>コンソールからオンラインでディスク拡張可能。今回は50GBから65GBに拡張した。<br /> <a href="https://crieit.now.sh/upload_images/01951106d2320a385b15633467219304630cd5cec81a6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b15633467219304630cd5cec81a6.png?mw=700" alt="image.png" /></a></p> <p>まずは現在OSが認識しているディスクサイズ。</p> <pre><code class="shell"># fdisk -l /dev/sdb Disk /dev/sdb: 50 GiB, 53687091200 bytes, 104857600 sectors  ←50ギビバイト Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 1048576 bytes Disklabel type: gpt Disk identifier: 921F02F5-8639-4525-9738-B75553F5F587 Device Start End Sectors Size Type /dev/sdb1 2048 19531775 19529728 9.3G Linux filesystem  ←9.3ギビバイト /dev/sdb2 19531776 104857566 85325791 40.7G Linux filesystem  ←40.7ギビバイト </code></pre> <p>まだ50ギビバイトしかOSに認識されていないので、拡張した65ギビバイトまで認識されるように再スキャンさせる。</p> <pre><code class="shell"># echo 1&gt;/sys/class/block/sdb/device/rescan   ←sdbの部分は場合による。ブートボリュームの場合はsda </code></pre> <p>再度、確認する。</p> <pre><code class="shell"># fdisk -l /dev/sdb GPT PMBR size mismatch (104857599 != 136314879) will be corrected by write.  ←余白ができた事が記載されている The backup GPT table is not on the end of the device. This problem will be corrected by write. Disk /dev/sdb: 65 GiB, 69793218560 bytes, 136314880 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 1048576 bytes Disklabel type: gpt Disk identifier: 921F02F5-8639-4525-9738-B75553F5F587 Device Start End Sectors Size Type /dev/sdb1 2048 19531775 19529728 9.3G Linux filesystem /dev/sdb2 19531776 104857566 85325791 40.7G Linux filesystem </code></pre> <h3 id="3.1.2 パーティションを再定義"><a href="#3.1.2+%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%86%8D%E5%AE%9A%E7%BE%A9">3.1.2 パーティションを再定義</a></h3> <p>拡張させるパーティションは最後尾にいるパーティション。<br /> パーティション拡張させる前にまずは既存のパーティション定義を削除する。</p> <pre><code class="shell"># fdisk -/dev/sdb Command (m for help): p Disk /dev/sdb: 55 GiB, 59055800320 bytes, 115343360 sectors ~ Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 54857599 54855552 26.2G 8e Linux LVM /dev/sdb2 54857728 104857599 49999872 23.9G 8e Linux LVM ~ Command (m for help): d Partition number (1,2, default 2): 2 Command (m for help): p Disk /dev/sdb: 55 GiB, 59055800320 bytes, 115343360 sectors ~ Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 54857599 54855552 26.2G 8e Linux LVM </code></pre> <p>2個目のパーティションが削除され、1個しかパーティションがないことがわかる。<br /> 2個目のパーティションを再定義する。</p> <pre><code class="shell">Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): 2 First sector (54857600-115343359, default 54857728): Last sector, +sectors or +size{K,M,G,T,P} (54857728-115343359, default 115343359):  Created a new partition 2 of type 'Linux' and of size 28.9 GiB.  Partition #2 contains a LVM2_member signature. Do you want to remove the signature? [Y]es/[N]o: N Command (m for help): p  Disk /dev/sdb: 55 GiB, 59055800320 bytes, 115343360 sectors Device Boot Start End Sectors Size Id Type  /dev/sdb1 2048 54857599 54855552 26.2G 8e Linux LVM  /dev/sdb2 54857728 115343359 60485632 28.9G 83 Linux Command (m for help): t Partition number (1,2, default 2): Hex code (type L to list all codes): 8e  Changed type of partition 'Linux' to 'Linux LVM'. Command (m for help): p  Disk /dev/sdb: 55 GiB, 59055800320 bytes, 115343360 sectors ~ Device Boot Start End Sectors Size Id Type  /dev/sdb1 2048 54857599 54855552 26.2G 8e Linux LVM  /dev/sdb2 54857728 115343359 60485632 28.9G 8e Linux LVM </code></pre> <p>現在の状態を確認</p> <pre><code class="shell"># df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg02-lv02 24G 203M 24G 1% /mnt/newspace2 /dev/mapper/vg01-lv01 27G 219M 26G 1% /mnt/newspace1 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk tqsda1 8:1 0 100M 0 part /boot/efi tqsda2 8:2 0 1G 0 part /boot mqsda3 8:3 0 45.5G 0 part tqocivolume-root 252:0 0 35.5G 0 lvm / mqocivolume-oled 252:1 0 10G 0 lvm /var/oled sdb 8:16 0 65G 0 disk tqsdb1 8:17 0 9.3G 0 part /mnt/newspace mqsdb2 8:18 0 47.9G 0 part /mnt/newspace2 </code></pre> <p>比べてみると、lsblkでは拡張が認識されているものの、「df -h」の方はまだ認識されていない。<br /> 読み込ませる。</p> <p>ここでリブート</p> <h2 id="3.2 LVM拡張"><a href="#3.2+LVM%E6%8B%A1%E5%BC%B5">3.2 LVM拡張</a></h2> <h3 id="3.2.1 pvresize"><a href="#3.2.1+pvresize">3.2.1 pvresize</a></h3> <p>Physical Volume<br /> まずは確認。</p> <pre><code class="shell"># pvs PV VG Fmt Attr PSize PFree /dev/sdb1 vg01 lvm2 a-- 26.15g 0 /dev/sdb2 vg02 lvm2 a-- <23.84g 0 </code></pre> <p>リサイズする。</p> <pre><code class="shell"># pvresize /dev/sdb2 Physical volume "/dev/sdb2" changed 1 physical volume(s) resized or updated / 0 physical volume(s) not resized </code></pre> <p>5GB拡張が反映されていることを確認。</p> <pre><code class="shell"># pvs PV VG Fmt Attr PSize PFree /dev/sdb1 vg01 lvm2 a-- 26.15g 0 /dev/sdb2 vg02 lvm2 a-- <28.84g 5.00g  ←5GB空きが反映されてる。 </code></pre> <h3 id="3.2.2 LVの拡張"><a href="#3.2.2+LV%E3%81%AE%E6%8B%A1%E5%BC%B5">3.2.2 LVの拡張</a></h3> <p>まずは事前確認。</p> <pre><code class="shell"># vgs VG #PV #LV #SN Attr VSize VFree vg01 1 1 0 wz--n- 26.15g 0 vg02 1 1 0 wz--n- <28.84g 5.00g # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv01 vg01 -wi-ao---- 26.15g lv02 vg02 -wi-ao---- <23.84g  ←まだ拡張されてない </code></pre> <p>拡張する。</p> <pre><code class="shell"># lvextend -l +100%FREE /dev/vg02/lv02 Size of logical volume vg02/lv02 changed from <23.84 GiB (6103 extents) to <28.84 GiB (7383 extents). Logical volume vg02/lv02 successfully resized. </code></pre> <p>拡張されたことを確認。</p> <pre><code class="shell"># lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv01 vg01 -wi-ao---- 26.15g lv02 vg02 -wi-ao---- <28.84g  ←5GB拡張された </code></pre> <h2 id="3.3 ファイルシステムの拡張"><a href="#3.3+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E6%8B%A1%E5%BC%B5">3.3 ファイルシステムの拡張</a></h2> <p>まだこの状態だとマウントポイントは拡張されていない。</p> <pre><code class="shell"># df -hT Filesystem Type Size Used Avail Use% Mounted on ~ /dev/mapper/vg02-lv02 xfs 24G 203M 24G 1% /mnt/newspace2 </code></pre> <p>ファイルシステムを拡張する。この際、マウントポイントを引数にすることに注意する。</p> <pre><code class="shell"># xfs_growfs /mnt/newspace2 meta-data=/dev/mapper/vg02-lv02 isize=512 agcount=4, agsize=1562368 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=0 inobtcount=0 data = bsize=4096 blocks=6249472, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=3051, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 6249472 to 7560192 </code></pre> <p>マウントポイントが拡張されたことを確認。</p> <pre><code class="shell"># df -hT Filesystem Type Size Used Avail Use% Mounted on ~ /dev/mapper/vg02-lv02 xfs 24G 203M 24G 1% /mnt/newspace2 </code></pre> <pre><code class="shell"># xfs_growfs /mnt/newspace2 # df -hT /mnt/newspace2 Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg02-lv02 xfs 29G 239M 29G 1% /mnt/newspace2  ←拡張された </code></pre> <p>ちなみに、ファイルシステムがext4の場合は</p> <pre><code class="shell"># resize2fs </code></pre> <h1 id="4. ディスク追加"><a href="#4.+%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E8%BF%BD%E5%8A%A0">4. ディスク追加</a></h1> <p>/dev/sdb1と/dev/sdb2と/dev/sdb3のうち、/dev/sdb1と/dev/sdb3を統合する。つまり、/dev/vg01/lv01に/dev/sdb3を追加する。</p> <pre><code class="shell"># lsblk ~ vg01-lv01 253:1 0 26.2G 0 lvm /mnt/newspace1 ~ </code></pre> <p>下記手順で実行。</p> <h2 id="4.1 pv"><a href="#4.1+pv">4.1 pv</a></h2> <pre><code class="shell"># pvs PV VG Fmt Attr PSize PFree /dev/sdb1 vg01 lvm2 a-- 26.15g 0 /dev/sdb2 vg02 lvm2 a-- <28.84g 0 # pvcreate /dev/sdb3 Physical volume "/dev/sdb3" successfully created. # pvs PV VG Fmt Attr PSize PFree /dev/sdb1 vg01 lvm2 a-- 26.15g 0 /dev/sdb2 vg02 lvm2 a-- <28.84g 0 /dev/sdb3 lvm2 --- 5.00g 5.00g </code></pre> <h2 id="4.2 vg"><a href="#4.2+vg">4.2 vg</a></h2> <pre><code class="shell"># vgs VG #PV #LV #SN Attr VSize VFree vg01 1 1 0 wz--n- 26.15g 0 vg02 1 1 0 wz--n- <28.84g 0 # vgextend vg01 /dev/sdb3 Volume group "vg01" successfully extended # vgs VG #PV #LV #SN Attr VSize VFree vg01 2 1 0 wz--n- <31.15g <5.00g vg02 1 1 0 wz--n- <28.84g 0 </code></pre> <h2 id="4.3 lv"><a href="#4.3+lv">4.3 lv</a></h2> <pre><code class="shell"># lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv01 vg01 -wi-ao---- 26.15g lv02 vg02 -wi-ao---- <28.84g # lvextend -l +100%FREE /dev/vg01/lv01 Size of logical volume vg01/lv01 changed from 26.15 GiB (6695 extents) to <31.15 GiB (7974 extents). Logical volume vg01/lv01 successfully resized. # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv01 vg01 -wi-ao---- <31.15g lv02 vg02 -wi-ao---- <28.84g </code></pre> <h2 id="4.4 ファイルシステムの拡張"><a href="#4.4+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E6%8B%A1%E5%BC%B5">4.4 ファイルシステムの拡張</a></h2> <pre><code class="shell"># df -hT Filesystem Type Size Used Avail Use% Mounted on ~ /dev/mapper/vg01-lv01 xfs 27G 219M 26G 1% /mnt/newspace1 </code></pre> <p>ファイルシステムを拡張する。この際、マウントポイントを引数にすることに注意する。</p> <pre><code class="shell"># xfs_growfs /mnt/newspace1 meta-data=/dev/mapper/vg01-lv01 isize=512 agcount=4, agsize=1713920 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=0 inobtcount=0 data = bsize=4096 blocks=6855680, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=3347, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 6855680 to 8165376 </code></pre> <p>マウントポイントが拡張されたことを確認。</p> <pre><code class="shell"># df -hT Filesystem Type Size Used Avail Use% Mounted on ~ /dev/mapper/vg01-lv01 xfs 32G 255M 31G 1% /mnt/newspace1 </code></pre> <p>メモ</p> <pre><code class="shell">物理ボリュームとしてラベルづけ # pvcreate /dev/sdb1 /dev/sdb3 WARNING: xfs signature detected on /dev/sdb1 at offset 0. Wipe it? [y/n]: y Wiping xfs signature on /dev/sdb1. WARNING: xfs signature detected on /dev/sdb3 at offset 0. Wipe it? [y/n]: y Wiping xfs signature on /dev/sdb3. Physical volume "/dev/sdb1" successfully created. Physical volume "/dev/sdb3" successfully created. ボリュームグループ名を「vg01」として作成 # vgcreate vg01 /dev/sdb1 /dev/sdb3 Volume group "vg01" successfully created 論理ボリューム名を「lv01」として作成 # lvcreate -n lv01 -l +100%FREE vg01 Logical volume "lv01" created. ファイルシステム追加 # mkfs -t xfs /dev/vg01/lv01 マウント # mount /dev/vg01/lv01 /mnt/newspace </code></pre> kawai_mizugorou tag:crieit.net,2005:PublicArticle/18264 2022-07-28T02:01:52+09:00 2022-08-08T04:48:35+09:00 https://crieit.net/posts/MySQL-Linux MySQLでDBサーバ構築してレプリケーションさせる <p>参考<br /> ① https://videohub.oracle.com/media/MySQL%208.0%20入門セミナー%20~インストール編%20for%20Linux%20&%20アーキテクチャ編~%20%282022年6月16日%29/1_ph7s6hxj<br /> ②MySQL公式ドキュメント:https://dev.mysql.com/doc/refman/8.0/ja/linux-installation.html</p> <h1 id="1. MySQLを開始"><a href="#1.+MySQL%E3%82%92%E9%96%8B%E5%A7%8B">1. MySQLを開始</a></h1> <h2 id="1.1. リポジトリをダウンロード"><a href="#1.1.+%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">1.1. リポジトリをダウンロード</a></h2> <p>この記事では、Oracle Linuxを使用している。</p> <pre><code>[opc@mysql-master1 ~]$ cat /etc/oracle-release Oracle Linux Server release 8.6 </code></pre> <p>yumリポジトリを利用する。<br /> <a target="_blank" rel="nofollow noopener" href="https://dev.mysql.com/">https://dev.mysql.com/</a><br /> から、MySQLサーバのOSバージョンと合致したリポジトリをネットに接続可能な端末にダウンロードし、MySQLサーバに配置する。</p> <p>画面左部の「<code>Downloads</code>」タブをクリックし切り替わった画面の<code>MySQL Yum Repository</code>をクリック。<br /> すると、複数種類のリポジトリが表示されるので、利用するMySQLサーバのOSバージョンと合致したリポジトリを選択する必要がある。</p> <pre><code>[opc@mysql-master1 ~]$ cat /etc/oracle-release Oracle Linux Server release 8.6 </code></pre> <p>ダウンロードしたら、利用予定のMySQLサーバに転送する。</p> <pre><code>[root@mysql-master1 tmp]# ll total 16 -rw-r--r--. 1 kiban kiban 14432 Jul 23 15:12 mysql80-community-release-el8-4.noarch.rpm drwx------. 3 root root 17 Jul 23 15:05 systemd-private-e967423d4c9e455a88d0cd2ee0f307be-chronyd.service-2MooXe drwx------. 3 root root 17 Jul 23 15:05 systemd-private-e967423d4c9e455a88d0cd2ee0f307be-unified-monitoring-agent.service-RX6Cai drwxr-xr-x. 2 root root 6 Jul 21 17:08 unified-monitoring-agent </code></pre> <p>以上</p> <h2 id="1.2. MySQLのインストール"><a href="#1.2.+MySQL%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">1.2. MySQLのインストール</a></h2> <p>先述の1.1節で配置したインストーラーを用いてインストール開始する。</p> <p>まずはインストーラを解凍し、解凍が無事に完了したらちゃんと解凍されていることを確認も行う。</p> <pre><code>[root@mysql-master1 tmp]# rpm -Uvh mysql80-community-release-el8-4.noarch.rpm warning: mysql80-community-release-el8-4.noarch.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY Verifying... ################################# [100%] Preparing... ################################# [100%] Updating / installing... 1:mysql80-community-release-el8-4 ################################# [100%] [root@mysql-master1 tmp]# yum repolist enabled |grep 'mysql' mysql-connectors-community MySQL Connectors Community mysql-tools-community MySQL Tools Community mysql80-community MySQL 8.0 Community Server </code></pre> <p>RHEL8などLinux8ベースのOSの場合のみ同梱されているMySQLの無効化を行う。</p> <pre><code>[root@mysql-master1 tmp]# yum module disable mysql MySQL 8.0 Community Server 70 MB/s | 2.3 MB 00:00 MySQL Connectors Community 5.8 MB/s | 74 kB 00:00 MySQL Tools Community 26 MB/s | 459 kB 00:00 Dependencies resolved. ===================================================================================================================== Package Architecture Version Repository Size ===================================================================================================================== Disabling modules: mysql Transaction Summary ===================================================================================================================== Is this ok [y/N]: y Complete! </code></pre> <p>MySQLのインストールを実施。</p> <pre><code>[root@mysql-master1 tmp]# yum install mysql-community-server Last metadata expiration check: 0:02:03 ago on Sat 23 Jul 2022 03:22:37 PM GMT. Dependencies resolved. ===================================================================================================================== Package Architecture Version Repository Size ===================================================================================================================== Installing: mysql-community-server x86_64 8.0.29-1.el8 mysql80-community 53 M Installing dependencies: mysql-community-client x86_64 8.0.29-1.el8 mysql80-community 14 M mysql-community-client-plugins x86_64 8.0.29-1.el8 mysql80-community 2.4 M mysql-community-common x86_64 8.0.29-1.el8 mysql80-community 636 k mysql-community-icu-data-files x86_64 8.0.29-1.el8 mysql80-community 2.1 M mysql-community-libs x86_64 8.0.29-1.el8 mysql80-community 1.5 M Transaction Summary ===================================================================================================================== Install 6 Packages Total download size: 74 M Installed size: 347 M Is this ok [y/N]: y Downloading Packages: (1/6): mysql-community-common-8.0.29-1.el8.x86_64.rpm 25 MB/s | 636 kB 00:00 (2/6): mysql-community-client-plugins-8.0.29-1.el8.x86_64.rpm 62 MB/s | 2.4 MB 00:00 (3/6): mysql-community-icu-data-files-8.0.29-1.el8.x86_64.rpm 76 MB/s | 2.1 MB 00:00 (4/6): mysql-community-libs-8.0.29-1.el8.x86_64.rpm 64 MB/s | 1.5 MB 00:00 (5/6): mysql-community-client-8.0.29-1.el8.x86_64.rpm 95 MB/s | 14 MB 00:00 (6/6): mysql-community-server-8.0.29-1.el8.x86_64.rpm 98 MB/s | 53 MB 00:00 --------------------------------------------------------------------------------------------------------------------- Total 123 MB/s | 74 MB 00:00 MySQL 8.0 Community Server 3.0 MB/s | 3.1 kB 00:00 Importing GPG key 0x3A79BD29: Userid : "MySQL Release Engineering <[email protected]>" Fingerprint: 859B E8D7 C586 F538 430B 19C2 467B 942D 3A79 BD29 From : /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022 Is this ok [y/N]: y Key imported successfully MySQL 8.0 Community Server 1.9 MB/s | 1.9 kB 00:00 Importing GPG key 0x5072E1F5: Userid : "MySQL Release Engineering <[email protected]>" Fingerprint: A4A9 4068 76FC BD3C 4567 70C8 8C71 8D3B 5072 E1F5 From : /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql Is this ok [y/N]: y Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : mysql-community-common-8.0.29-1.el8.x86_64 1/6 Installing : mysql-community-client-plugins-8.0.29-1.el8.x86_64 2/6 Installing : mysql-community-libs-8.0.29-1.el8.x86_64 3/6 Running scriptlet: mysql-community-libs-8.0.29-1.el8.x86_64 3/6 Installing : mysql-community-client-8.0.29-1.el8.x86_64 4/6 Installing : mysql-community-icu-data-files-8.0.29-1.el8.x86_64 5/6 Running scriptlet: mysql-community-server-8.0.29-1.el8.x86_64 6/6 Installing : mysql-community-server-8.0.29-1.el8.x86_64 6/6 Running scriptlet: mysql-community-server-8.0.29-1.el8.x86_64 6/6 Verifying : mysql-community-client-8.0.29-1.el8.x86_64 1/6 Verifying : mysql-community-client-plugins-8.0.29-1.el8.x86_64 2/6 Verifying : mysql-community-common-8.0.29-1.el8.x86_64 3/6 Verifying : mysql-community-icu-data-files-8.0.29-1.el8.x86_64 4/6 Verifying : mysql-community-libs-8.0.29-1.el8.x86_64 5/6 Verifying : mysql-community-server-8.0.29-1.el8.x86_64 6/6 Installed: mysql-community-client-8.0.29-1.el8.x86_64 mysql-community-client-plugins-8.0.29-1.el8.x86_64 mysql-community-common-8.0.29-1.el8.x86_64 mysql-community-icu-data-files-8.0.29-1.el8.x86_64 mysql-community-libs-8.0.29-1.el8.x86_64 mysql-community-server-8.0.29-1.el8.x86_64 Complete! </code></pre> <p>最後まで進んでインストール完了したら、MySQLを起動させる。<br /> まずはステータスの確認から。</p> <pre><code>[root@mysql-master1 tmp]# systemctl status mysqld ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: inactive (dead) Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html </code></pre> <p>インストールされており、サービスとしてenableとなっていることがわかる。<br /> それでは起動させる。</p> <pre><code>[root@mysql-master1 tmp]# systemctl start mysqld [root@mysql-master1 tmp]# systemctl status mysqld ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2022-07-23 15:45:02 GMT; 1min 29s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 11752 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 11834 (mysqld) Status: "Server is operational" Tasks: 37 (limit: 22765) Memory: 495.4M CGroup: /system.slice/mysqld.service mq11834 /usr/sbin/mysqld Jul 23 15:44:56 mysql-master1 systemd[1]: Starting MySQL Server... Jul 23 15:45:02 mysql-master1 systemd[1]: Started MySQL Server. </code></pre> <p>スタートさせた後は必ずステータスを確認して、起動していることを確認すること。</p> <h2 id="1.3 ログインしてパスワードを変更"><a href="#1.3+%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%A6%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E5%A4%89%E6%9B%B4">1.3 ログインしてパスワードを変更</a></h2> <p>rootユーザの初期パスワードはログに記載されているのでそこで確認し、自分の覚えやすいパスワードに変更していく。その後、他のユーザを作成してパスワード設定、権限設定を順次行う。</p> <p>まずはrootユーザのパスワードを変更する。<code>/var/log/mysql.log</code>に記載されていることを確認。</p> <pre><code>[root@mysql-master1 log]# cat /var/log/mysqld.log ~ 2022-07-23T15:44:59.597480Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: xCkVmf#Yd2ci ~ </code></pre> <p>上記をみると、<code>xCkVmf#Yd2ci</code>が初期パスワードとして設定されていることがわかる。<br /> ではログインして変更する。</p> <pre><code>[root@mysql-master1 log]# mysql -u root -p Enter password:  ←ここにxCkVmf#Yd2ciを入力。表示はされないよ ~ mysql> alter user root@localhost identified by 'MyNewPass1!'; Query OK, 0 rows affected (0.00 sec) mysql> exit Bye </code></pre> <p>これでrootユーザのパスワードがMyNewPass4!に変更された。<br /> 再ログインしてみて、パスワード変更されたかを確認しておこう。<br /> パスワード変更コマンドはいくつかあるので紹介する。</p> <pre><code>> set password for ユーザ名@ホスト名='任意password`; 現在ログインしてるユーザのパスワードを変更するには > set password='任意passwword`; </code></pre> <p>ちなみに、パスワードポリシーはパスワード検証コンポーネントによって定義されている。これはデフォルトで有効になってる。内容は</p> <pre><code>mysql> SHOW VARIABLES LIKE 'validate_password%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | validate_password.check_user_name | ON | | validate_password.dictionary_file | | | validate_password.length | 8 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | MEDIUM | | validate_password.special_char_count | 1 | +--------------------------------------+--------+ 7 rows in set (0.01 sec) </code></pre> <p>パスワード検証コンポーネントを無効化させるには</p> <pre><code>mysql> uninstall component 'file://component_validate_password'; Query OK, 0 rows affected (0.00 sec) </code></pre> <p>逆に有効化させるには<code>install component 'file://component_validate_password';</code>を入力する。</p> <h1 id="2. MySQLアーキテクチャ"><a href="#2.+MySQL%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3">2. MySQLアーキテクチャ</a></h1> <p><a href="https://crieit.now.sh/upload_images/cd28e3ad239066b2c265d44ba4be8d2062e1794497278.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cd28e3ad239066b2c265d44ba4be8d2062e1794497278.png?mw=700" alt="innodb-architecture.png" /></a></p> <h2 id="2.1 sampleデータ"><a href="#2.1+sample%E3%83%87%E3%83%BC%E3%82%BF">2.1 sampleデータ</a></h2> <p>サンプルデータをインストールする。<br /> <a target="_blank" rel="nofollow noopener" href="https://dev.mysql.com/doc/index-other.html">https://dev.mysql.com/doc/index-other.html</a><br /> 今回はworld databaseのzipファイルをローカルにダウンロードし、DBサーバに転送。zipファイルを解凍してからmysqlへインポートした。</p> <pre><code>$ unzip world-db.zip $ cd world-db/ $ mysql -uroot -proomysqld < world.sql </code></pre> <p>これでインポート完了したので中身の確認をしてみる。</p> <pre><code>mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | world | +--------------------+ 5 rows in set (0.00 sec) mysql> use world Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------+ | Tables_in_world | +-----------------+ | city | | country | | countrylanguage | +-----------------+ 3 rows in set (0.01 sec) </code></pre> <p>そのほかにも自分でテーブルを作成してみる。</p> <pre><code>mysql> create table `sample1` ( -> `code` char(3) not null default '', `population` int(11) not null default '0', primary key (`code`)) -> engine=InnoDB; Query OK, 0 rows affected, 1 warning (0.02 sec) </code></pre> <p>インポートしたデータはデフォルトでは/var/lib/mysqlに配置される。</p> <pre><code>[root@mysql-master1 mysql]# ll total 189584 -rw-r-----. 1 mysql mysql 56 Jul 23 15:44 auto.cnf -rw-r-----. 1 mysql mysql 736313 Jul 27 15:29 binlog.000001 -rw-r-----. 1 mysql mysql 16 Jul 23 15:45 binlog.index -rw-------. 1 mysql mysql 1680 Jul 23 15:44 ca-key.pem -rw-r--r--. 1 mysql mysql 1112 Jul 23 15:44 ca.pem -rw-r--r--. 1 mysql mysql 1112 Jul 23 15:44 client-cert.pem -rw-------. 1 mysql mysql 1676 Jul 23 15:44 client-key.pem -rw-r-----. 1 mysql mysql 196608 Jul 27 15:31 '#ib_16384_0.dblwr' -rw-r-----. 1 mysql mysql 8585216 Jul 23 15:44 '#ib_16384_1.dblwr' -rw-r-----. 1 mysql mysql 5942 Jul 23 15:45 ib_buffer_pool -rw-r-----. 1 mysql mysql 12582912 Jul 27 15:29 ibdata1 ←システムtableスペース -rw-r-----. 1 mysql mysql 50331648 Jul 27 15:31 ib_logfile0 ←REDOログデータ -rw-r-----. 1 mysql mysql 50331648 Jul 23 15:44 ib_logfile1 ←REDOログデータ -rw-r-----. 1 mysql mysql 12582912 Jul 23 15:45 ibtmp1 drwxr-x---. 2 mysql mysql 187 Jul 23 15:45 '#innodb_temp' drwxr-x---. 2 mysql mysql 143 Jul 23 15:44 mysql  ←この配下に一般ログやslowログがある -rw-r-----. 1 mysql mysql 25165824 Jul 27 15:29 mysql.ibd srwxrwxrwx. 1 mysql mysql 0 Jul 23 15:45 mysql.sock -rw-------. 1 mysql mysql 6 Jul 23 15:45 mysql.sock.lock drwxr-x---. 2 mysql mysql 8192 Jul 23 15:44 performance_schema -rw-------. 1 mysql mysql 1680 Jul 23 15:44 private_key.pem -rw-r--r--. 1 mysql mysql 452 Jul 23 15:44 public_key.pem -rw-r--r--. 1 mysql mysql 1112 Jul 23 15:44 server-cert.pem -rw-------. 1 mysql mysql 1676 Jul 23 15:44 server-key.pem drwxr-x---. 2 mysql mysql 28 Jul 23 15:45 sys -rw-r-----. 1 mysql mysql 16777216 Jul 27 15:29 undo_001 -rw-r-----. 1 mysql mysql 16777216 Jul 27 15:31 undo_002 drwxr-x---. 2 mysql mysql 87 Jul 27 15:29 world  ←インポートしたデータ </code></pre> <h2 id="2.2 システム変数設定"><a href="#2.2+%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%A4%89%E6%95%B0%E8%A8%AD%E5%AE%9A">2.2 システム変数設定</a></h2> <p>MySQLサーバの設定はシステム変数で設定する。設定方法は、①my.cnfで設定した後に再起動を行う、②一時的な設定を行う(一部の変数しか設定変更できない)。</p> <h3 id="2.2.1 my.cnfで設定"><a href="#2.2.1+my.cnf%E3%81%A7%E8%A8%AD%E5%AE%9A">2.2.1 my.cnfで設定</a></h3> <p>設定ファイルは/etc/my.cnfが読み込まれることになっている。デフォルト設定を変更して任意のディレクトリに配置したmy.cnfを読み込ませたかったら以下を実施。複数ファイルを読み込んだら後勝ちになる。</p> <pre><code>$ mysqld --verbose --help $ mysqld --defaults-file=/usr/local/mysql/date/my.cnf & </code></pre> <p>設定ファイルを変更したら基本的にはmysqlの再起動を行う。</p> <h3 id="2.2.2 一時的な設定"><a href="#2.2.2+%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AA%E8%A8%AD%E5%AE%9A">2.2.2 一時的な設定</a></h3> <p>参考:https://dev.mysql.com/doc/refman/8.0/ja/server-system-variables.html</p> <p>MySQLを再起動かけられないときなどは、my.cnfの編集なしに設定値を変更できる変数がある。ただし、一時的に設定変更しても、再起動やmy.cnfのリロードを行うと一時的な設定が元に戻る点に注意。</p> <p>設定方法は以下で行える。設定はセッション単位(LOCAL)、サーバ全体(GLOBAL)での変更が可能。</p> <pre><code>> set [global|sesison] <変数> =<値>; </code></pre> <p>設定した値の確認方法は以下。</p> <pre><code>show [global|session] variables like '%<システム変数名>%'; </code></pre> <p>実際に設定されてるシステム変数を一括で確認するには</p> <pre><code>$ mysqld --verbose --help </code></pre> <p>で確認できる。</p> <p>一時的な設定変更を永続化させることができる。その場合は設定する際にpersistを付け加えればよい。</p> <pre><code>> set persist max_connections = 500; </code></pre> <p>システム変数を永続化オプションをつけて設定した場合はmy.cnfとの設定に差異がでる。そういった場合に設定変更履歴を確認するにはperformance_schemaを参照すること。</p> <pre><code>mysql> select * from performance_schema.variables_info where variable_source='persisted'; Empty set (0.00 sec) </code></pre> <h3 id="2.2.3 システム変数例"><a href="#2.2.3+%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%A4%89%E6%95%B0%E4%BE%8B">2.2.3 システム変数例</a></h3> <p>nnodb_buffer_pool_sizeInno:DBバッファプールサイズ<br /> innodb_log_buffer_sizeInno:DBログバッファのサイズ(メモリ上)<br /> innodb_log_file_size:ログファイルのサイズ(ディスク上)<br /> innodb_log_files_in_groups:ログファイルの数(デフォルト2)<br /> binlog_expire_logs_seconds:バイナリログを削除するまでの期間を秒単位で指定。デフォルトは30日。</p> <h1 id="3. レプリケーション設定"><a href="#3.+%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A8%AD%E5%AE%9A">3. レプリケーション設定</a></h1> <p>レプリケーションの設定は4手順ある。<br /> ①レプリケーション用のパラメータを設定、<br /> ②マスター側にレプリケーションユーザ作成、<br /> ③マスター側のバックアップを取得し、スレーブ側にリストアする。そして、<br /> ④スレーブ側でレプリケーションのためにマスター情報やポジション情報を設定しレプリケーションをスタートさせる。</p> <h2 id="3.1 レプリケーション用のパラメータ設定"><a href="#3.1+%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E7%94%A8%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A8%AD%E5%AE%9A">3.1 レプリケーション用のパラメータ設定</a></h2> <p>マスター側で設定するパラメータ</p> <pre><code>server-id log_bin datedir gtid-mode enforce-gtid-consistency = on log-slave-updates </code></pre> <h2 id="3.2 ソースサーバにレプリケーションユーザ作成"><a href="#3.2+%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%A6%E3%83%BC%E3%82%B6%E4%BD%9C%E6%88%90">3.2 ソースサーバにレプリケーションユーザ作成</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://dev.mysql.com/doc/refman/8.0/ja/replication-howto-repuser.html">https://dev.mysql.com/doc/refman/8.0/ja/replication-howto-repuser.html</a><br /> ソースサーバにレプリケーション用のユーザを作成して、そのユーザにレプリケーションスレーブ権限を付与させる。</p> <pre><code>mysql> create user repl@'10.1.%' identified by 'password'; Query OK, 0 rows affected (0.01 sec) mysql> grant replication slave on *.* to repl@'10.1.%'; Query OK, 0 rows affected (0.00 sec) </code></pre> <p>replユーザがどこから接続可能にしたいのかによって、<code>repl@'10.1.%'</code>の書き方は変わってくる。localhostにするとほかのサーバがreplユーザでアクセスできないので注意。ユーザを作成したらパスワードの設定も忘れずに。<br /> 設定が完了したら、想定通りの挙動になっているかの確認を行う。<br /> まずはマスター側でユーザの確認。</p> <pre><code>mysql> SELECT user, host, plugin FROM mysql.user; +------------------+-----------+-----------------------+ | user | host | plugin | +------------------+-----------+-----------------------+ | repl | 10.1.% | caching_sha2_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+ 5 rows in set (0.00 sec) </code></pre> <p>replユーザのhostが<code>10.1.%</code>になっていることを確認。つまり、localhostに設定されていないので、①マスター側で接続を試みてもログインできないが②スレーブサーバからはログインできるということになる。確認しよう。<br /> ①</p> <pre><code>[kiban@mysql-master1 ~]$ mysql -urepl -p Enter password: ERROR 1045 (28000): Access denied for user 'repl'@'localhost' (using password: YES) </code></pre> <p>②</p> <pre><code>mysql -h10.1.2.148 -urepl -p Enter password: mysql> </code></pre> <p>①②を通じて、想定通りの設定が行われたことが確認できた。</p> <h2 id="3.3 dump出力"><a href="#3.3+dump%E5%87%BA%E5%8A%9B">3.3 dump出力</a></h2> <p>元から入ってるデータベース(システムデータベース)はレプリケーションされないので、それ以外(今回でいえばworld)だけエクスポートする。</p> <pre><code>mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | world |   ←これが出力対象 +--------------------+ </code></pre> <p>以下でエクスポートする。</p> <pre><code>mysqldump -uroot -p<パスワード入力> --master-data=2 --socket=/var/lib/mysql/mysql.sock --hex-blob --flush-logs --default-character-set=utf8mb4 --databases world --single-transaction --triggers --routines --events > mysql_bkup_dump_20220807.sql </code></pre> <p>出力されたダンプをレプリカサーバに転送して、インポートさせる。</p> <pre><code>mysql -hlocalhost -uroot -roomysqld < mysql_bkup_dump_20220807.sql </code></pre> <p>インポート完了したらm、mysqlサーバにログインしてworldデータベースが存在することを確認する。</p> <pre><code>mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | world | +--------------------+ 5 rows in set (0.00 sec) </code></pre> <p>あることがわかった。</p> <p>【重要】<br /> レプリカサーバ側で。datedir配下にあるauto.cnfを削除する。</p> <h2 id="3.4 レプリケーション情報のセット"><a href="#3.4+%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88">3.4 レプリケーション情報のセット</a></h2> <p>レプリカサーバ側でレプリケーションを行うための情報として、ソースサーバの情報をセットする。</p> <p>まずはマスター側の情報を取得する。</p> <pre><code>mysql> show master status; +-------------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------------+----------+--------------+------------------+-------------------+ | master-mysql-bin.000006 | 157 | | | | +-------------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) </code></pre> <p>続いて、上記の情報をもとにスレーブ側で情報をセット。</p> <pre><code>mysql> change master to master_host='<マスターサーバのIPアドレス>', -> master_user='repl', -> master_password='<replユーザのpassword>', -> master_log_file='master-mysql-bin.000006', -> master_log_pos=157; Query OK, 0 rows affected, 8 warnings (0.02 sec) </code></pre> <p>セットが完了したら、想定通りの設定がされているかをスレーブ側で確認。</p> <pre><code>mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Master_Host: <マスターサーバのIPアドレス> Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-mysql-bin.000006 Read_Master_Log_Pos: 157 Relay_Log_File: mysql-slave1-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: master-mysql-bin.000006 Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 157 Relay_Log_Space: 157 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 Master_UUID: Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 1 row in set, 1 warning (0.00 sec) </code></pre> <p>設定が想定通りになっていることが確認できたので、いよいよレプリケーションを始める。</p> <pre><code>mysql> start slave; Query OK, 0 rows affected, 1 warning (0.01 sec) </code></pre> <p>レプリケーションを開始すると、slaveのステータスを再度確認する。</p> <pre><code>mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Connecting to source Master_Host: 10.1.2.148 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-mysql-bin.000006 Read_Master_Log_Pos: 157 Relay_Log_File: mysql-slave1-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: master-mysql-bin.000006 Slave_IO_Running: Connecting Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 157 Relay_Log_Space: 157 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 2003 Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 60 retries: 1 message: Can't connect to MySQL server on '10.1.2.148:3306' (110) Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 Master_UUID: Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: 220806 21:33:27 Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 1 row in set, 1 warning (0.00 sec) </code></pre> <p>本来なら、マスターサーバのバイナリログを取り込んでリレーログにする<code>Slave_IO_Running</code>と、取り込まれたリレーログからイベントを取り出してデータベースに反映させる<code>Slave_SQL_Running</code>のステータスがともに<code>YES</code>になるはずである。しかし、<code>Slave_IO_Running</code>が<code>Connecting</code>になっている。</p> <p>そこで、スレーブサーバからマスターサーバの3306番ポートへ接続できるか確認するために<code>nc -vz マスターのIP 3306</code>を実行したところ、接続できなかった。</p> <pre><code>$ nc -vz 10.1.2.58 3306 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: No route to host. </code></pre> <p>ネットワーク設定に問題がないことは確認済みなので、サーバのfierwall設定を行う。</p> <pre><code># firewall-cmd --zone=public --add-port=3306/tcp --permanet # firewall-cmd --reload # nc -vz 10.1.2.58 3306 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connected to 10.1.2.58:3306. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. </code></pre> <p>3306番ポートへ接続できることを確認。</p> <p>スレーブのステータスを確認すると、</p> <pre><code>Slave_IO_Running: Yes </code></pre> <p>となってた。<br /> レプリケーションされてることが確認できたので、マスター側で変更したデータがスレーブ側に連携されるかテストする。<br /> まずはマスター側でスキーマ作成。</p> <pre><code>mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | world | +--------------------+ 5 rows in set (0.01 sec) mysql> create database test1; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test1 | | world | +--------------------+ 6 rows in set (0.00 sec) </code></pre> <p>続いて、スレーブ側でtest1スキーマが作成されていることを確認。</p> <pre><code>mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test1 | | world | +--------------------+ 6 rows in set (0.00 sec) </code></pre> <p>ちゃんと作成されていた。<br /> これでレプリケーションが正常にされていることがわかった。</p> <h1 id="4.MySQLチューニング"><a href="#4.MySQL%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0">4.MySQLチューニング</a></h1> <h2 id="4.1"><a href="#4.1">4.1</a></h2> <p><code>innodb_log_file_size</code>ログファイルのサイズ(ディスク上)。<code>innodb_buffer_pool_size</code>の25~100%ぐらい。</p> kawai_mizugorou tag:crieit.net,2005:PublicArticle/17975 2022-02-04T22:26:58+09:00 2022-08-07T01:46:25+09:00 https://crieit.net/posts/Linux-messages [Linux] messagesログの日付指定参照 <p>Linuxにおける「/var/log/messages」ファイルのフォーマットは以下のように「日 時 ホスト名 情報」となっている。</p> <pre><code>Feb 16 18:00:10 web sshd[13865]: Accepted publickey for user01 from 192.168.0.2 port 45680 ssh2 </code></pre> <p>問題なのが1桁の日にちの場合以下のように「月(スペース)(スペース)日にち」の表現になっている点だ。</p> <pre><code>Feb 4 21:25:22 ホスト名 情報 </code></pre> <p>「04」ならともかく「(スペース)4」と表現されることにより、<br /> bashスクリプト等で実行日に絞り込みたい場合、以下のコマンドだと絞り込みができない。</p> <pre><code>$ LANG=C date "+%b %d" Feb 04 </code></pre> <hr /> <p>以下のコマンドだと、1桁の日にちも2桁の日にちも処理できる。</p> <pre><code>$ LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//" </code></pre> <p><code>LANG=C date</code>「 Fri Feb 4 22:10:50 JST 2022」のような日付を取得<br /> <code>cut -d " " -f 2-4</code> 「Feb 4 」に絞り込み、ただし、2桁日にちの場合時刻まで取れてしまう。<br /> <code>sed -e "s/ ..:.*$//"</code> 2桁日にちの場合の時刻除去</p> <p>1桁日にちのコマンド実行例</p> <pre><code>$ LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//" Feb 4 </code></pre> <p>2桁日にちのコマンド実行例</p> <pre><code>LANG=C date --date '5 day ago' | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//" Jan 30 </code></pre> <p><strong>注意として変数に入れて使用する場合、変数をダブルクォート(")で囲む必要がありそうだ。<br /> そうしないとスペースの2個が1個で処理してしまう可能性がある。</strong></p> <pre><code>$ LOGDATE=`LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//"` $ echo $LOGDATE Feb 4 echo "$LOGDATE" Feb 4 $ </code></pre> <hr /> <p>ワンライナーでの実行例 (先頭.は表現回避用)</p> <pre><code>.# cat /var/log/messages | grep "`LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//"`" Feb 4 10:0:01 ホスト名 情報 Feb 4 10:0:01 ホスト名 情報 </code></pre> <p>変数定義後の事項例 (先頭.は表現回避用)</p> <pre><code>.# LOGDATE=`LANG=C date | cut -d " " -f 2-4 | sed -e "s/ ..:.*$//"` .# cat /var/log/messages | grep "${LOGDATE}" Feb 4 10:0:01 ホスト名 情報 Feb 4 10:0:01 ホスト名 情報 </code></pre> dsta50 tag:crieit.net,2005:PublicArticle/17916 2022-01-03T23:53:56+09:00 2022-05-05T23:33:42+09:00 https://crieit.net/posts/Linux-ssh [Linux] ssh鍵の自動生成 <p>Linuxの1ユーザの複数サーバ分のssh鍵の自動生成</p> <p>コードブロックに行番号を付加できないかは模索中</p> <p>ファイル名;create_key.sh</p> <pre><code>#!/bin/bash # values KEYSIZE=2048 # script dir DIR_BASE=$(cd $(dirname ${0}); pwd) if [ $# = 0 ] ; then echo -e "Error: No arguments set" echo -e "Usage: $0 [user name] [server01:server02:...]" exit 10 fi USER=$1 SERVERS=`echo $2 | sed -e 's/:/ /g'` USERDIR=${DIR_BASE}/${USER} test ! -d ${USERDIR} && mkdir ${USERDIR} for server in ${SERVERS} do test ! -d ${USERDIR}/${server} && mkdir ${USERDIR}/${server} passphrase=`cat /dev/urandom | tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!' | fold -w 8 | head -n 300 | grep -v '^[#?_!]' | grep '[#?_!]' | grep [0-9] | grep -vE '(.)\1' | shuf -n 1` keyfile=${USERDIR}/${server}/${USER} ssh-keygen -f ${keyfile} -t rsa -b ${KEYSIZE} -N ${passphrase} if [ $? = 0 ] ; then echo -e "User: ${USER} ,Server: ${server}, Passphrase: [${passphrase}]" echo -e "## ${server}\nUser:\n${USER}\n\nPassphrase:\n${passphrase}" > ${server}_${USERDIR}/SSHinfo_${USER}.txt else echo -e "Couldn't make the key. -User: ${USER} ,Server: ${server}" fi done </code></pre> <p>実行例</p> <pre><code>$ ./create_key.sh user01 web:mail </code></pre> <p><code>引数1</code> ユーザ名<br /> <code>引数2</code> サーバ名、複数の場合はサーバ名を: (コロン)で区切る</p> <p>説明<br /> 1. スクリプトファイルと同じディレクトリ階層に作成したい ユーザ名のディレクトリを作成する (実行例:user01)<br /> 2. サーバごと以下2-1から2-4を繰り返す<br /> 2-1.1番で作1番で作成したユーザディレクトリ配下にサーバ名のディレクトリを作成する (実行例:web)<br /> 2-2.パスフレーズをランダムの文字列で生成<br /> 2-3.2-2番で生成したパスフレーズをもとに、2-1番で作成したサーバ名のディレクトリに鍵のペアを作成<br /> 2-4.1番で作成したユーザ名のディレクトリにサーバ名、ユーザ名、パスフレーズを記載したファイルを作成</p> <p>2-4で作成したファイル名はSSHinfo_サーバ名_ユーザ名.txt<br /> 例 web_SSHinfo_user01.txt</p> <pre><code>## web User: user01 Passphrase: U4#DvXnH </code></pre> <p>エラー処理を最小限にしているため、予期せぬ事態に対処できてないかも</p> <p>課題 (後日記載)<br /> 複数ユーザに対応するため、引数にリストファイルを指定することで、複数ユーザの指定サーバごとに鍵を作成する</p> <p>memo<br /> psslibでのパスワードのハッシュ化</p> <pre><code> passhash=`python3 -c 'import passlib.hash; print(passlib.hash.sha512_crypt.using(rounds=5000).hash("$passphrase"))'` echo -e "password hash is [${passhash}] " echo -e "\npassword hash\n${passhash}" >> ${server}_${USERDIR}/SSHinfo_${USER}.txt </code></pre> dsta50 tag:crieit.net,2005:PublicArticle/17908 2022-01-01T21:51:05+09:00 2022-05-05T23:31:37+09:00 https://crieit.net/posts/Linux-61d04e3986a0e [Linux] ランダム文字列 <p>Linux環境にてパスワードやパスフレーズ等の設定に使うランダム文字列を生成</p> <p>条件:8文字構成で数字、アルファベット小文字、大文字、記号の使用かつ類似文字を除外<br /> 数字 10文字 (0 1 2 3 4 5 6 7 8 9)<br /> 小文字 23文字 (a b c d e f g h i j k m n p r s t u v w y z)、除外 (l o q)<br /> 大文字 14文字 (A B D E F G H J L M N Q R T)、除外 (C I K O S U V W X Y Z)<br /> 記号 4文字 (# ? _ !)</p> <pre><code>cat /dev/urandom | tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!' | fold -w 8 | head -n 300 | grep -v '^[#?_!]' | grep '[#?_!]' | grep [A-Z] | grep [a-z] | grep [0-9] | grep -vE '(.)\1' | uniq | shuf -n 1 </code></pre> <p>省略版 記号と数字のチェックすれば問題なさそう</p> <pre><code>cat /dev/urandom | tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!' | fold -w 8 | head -n 300 | grep -v '^[#?_!]' | grep '[#?_!]' | grep [0-9] | grep -vE '(.)\1' | shuf -n 1 </code></pre> <p><code>cat /dev/urandom</code> ランダムな文字列を生成<br /> <code>tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!'</code> 条件の含めたい文字<br /> <code>fold -w 8</code> 8文字<br /> <code>head -n 300</code> 行頭から300文字<br /> <code>grep -v '^[#?_!]'</code> 先頭記号の文字列を除く<br /> <code>grep '[#?_!]' | grep [A-Z] | grep [a-z]</code> 条件に合致しているか絞り込み<br /> <code>grep -vE '(.)\1'</code> 繰り返し文字を除く<br /> <code>uniq</code> 念のため重複行の取り除き、後のコマンドで含まれているのでいらない<br /> <code>shuf -n 1</code> ランダムの1行を出力</p> <p>実行例</p> <pre><code>$ cat /dev/urandom | tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!' | fold -w 8 | head -n 300 | grep -v '^[#?_!]' | grep '[#?_!]' | grep [0-9] | grep -vE '(.)\1' | shuf -n 1 9eD?8aiG </code></pre> dsta50 tag:crieit.net,2005:PublicArticle/17861 2021-12-17T09:13:56+09:00 2021-12-25T10:12:16+09:00 https://crieit.net/posts/bash-2 bash で標準出力と標準エラーを 2つのコマンドに出し分ける <p>本記事は <a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2021/shellscript">シェルスクリプトのカレンダー | Advent Calendar 2021 - Qiita</a> 17日目の記事だ。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2021/shellscript" target="_blank" rel="noopener">シェルスクリプトのカレンダー | Advent Calendar 2021 - Qiita</a></p> <p>殆どカレンダーが埋まってなかったので、思いついたネタで埋めちゃえ埋めちゃえ。</p> <p>今回は、 bash 系列 (bash, zsh 等) の <a target="_blank" rel="nofollow noopener" href="https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBE">プロセス置換 (process substitution)</a> 機能の話だ。</p> <p>このプロセス置換は POSIX 互換の機能では無いため、以降の例は ash 系列 (busybox hush (ash), dash 等) では利用できない。</p> <h2 id="bash のプロセス置換"><a href="#bash+%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B">bash のプロセス置換</a></h2> <p>bash 系の プロセス置換 という機能と、 tee コマンドを組み合わせて、 同時に複数のコマンドにパイプできるらしい。</p> <p>詳しい説明を読んでも、正直頭がさっぱり追いつかないが…</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/angel_p_57/items/fd1d9a10e2f4aba17669" target="_blank" rel="noopener">Linuxでのプロセス置換 #Linux - Qiita</a></p> <p>要は、 引数部分でファイルを指定するべき場所で、コマンドの標準入出力を代用できる機能ということか。</p> <p>例えば、 "<code>cat <(ls ./a) <(ls ./b)</code>" とすれば、 "<code>ls ./a</code>" の内容と "<code>ls ./b</code>" の内容が連結されて出力されるし、<br /> "<code>command0 | tee >(command1) | command2</code>" とすれば、 command0 の標準出力が、 command1 の標準入力と、 command2 の標準入力両方に渡される。<br /> また、「ファイルの読み書きの代替」となるため、 "<code>command0 2> >(command1)</code>" のようにリダイレクト先のファイル名の替わりにプロセス置換を使えば、標準エラー<strong>だけ</strong>を command1 の標準入力に渡すことができる。</p> <p>ちょっとその尖った使い所を考えてみる。</p> <hr /> <p>例えばこんな、標準出力と標準エラーを吐き出すスクリプトがあったとしよう。</p> <pre><code class="bash">$ cat <<'EOF' > ./testecho.sh #!/bin/bash echo "stdout1" >&1 echo "stderr1" >&2 echo "stdout2" >&1 echo "stderr2" >&2 EOF $ chmod u+x ./testecho.sh </code></pre> <p>このスクリプトを実行し、 標準エラーだけ command2 に渡して、 標準出力は command1 に渡したい場合、 プロセス置換を使うと以下のようにできる。</p> <pre><code class="bash">$ ./testecho.sh 2> >(command2) | command1 # -&gt; 各コマンドの入力 # command1: # stdout1 # stdout2 # command2: # stderr1 # stderr2 </code></pre> <p>ここで更に、 標準出力と標準エラーの両方を command2 に渡して、 標準出力だけを command1 に渡したい場合、 ちょっと複雑になるが以下のようにして実現できる。</p> <pre><code class="bash">$ ./testecho.sh 2>&1 > >(tee >(command1)) | command2 # -&gt; 各コマンドの入力 # command1: # stdout1 # stdout2 # command2: # stdout1 # stderr1 # stderr2 # stdout2 </code></pre> <p>少し複雑なので分解して考えてみよう。</p> <p><a href="https://crieit.now.sh/upload_images/351d9041acf3d7f89470b18a3548b83961bb919f06ca5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/351d9041acf3d7f89470b18a3548b83961bb919f06ca5.png?mw=700" alt="bash_tee_stdout_and_err-00.png" /></a></p> <ol> <li>まずは <code>testecho.sh</code> のリダイレクト部分 (赤枠) を考える。 <ol> <li>リダイレクトを複数並べる場合は左から評価されるが、後ろに書いたリダイレクトで上書きされるような動きをするので、右から順番にリダイレクトされると考えるとわかりやすい。 <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><br /> このため、まずは (黄色下線部) の部分を見てみよう。<br /> この部分は、標準出力をファイルにリダイレクトしているだけ (つまり、只の "<code>> ファイルパス</code>") の表記だ。<br /> ただ、ファイルパスの代わりにプロセス置換 ("<code>>(cmd_list)</code>") が使われており、 標準出力が <code>tee</code> の標準入力へ書き込まれている。 <ol> <li>さらに、 <code>tee</code> のファイル出力もまた、プロセス置換を使って <code>command1</code> の標準入力に渡される。<br /> <strong>結果的に、 <code>testecho.sh</code> の標準出力だけが、 <code>command1</code> の標準入力に渡されることになる。</strong></li> <li>次に、 <code>tee</code> の標準出力のほう、 これは <code>./testecho.sh</code> を実行した標準出力に戻ってくる。</li> </ol></li> <li>さて、 <code>testecho.sh</code> のリダイレクトに話を戻すと、 その次のリダイレクト (水色下線部) の "<code>2>&1</code>" によって、 <code>tee</code> の標準出力と <code>./testecho.sh</code> の標準エラーが、標準出力側に統合される。</li> </ol></li> <li>最後に、 その統合された標準出力が、 パイプで <code>command2</code> に渡される。<br /> <strong>結果的に、 <code>testecho.sh</code> の標準出力と標準エラーの両方が、 <code>command2</code> の標準入力に渡されることになる。</strong></li> </ol> <p>ちなみに、 ./testecho.sh の標準出力と標準エラーの出力速度が早いと、上記の出力例のように command2 に渡される標準出力と標準エラーが順不同になってしまう。</p> <p>なお、以下のようにやっても同じ結果になるはずだ。</p> <pre><code class="bash">$ ./testecho.sh > >(command2) 2>&1 > >(tee >(command1)) </code></pre> <hr /> <h2 id="実用例"><a href="#%E5%AE%9F%E7%94%A8%E4%BE%8B">実用例</a></h2> <p>例えば、以下のようにすると、 コマンドの標準出力だけメールを出しつつ、メールの内容と 標準エラーの両方を journal に書き込む事ができる。</p> <pre><code>./testecho.sh 2>&1 > >(tee >(/usr/sbin/sendmail [email protected])) | /usr/bin/systemd-cat </code></pre> <p>ただ、どうせ journal に記録するなら、 <code>-t</code> オプションを使って、以下の 3 つを識別子で分けて記録したほうが良いかもしれない。</p> <ul> <li>./testecho.sh の標準エラー</li> <li>./testecho.sh の標準出力</li> <li>sendmail の標準出力&エラー</li> </ul> <pre><code>./testecho.sh 2> >(/usr/bin/systemd-cat -t cmderr) > >(tee >(/usr/bin/systemd-cat -t mailout /usr/sbin/sendmail -v [email protected]) | /usr/bin/systemd-cat -t cmdout) </code></pre> <p>うーん、 <strong>ここまで来ると初見で動作を理解できる気がしない。</strong></p> <p><strong>参考:</strong></p> <ul> <li>https://tellme.tokyo/post/2020/02/07/tee-command/</li> <li>https://www.greptips.com/posts/189/</li> </ul> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:1" role="doc-endnote"> <p>記事の初稿でリダイレクトの参照順の説明が誤っていたので訂正。ただ、詳しい仕組みは難しくて説明しきれないのでググって。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> advanceboy tag:crieit.net,2005:PublicArticle/17814 2021-12-04T00:20:20+09:00 2021-12-04T00:20:20+09:00 https://crieit.net/posts/sed-0 置換ができない/複数ある場合に sed の終了コード0以外にする <p>本記事は、 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2021/shellscript">シェルスクリプト Advent Calendar 2021</a> の 4日目 の記事だ。<br /> そして、 <strong>且つ</strong> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2021/docker">docker Advent Calendar 2021</a> 4日目 の記事でもある。</p> <p>どちらのカレンダーもまだまだスッカスカなので、禁じ手で埋めにかかってしまった。</p> <hr /> <p><a target="_blank" rel="nofollow noopener" href="https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/official_images/">Docker 公式イメージ</a> などをベースにして、カスタムしてイメージをビルドして使おうとした際、 なるべくなら <code>/etc/apt/apt.conf.d/</code> 等のように、設定用の<strong>ファイルを追加</strong>して、ツール側がいい感じにマージして利用してくれるのが望ましい。<br /> しかし、 場合によってはやむを得ず、既存のファイルを <code>sed</code> コマンドなどで編集せざるを得ないこともあるだろう。</p> <p>カスタムイメージの Dockerfile をビルドする際に、当初は意図通り書き換えられていても、イメージが更新された結果、イメージのリビルド時にファイルの書き換えが意図しない結果となってしまう場合がある。 <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p> <p>通常、 <code>sed</code> コマンドは、置換が発生してもしなくても、 終了コード 0 で終了する。<br /> このため、書き換えの成否にかかわらず、 docker build 時にエラーにならないため、コンテナ実行時に初めて置換が意図しない結果だったことに気づくことがある。</p> <p>そこで、<strong><code>sed</code> コマンドの書き換えで適切なパターンが見つからなかった</strong>場合に 0以外の終了コードを返し、<strong>ビルド時にエラー</strong>とする方法を考える。</p> <p>以下、 <code>sed</code> は GNU sed を前提とし、 "行頭の foo" を BARfooBAR に置き換える場合の例。</p> <h2 id="ひとつもヒットしなかったら終了コード16 のエラー"><a href="#%E3%81%B2%E3%81%A8%E3%81%A4%E3%82%82%E3%83%92%E3%83%83%E3%83%88%E3%81%97%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%89%E7%B5%82%E4%BA%86%E3%82%B3%E3%83%BC%E3%83%8916+%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC">ひとつもヒットしなかったら終了コード16 のエラー</a></h2> <p>まずは、 書き換えるパターンが見つからなかった場合に、エラーコードを返す方法。</p> <pre><code class="bash">sed -e '/^foo/{s//BAR\0BAR/;h};$!b;p;x;/./Q;Q16' </code></pre> <p>参考: https://stackoverflow.com/a/15966279</p> <p>ざっとコマンドの流れを解説すると、以下のようになる。</p> <ol> <li>まず、 <a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#Regexp-Addresses">正規表現アドレス</a> で置換する行を選択する。</li> <li>ブロック <code>{}</code> を用いて、正規表現に一致する行について以下を実行する。 <ol> <li><a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#The-_0022s_0022-Command">s コマンド</a> で、<a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#regexp-extensions">後方参照</a>を使って FOObarBAR に置換する。<br /> <a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#Regexp-Addresses">空の正規表現 '//'は最後の正規表現のマッチを繰り返</a>すので、正規表現アドレスでマッチした "行頭の foo" が置き換えられる。</li> <li><a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#sed-commands-list">h コマンド</a> で、パターンスペース の内容をホールドスペース (sed 内のクリップボードみたいなもの) にコピーする。</li> </ol></li> <li><code>$!b</code> の部分は、最終行でなければ次のサイクルに移動する。 すなわち、以降のコマンドは<strong>最終行でのみ実行</strong>される。</li> <li><a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#The-_0022s_0022-Command">p コマンド</a> でパターンスペースの内容を出力にプリントする。</li> <li><a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#sed-commands-list">x コマンド</a> でパターンスペースの内容とホールドスペースをスワップする。<br /> <strong>パターンスペースの内容は結果的に</strong> 、1度でも最初の正規表現がヒットすればその文字列に、 最後まで一度も正規表現がヒットしなければ空っぽになる。</li> <li>最後、パターンスペースの内容が空でない (即ち、1度以上正規表現がヒットした) なら、 終了コード 0 で終了し、 そうでなければ 16 で終了する。</li> </ol> <h2 id="ヒットしなければ終了コード16, 2つ以上ヒットしたら終了コード32 のエラー"><a href="#%E3%83%92%E3%83%83%E3%83%88%E3%81%97%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E7%B5%82%E4%BA%86%E3%82%B3%E3%83%BC%E3%83%8916%2C+2%E3%81%A4%E4%BB%A5%E4%B8%8A%E3%83%92%E3%83%83%E3%83%88%E3%81%97%E3%81%9F%E3%82%89%E7%B5%82%E4%BA%86%E3%82%B3%E3%83%BC%E3%83%8932+%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC">ヒットしなければ終了コード16, 2つ以上ヒットしたら終了コード32 のエラー</a></h2> <p>さらに一歩踏み込んで、 書き換えるパターンが見つからない場合と、 2つ以上見つかってしまった場合<strong>両方</strong>で、エラーにする方法。</p> <pre><code class="bash">sed -e '/^foo/{s//BAR\0BAR/;x;/./Q32;g};$!b;p;x;/./Q;Q16' </code></pre> <p>基本的な動きは、ひとつもヒットしなかったパターンと同じだ。<br /> ただ、ブロック <code>{}</code> 内部のコマンドを以下のように変更して、複数ヒットした場合にエラーで終了している。</p> <ol> <li>まず、 正規表現アドレス で置換する行を選択する。</li> <li>ブロック <code>{}</code> を用いて、正規表現に一致する行について以下を実行する。 <ol> <li>s コマンド で、後方参照を使って FOObarBAR に置換する。</li> <li><a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#sed-commands-list">x コマンド</a> でパターンスペースの内容とホールドスペースをスワップする。<br /> <strong>パターンスペースの内容は結果的に</strong> 、以前の行でも正規表現がヒットすればその文字列に、 最後まで一度も正規表現がヒットしなければ空っぽになる。</li> <li>パターンスペースの内容が空でない (即ち、正規表現のヒットが2回目) なら、 終了コード 32 で<strong>エラー終了</strong>し、 そうでなければそのまま次へ。</li> <li><a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#sed-commands-list">g コマンド</a> でホールドスペースの内容をパターンスペースにコピーして戻す</li> </ol></li> <li>以降は「ひとつもヒットしなかったら…」と同じ</li> </ol> <p>なお、このコマンドは、 2つヒットした時点で出力が止まる。</p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>モダンなプログラミング言語が軒並み型推論でコンパイル時にエラーとするように、 Dockerfile もビルド時にエラーにしてしまおう。</p> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:1" role="doc-endnote"> <p>カスタムイメージの Dockerfile ベースイメージを選択する際、基本的にはタグである程度絞っておくべきだが、それはさておき。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> advanceboy tag:crieit.net,2005:PublicArticle/17813 2021-12-04T00:00:04+09:00 2021-12-04T00:00:04+09:00 https://crieit.net/posts/sed-i-r-e-unmatched sed の ブロック {} 内で i, r, e コマンドを使うと "unmatched `{'" とエラーになる <p>本記事は、 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2021/shellscript">シェルスクリプト Advent Calendar 2021</a> の 3日目 の記事だ。<br /> 3日目が終わりそうになっても誰も書きそうにないので、最近 <code>sed</code> コマンドで ブロック <code>{}</code> を使っていたら、 "unmatched `{" というエラーにハマったので、そのメモ。</p> <hr /> <p><code>target.txt</code>:</p> <pre><code class="plain">foo bar foo bar foo </code></pre> <p><code>insert.txt</code>:</p> <pre><code class="plain">*** </code></pre> <p>上記のような、2つのファイルがあったとする。</p> <p><code>target.txt</code> ファイルに対して、 <a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#Regexp-Addresses">正規表現アドレス</a> で <code>bar</code> から始まる行を選択し、 その後ろに <a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#sed-commands-list">r コマンド</a> <code>insert.txt</code> のファイルの中身を挿入する。</p> <p>するとこんな結果になる。</p> <pre><code>$ sed -e '/^bar/rinsert.txt' target.txt foo bar *** foo bar *** foo </code></pre> <p>では、アドレス指定の後ろにブロック <code>{}</code> を追加し、以下のように bar が2回以上ヒットしたらエラーコード出して終了するようにしてみる。</p> <pre><code>$ sed -e '/^bar/{rinsert.txt;x;/./Q129;g}' target.txt sed: -e expression #1, char 0: unmatched `{' $ echo $? 1 </code></pre> <p>はい、別のエラーで失敗した。<br /> ちゃんと <code>{</code> と <code>}</code> の数はマッチしているのに……</p> <p>これは、 i, r, e などのコマンドは、 コマンドの終了区切りに改行が必須となっていて、 セミコロン (<code>;</code>) などで区切ろうとしても、 その文字もコマンドのオプションとして渡されてしまうためだ。 <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p> <p>これを回避する場合は、 コマンドの後ろに改行を入れるか、 -e を使ってコマンド区切る必要がある。</p> <pre><code>$ sed -e '/^bar/{rinsert.txt' -e 'x;/./Q129;g}' target.txt foo *** bar foo *** $ echo $? 129 </code></pre> <pre><code>$ sed -e '/^bar/{rinsert.txt' -e 'x;/./Q129;g}' <<EOF > foo > bar > foo > foo > EOF foo bar *** foo foo $ echo $? 0 </code></pre> <p>様々な区切り文字でつかわれるので忘れがちだけど、セミコロンをファイル名にすることだって、できるもんな。<br /> そう考えれば納得。</p> <p>ちなみに、同様の振る舞いをするコマンド ("Commands Requiring a newline") は、以下の通り。</p> <ul> <li><code>a,c,i (append/change/insert)</code></li> <li><code># (comment)</code></li> <li><code>r,R,w,W (reading and writing files)</code></li> <li><code>e (command execution)</code></li> <li><code>s///[we] (substitute with e or w flags)</code></li> </ul> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:1" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://superuser.com/questions/456246/sed-weirdness-unmatched">command line - sed weirdness, unmatched { - Super User</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.gnu.org/software/sed/manual/sed.html#Commands-Requiring-a-newline">sed, a stream editor #3.8.1 Commands Requiring a newline - GNU sed online manual</a><br /> <a target="_blank" rel="nofollow noopener" href="https://kuma35.github.io/sed47doc-jp/sed.html#Commands-Requiring-a-newline">ストリームエディタ sed #3.8.1 sedコマンドに改行が必要な時 - GNU sed オンラインマニュアル</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> advanceboy tag:crieit.net,2005:PublicArticle/17726 2021-10-28T00:38:36+09:00 2022-12-01T02:35:10+09:00 https://crieit.net/posts/Port Port関連 <h1 id="開いているPort確認"><a href="#%E9%96%8B%E3%81%84%E3%81%A6%E3%81%84%E3%82%8BPort%E7%A2%BA%E8%AA%8D">開いているPort確認</a></h1> <h2 id="自分自身を確認"><a href="#%E8%87%AA%E5%88%86%E8%87%AA%E8%BA%AB%E3%82%92%E7%A2%BA%E8%AA%8D">自分自身を確認</a></h2> <p>netstatuコマンドで、開いているTCP/UDPポートを表示する。</p> <pre><code>$# netstat -lut Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp6 0 0 [::]:mysql [::]:* LISTEN tcp6 0 0 [::]:http [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN udp 0 0 localhost:323 0.0.0.0:* udp6 0 0 localhost:323 [::]:* </code></pre> <p>netstatコマンドでもよいが、CentOS7からはssコマンドが推奨されているらしい(一次情報にはあたっていない)。<br /> ssコマンドでも実施する。sshやapacheと書かれており、具体的に何番ポートかわからない場合は「-n」オプションを利用する。</p> <pre><code># ss -ltu|grep -e ssh -e http tcp LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* tcp LISTEN 0 511 *:http *:* tcp LISTEN 0 128 [::]:ssh [::]:* # ss -ltun # ss -ltun|grep -e 128 -e 511 tcp LISTEN 0 128 0.0.0.0:111 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 128 [::]:111 [::]:* tcp LISTEN 0 511 *:80 *:* tcp LISTEN 0 128 [::]:22 [::]:* </code></pre> <p>接続待ちをしているポートも含めて表示</p> <pre><code># ss -atu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* udp UNCONN 0 0 [::1]:323 [::]:* tcp LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* tcp LISTEN 0 4096 [::ffff:127.0.0.1]:32768 *:* tcp LISTEN 0 511 *:http *:* tcp LISTEN 0 128 [::]:ssh [::]:* tcp TIME-WAIT 0 0 10.1.2.194:36384 169.254.169.254:http tcp CLOSE-WAIT 32 0 10.1.2.194:53958 140.204.8.149:https tcp ESTAB 0 0 [::ffff:127.0.0.1]:32768 [::ffff:127.0.0.1]:49598 </code></pre> <p>接続確立してるポート確認</p> <pre><code>>ss -t </code></pre> <p>netstat/ssコマンドのオプション</p> <p>| TH | TH |<br /> | オプション | 説明 |<br /> | -a | すべて表示(接続待ちも) |<br /> |-l|Listenしているポートのみ表示|<br /> |-t|TCPを表示|<br /> |-u|UDPを表示|<br /> |-n|ポートやホストを数値で表示|<br /> |-p|ポートを開いているプロセスを表示|</p> <p>PIDやFDも含めて、特定のポートの状況を確認する場合</p> <pre><code># lsof -i:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 297221 mysql 24u IPv6 915253 0t0 TCP *:mysql (LISTEN) </code></pre> <h2 id="外部からポートを確認"><a href="#%E5%A4%96%E9%83%A8%E3%81%8B%E3%82%89%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E7%A2%BA%E8%AA%8D">外部からポートを確認</a></h2> <p>外部からどのポートが開いているか確認.</p> <pre><code class="Linux">> yum install nmap > nmap [IPアドレス] </code></pre> <p>自分自身をスキャンする時は</p> <pre><code>> nmap localhost PORT STATE SERVICE 22/tcp open ssh > > > nmap -p 1-1000 localhost PORT STATE SERVICE 22/tcp open ssh > > >nmap -p 3128 localhost PORT STATE SERVICE 3128/tcp closed squid-http </code></pre> <h2 id="サービスのPort番号確認"><a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AEPort%E7%95%AA%E5%8F%B7%E7%A2%BA%E8%AA%8D">サービスのPort番号確認</a></h2> <pre><code># view /etc/services </code></pre> <h1 id="Port指定疎通確認"><a href="#Port%E6%8C%87%E5%AE%9A%E7%96%8E%E9%80%9A%E7%A2%BA%E8%AA%8D">Port指定疎通確認</a></h1> <p>まずは適当なPortをListenさせる</p> <pre><code># nc -l 12345 </code></pre> <h2 id="Windowsの場合"><a href="#Windows%E3%81%AE%E5%A0%B4%E5%90%88">Windowsの場合</a></h2> <pre><code>>Test-NetConnection IPアドレス  -Port Port番号 </code></pre> <h2 id="Linuxの場合"><a href="#Linux%E3%81%AE%E5%A0%B4%E5%90%88">Linuxの場合</a></h2> <pre><code>> nc -vz localhost 12345 </code></pre> <h2 id="Curl"><a href="#Curl">Curl</a></h2> <pre><code>$ curl google.com $ curl -v telnet://10.1.2.194:22 * Rebuilt URL to: telnet://10.1.2.194:22/ * Trying 10.1.2.194... * TCP_NODELAY set * Connected to 10.1.2.194 (10.1.2.194) port 22 (#0) SSH-2.0-OpenSSH_8.0 </code></pre> kawai_mizugorou tag:crieit.net,2005:PublicArticle/17404 2021-06-15T00:24:38+09:00 2021-06-15T00:26:03+09:00 https://crieit.net/posts/var 大事なサーバの/varを消した話。悪夢の無限列車編👹 <p>お久しぶりです!<br /> ここの所、立て込んでいたり(表題の件で)、メンタルやられ気味だったり(表題の件で)で余裕がなかった私です。</p> <p>あれほど講師の方に、「<strong>rmを使うときは気を付けよう</strong>」と言われていたのに…</p> <hr /> <h4 id="v目次にゃv"><a href="#v%E7%9B%AE%E6%AC%A1%E3%81%AB%E3%82%83v">v目次にゃv</a></h4> <p>1.どんなサーバなのか<br /> 2.CentOSの/varを消したお話ー悪夢の始まり無限列車編<br /> 3.CentOSの/varを消したお話ー血鬼術の落とし穴編<br /> 4.消した後ーお前ももうおやすみ・・・<br /> 5.起こったこと<br /> 6.復旧作業<br /> 7.結末<br /> 8.考えられる復元法<br /> 9.回避の呼吸!型集</p> <hr /> <h4 id="どんなサーバなのか"><a href="#%E3%81%A9%E3%82%93%E3%81%AA%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AA%E3%81%AE%E3%81%8B">どんなサーバなのか</a></h4> <p>私はゲーム制作サークルのサーバ担当(仮?)をしてますねこー。<br /> ざっくり挙げると<br /> ・ホームページ<br /> ・工程、プロジェクト管理ソフトの管理<br /> ・Gitサーバ<br /> を管理をしているきんぎょ。<br /> 昔はメールサーバもやっていたけど色々考えて、Google Workspaceと兼用させてるぎょぴ。</p> <p>ちなみに、VPSでCentOS7をつかっていますきんぎょ。<br /> <strong>これは消してはいけない。障害を起こしてはダメなやつだ()</strong></p> <hr /> <h4 id="CentOSの/varを消したお話ー悪夢の始まり無限列車編"><a href="#CentOS%E3%81%AE%2Fvar%E3%82%92%E6%B6%88%E3%81%97%E3%81%9F%E3%81%8A%E8%A9%B1%E3%83%BC%E6%82%AA%E5%A4%A2%E3%81%AE%E5%A7%8B%E3%81%BE%E3%82%8A%E7%84%A1%E9%99%90%E5%88%97%E8%BB%8A%E7%B7%A8">CentOSの/varを消したお話ー悪夢の始まり無限列車編</a></h4> <p>今回、新しいシステムの導入にあたって、色々入れたり、消したりをしていたねこ~。<br /> とある理由から<br /> /var/hogehoge/nekoneko/<br /> /var/hogehoge/kitune/<br /> /var/piyopiyo/fugafuga/<br /> のkingyo.poi を×10個くらい(仮称)を消す必要があったにゃ。<br /> そこで下記のコマンドを実行し、対象ファイルを削除していきました。</p> <pre><code>rm -rf /var/hogehoge/#抹消対象# </code></pre> <p><strong>そう。これが悪夢の始まりだったのにゃー…</strong></p> <hr /> <h4 id="CentOSの/varを消したお話ー血鬼術の落とし穴編"><a href="#CentOS%E3%81%AE%2Fvar%E3%82%92%E6%B6%88%E3%81%97%E3%81%9F%E3%81%8A%E8%A9%B1%E3%83%BC%E8%A1%80%E9%AC%BC%E8%A1%93%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4%E7%B7%A8">CentOSの/varを消したお話ー血鬼術の落とし穴編</a></h4> <p>先ほど紹介した<strong><em>rm -rf /var/hogehoge/#抹消対象#</em></strong> の血鬼術ですが、重大な"<strong>欠陥</strong>"がある鬼~。<br /> そう、"<strong>血</strong>"鬼術だけに…(欠陥と血管をかけた)</p> <p>基本的にLinuxにはWindowsでいう<strong>ゴミ箱</strong>が存在しないきんぎょ。<br /> つまり、消したものは、ほぼ<strong>二度と元には戻りません</strong>。</p> <h5 id="今回の落とし穴(後悔ポイント)"><a href="#%E4%BB%8A%E5%9B%9E%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4%EF%BC%88%E5%BE%8C%E6%82%94%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%EF%BC%89">今回の落とし穴(後悔ポイント)</a></h5> <p><strong>・cdで/varに移動して作業していれば消えるフォルダは最小で済んだ<br /> ・脳死でポチポチやっていた<br /> ・脳死のためエンターキーとTabキーを間違えた</strong></p> <p>抹殺対象を消すために、1つ1つ手打ちで打っていたわけです。正規表現しようにも、ダブりで消せないファイルもあるので…<br /> 数もそれなりにあるので、脳死状態でポチポチ術を発動していきます。Tab変換を活用して…</p> <p><strong>rm -rf /var エンターキーポチッ!</strong>\(^o^)/アッオワッタ<br /> 実行した瞬間、理解できず、思考がグルグル走馬灯。一瞬が5分くらいに長く感じ、冷や汗が全身をつたいました。</p> <hr /> <h4 id="消した後ーお前ももうおやすみ・・・"><a href="#%E6%B6%88%E3%81%97%E3%81%9F%E5%BE%8C%E3%83%BC%E3%81%8A%E5%89%8D%E3%82%82%E3%82%82%E3%81%86%E3%81%8A%E3%82%84%E3%81%99%E3%81%BF%E3%83%BB%E3%83%BB%E3%83%BB">消した後ーお前ももうおやすみ・・・</a></h4> <p>/varを消した直後、<br /> ”今動いているシステムは消せないよ”とのメッセージが。<br /> lsで確認すると<strong>tmp以外消えている!!!!!!!!!</strong><br /> 【VirtualBoxで再現した写真↓もちろん今回はバックアップをとってある】<br /> <a href="https://crieit.now.sh/upload_images/c8e3813e38831a16492d64162853d8f060c75922bdfa5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c8e3813e38831a16492d64162853d8f060c75922bdfa5.png?mw=700" alt="image.png" /></a>!</p> <hr /> <h4 id="起こったこと"><a href="#%E8%B5%B7%E3%81%93%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">起こったこと</a></h4> <p>・/varに配置しているものは<strong>全て消失</strong>しました。<br /> →ホームページの消失<br /> →行程、プロジェクト管理のデータ消失(Webで動作するもののため)<br /> →プロジェクト管理のデータベース消失<br /> ・yumが死んだ。(rpmもだめ)<br /> ・firewallが起動できない(iptablesはギリ生きていたっぽい?)<br /> ・SSHアクセスが弾かれる<br /> ・私は内心大泣き<br /> ・私、汗だく</p> <p>・gitも死んだと思っていたら、/var以外の場所で管理していたのでセーフ(本当に良かった。)<br /> ・wgetやcurlは使用可能</p> <hr /> <h4 id="復旧作業"><a href="#%E5%BE%A9%E6%97%A7%E4%BD%9C%E6%A5%AD">復旧作業</a></h4> <p>どうやら<strong>extundeleteコマンド</strong>で復旧可能らしい!<br /> 標準では入っていないので、<strong>yum install extundeleteで導入</strong>します!<br /> <strong>_人人人人人人人人人人人_<br /> > yumが使えない!! <<br />  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄</strong><br /> はい。終わりました。<br /> どうやら<strong>yumにかかわるデータが/var以下</strong>にあったようで、<strong>正常に動作しなくなりました</strong>。</p> <p>他にデータ復元方法はいくつかあり、試しましたが全部だめでした。<br /> 他のcentから消えたデータを移植したり、リカバリーモードを起動したり、OSの書き換えを試みたり…</p> <hr /> <h4 id="結末"><a href="#%E7%B5%90%E6%9C%AB">結末</a></h4> <p>結局、新しくサーバを立て、生きているデータを故サーバからサルベージ。移行する手段を取りました。<br /> VPSという特性上いろいろ気を遣う作業が多かったです。(今回ばかりはハードを直で触れる自宅サーバを羨みました。)</p> <hr /> <h4 id="考えられる復元法"><a href="#%E8%80%83%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E5%BE%A9%E5%85%83%E6%B3%95">考えられる復元法</a></h4> <p>私の知識、経験不足ゆえに、実現しませんでしたが、この状況でも復活できる可能性はありました。<br /> ・wgetやcurlを使って修復系パッケージの導入<br /> ・健全なサーバより消滅したデータを移行。権限や依存関係も手動で設定<br /> ・パーティションやプロセスから復元<br /> いずれも果てしない労力と戦場で培うべき経験、正しい知識が必要なためペーペーの私は力尽きました…</p> <hr /> <h4 id="回避の呼吸!型集"><a href="#%E5%9B%9E%E9%81%BF%E3%81%AE%E5%91%BC%E5%90%B8%EF%BC%81%E5%9E%8B%E9%9B%86">回避の呼吸!型集</a></h4> <p><strong>今から大事なことを書きます!</strong><br /> <strong>・rmコマンドの扱い</strong><br /> まずはrmコマンドを使うときは慎重に行きましょう。絶対です。<br /> 特に-rf オプションを使うときは<strong>要注意</strong>です。なんでも消せちゃいます。イレイザーヘッドです💦<br /> <strong>・バックアップを取っておく</strong><br /> 何事も作業前にバックアップを取っておきましょう。VirtualBoxならスナップショット。VPSならイメージOSの保存とかね。<br /> <strong>・extundelete等の復元ツールは予め入れておく</strong><br /> ことが起きてからでは遅いです。今回みたくyumひいてはOSそのものがダウンして緊急時には何が使えなくなるか分かりません。前もって対策しておきましょう。<br /> <strong>・実験環境を用意、活用する</strong><br /> 普通なら本番と全く同じ実験環境(兼バックアップ)を利用すべきです。コストがかかるのは仕方ないですが、<strong>データ復旧費や今までの労力が水の泡になるよりは安い</strong>です!<br /> サークル活動でのリアルな実験環境費用捻出は難しいですが…<br /> 本当に業務上じゃなくてよかった…<br /> <strong>・ある程度子ディレクトリに入って作業をする</strong><br /> 今回は絶対パスで/varと打っていたのも原因の1つです。<br /> 仮にvarにい状態で作業していれば<strong>varそのものが消えるという事態は避けられていました</strong>。</p> <hr /> <h4 id="エンドタイトル"><a href="#%E3%82%A8%E3%83%B3%E3%83%89%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB">エンドタイトル</a></h4> <p>ということで悪夢の無限列車編を締めくくりたいと思います。<br /> <strong>何かあってからでの対策では遅い</strong>ということを痛感しました。<br /> 色々やばすぎて、語尾を忘れるくらいですからきんぎょ。<br /> 本当に業務での失態でなくてよかったです…おそらく私じゃ払いきれない額の損害でしょうから(震え)<br /> さらに辛かったのが「<strong>var消しちゃった</strong>💦」で検索しても<strong>ヒットしなかった</strong>ことです。varを消す馬鹿野郎は私くらいということですかね~(すっとぼけ)</p> <p>今回はここまで🐾<br /> みなさん、私の屍を超えていけ!!!!</p> keito_woood tag:crieit.net,2005:PublicArticle/17351 2021-06-02T11:50:27+09:00 2021-06-02T11:51:03+09:00 https://crieit.net/posts/vim-60b6f1f3465e8 vim 各モード別コマンド集 <h2 id="ノーマルモード"><a href="#%E3%83%8E%E3%83%BC%E3%83%9E%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89">ノーマルモード</a></h2> <h4 id="各モード切替え"><a href="#%E5%90%84%E3%83%A2%E3%83%BC%E3%83%89%E5%88%87%E6%9B%BF%E3%81%88">各モード切替え</a></h4> <ul> <li>「i」 インサートモードに移行</li> <li>「:」 コマンドラインモードに移行</li> <li>「v」 ビジュアルモードに移行</li> <li>「a」 カーソル上の文字の次からテキストを追加するためにインサートモードに移行</li> <li>「A」 行末にテキストを追加するためにインサートモードに移行</li> <li>「o」 カーソルの下の行を開けて、インサートモードに移行</li> <li>「O」 カーソルの上の行を開けて、インサートモードに移行</li> <li>「Esc」 他のモードからノーマルモードに移行</li> </ul> <h4 id="カーソル移動"><a href="#%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E7%A7%BB%E5%8B%95">カーソル移動</a></h4> <ul> <li>「h」 左に移動</li> <li>「j」 下に移動</li> <li>「k」 上に移動</li> <li>「l」 右に移動</li> <li>「番号w」 単語の番号分前に移動</li> <li>「番号e」 単語番号分の終端に移動</li> <li>「[指定する行番号]gg」 指定した行番号にジャンプ</li> <li>「g」 先頭行にジャンプ</li> <li>「G」 最終行にジャンプ</li> </ul> <h4 id="文字列検索"><a href="#%E6%96%87%E5%AD%97%E5%88%97%E6%A4%9C%E7%B4%A2">文字列検索</a></h4> <ul> <li>「/検索したい文字」 検索したい文字を検索する<br /> ※検索したい文字が複数存在する場合は、「n」キーを押すと次の位置へカーソルが移動する</li> </ul> <h4 id="文字及び行の削除"><a href="#%E6%96%87%E5%AD%97%E5%8F%8A%E3%81%B3%E8%A1%8C%E3%81%AE%E5%89%8A%E9%99%A4">文字及び行の削除</a></h4> <ul> <li>「x」 カーソルの位置の文字を1文字削除</li> <li>「dw」 1単語単位で削除</li> <li>「数字dw」 数字分の単語単位を削除</li> <li>「de」 カーソルの位置から空白を含まない単語の末尾まで削除</li> <li>「d$」 カーソルの位置から行末まで削除</li> <li>「dd」 行を丸ごと削除</li> </ul> <h4 id="やり直し&取り消し"><a href="#%E3%82%84%E3%82%8A%E7%9B%B4%E3%81%97%EF%BC%86%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%97">やり直し&取り消し</a></h4> <ul> <li>「u」 直前まで行ったコマンド1つを取り消しする※押した回数分やり直しができる</li> <li>「U」 行全体のコマンドを取り消しする</li> <li>「Ctrl+r」 やり直しの取り消しを行う</li> </ul> <h4 id="置換"><a href="#%E7%BD%AE%E6%8F%9B">置換</a></h4> <ul> <li>「r」 カーソル下の文字を置換</li> <li>「R」 1文字以上の置換</li> <li>「cw」 カーソルの位置から語の終わりまで置換</li> <li>「c$」 行の終わりまで置換</li> </ul> <h4 id="行コピー&ペースト"><a href="#%E8%A1%8C%E3%82%B3%E3%83%94%E3%83%BC%EF%BC%86%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88">行コピー&ペースト</a></h4> <ul> <li>「y」 カーソル上の文字をコピー</li> <li>「yy」 カーソル行の文字全部をコピー</li> <li>「p」 カーソルの下の行へペースト</li> </ul> <h2 id="コマンドラインモード"><a href="#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%A2%E3%83%BC%E3%83%89">コマンドラインモード</a></h2> <h4 id="コマンドラインモード移行はノーマルモードから「:」を入力して移行してコマンドを入力する"><a href="#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%A2%E3%83%BC%E3%83%89%E7%A7%BB%E8%A1%8C%E3%81%AF%E3%83%8E%E3%83%BC%E3%83%9E%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E3%80%8C%3A%E3%80%8D%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%A6%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%A6%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B">コマンドラインモード移行はノーマルモードから「:」を入力して移行してコマンドを入力する</a></h4> <ul> <li>「x」 保存して終了</li> <li>「q!」 保存せずに終了</li> <li>「!dir」、「!ls」 ディレクトリ一覧を見る</li> <li>「!del(ファイル名)」、「!rm(ファイル名)」 ファイルを削除する</li> <li>「w[ファイル名]」 ここではファイル名というファイルがディスクに書き込まれる</li> <li>「r[ファイル名]」 ここではファイル名というファイルがディスクにより取り込まれカーソル下の位置に挿入</li> <li>「r!dir」 dirコマンドの出力をカーソル位置下に読み込む</li> <li>「set nu」 行数の表示</li> <li>「set nonu」 行数の非表示</li> <li>「s/元の単語/新しく置換する単語/g」 カーソルを合わせている文全体の対象を置換</li> <li>「%s/元の単語/新しく置換する単語/g」 全業で対象部分が置換</li> <li>「:help」 ヘルプウィンドウを表示</li> <li>「:herp cmd」 コマンドヘルプを検索</li> <li>「q」 ヘルプウィンドウを閉じる</li> </ul> <h2 id="ビジュアルモード"><a href="#%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89">ビジュアルモード</a></h2> <h4 id="ビジュアルモードはノーマルモードから「v」で移行してコマンドを入力"><a href="#%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AF%E3%83%8E%E3%83%BC%E3%83%9E%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E3%80%8Cv%E3%80%8D%E3%81%A7%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%A6%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%85%A5%E5%8A%9B">ビジュアルモードはノーマルモードから「v」で移行してコマンドを入力</a></h4> <ul> <li>vモーションで「:w[ファイル名]」でビジュアル選択行がファイルに保存される</li> <li>「d」 選択した範囲を削除してノーマルモードに戻る</li> <li>「y」 選択した範囲をコピーしてノーマルモードに戻る</li> <li>「c」 選択した範囲を削除してインサートモードに移行する</li> </ul> ko00w1 tag:crieit.net,2005:PublicArticle/17338 2021-05-31T16:58:23+09:00 2021-05-31T16:58:50+09:00 https://crieit.net/posts/Linux-60b4971fdaacf Linuxでサーバ作る流れがわからなくなったら見るざっくりメモ <h1 id="フロー"><a href="#%E3%83%95%E3%83%AD%E3%83%BC">フロー</a></h1> <h2 id="①yumコマンドを使用してパッケージのインストール"><a href="#%E2%91%A0yum%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">①yumコマンドを使用してパッケージのインストール</a></h2> <p><a href="https://crieit.net/posts/Linux-CentOS7-Web">Webサーバ構築手順、yum使ったインストールのメモあり</a></p> <h2 id="②vimコマンドを使って設定ファイルの編集"><a href="#%E2%91%A1vim%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%B7%A8%E9%9B%86">②vimコマンドを使って設定ファイルの編集</a></h2> <p><a href="https://crieit.net/posts/vim-60b458ff9d660">Vimざっくりまとめた記事</a></p> <h2 id="③systemctlコマンドを使って起動設定、自動起動設定を編集、確認"><a href="#%E2%91%A2systemctl%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%B5%B7%E5%8B%95%E8%A8%AD%E5%AE%9A%E3%80%81%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E8%A8%AD%E5%AE%9A%E3%82%92%E7%B7%A8%E9%9B%86%E3%80%81%E7%A2%BA%E8%AA%8D">③systemctlコマンドを使って起動設定、自動起動設定を編集、確認</a></h2> <p><a href="https://crieit.net/posts/LInux-systemctl">systemctlコマンドの概要、コマンド集メモ</a></p> <h2 id="④firewall-cmdコマンドを使ってファイアウォールの設定"><a href="#%E2%91%A3firewall-cmd%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A">④firewall-cmdコマンドを使ってファイアウォールの設定</a></h2> <p><a href="https://crieit.net/posts/Linux-CentOS7-firewall-cmd">ファイアウォールの設定コマンドメモ</a></p> <h2 id="⑤動作確認"><a href="#%E2%91%A4%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D">⑤動作確認</a></h2> <p>おしまい</p> tobara tag:crieit.net,2005:PublicArticle/17337 2021-05-31T16:43:20+09:00 2021-05-31T16:43:58+09:00 https://crieit.net/posts/Linux-Web-html LinuxでWebサーバを構築した後どこにhtmlのファイルを張ればいいのかわからなくなったとき用メモ <h1 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h1> <p>これ</p> <pre><code># vim /var/www/html/index.html </code></pre> <h1 id="もうちょい詳しく"><a href="#%E3%82%82%E3%81%86%E3%81%A1%E3%82%87%E3%81%84%E8%A9%B3%E3%81%97%E3%81%8F">もうちょい詳しく</a></h1> <p>Webサーバにはドキュメントルートと呼ばれる、公開するコンテンツを配置するディレクトリがある。<br /> httpdの場合は<strong>「 /var/www/html/」</strong></p> tobara tag:crieit.net,2005:PublicArticle/17336 2021-05-31T16:21:19+09:00 2021-05-31T16:21:19+09:00 https://crieit.net/posts/Linux-CentOS7-firewall-cmd Linux(CentOS7)でファイアウォールの設定する方法(firewall-cmdコマンド) <h1 id="ファイアーウォールを操作するコマンド"><a href="#%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%83%BC%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">ファイアーウォールを操作するコマンド</a></h1> <p>CentOS7ではファイアーウォールに firewalld が採⽤されています。<br /> firewalldをコマンドで操作できるのが <strong>firewall-cmd</strong> です。</p> <pre><code># firewall-cmd [オプション] </code></pre> <h1 id="オプションコマンド集"><a href="#%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E9%9B%86">オプションコマンド集</a></h1> <pre><code>オプション 効果 --add-service=サービス 指定サービスの通信を許可する --removeservice=サービス 指定サービスの通信を許可しない --permanent 永続化を指定※即時反映には--reloadが必須 --reload 設定をリロードする --list-services 許可されたサービスを確認する --list-all ゾーンの状態を確認する --get-services --add-servicesコマンドで指定できるサービス名を確認する </code></pre> <h1 id="ワンポイント"><a href="#%E3%83%AF%E3%83%B3%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">ワンポイント</a></h1> <p><span style="color: red; ">オプション --permanent を加えない場合は設定が即時反映されますがfirewalld を再起動すると設定が元に戻ります。</span></p> tobara tag:crieit.net,2005:PublicArticle/17335 2021-05-31T16:00:31+09:00 2021-05-31T16:00:31+09:00 https://crieit.net/posts/LInux-systemctl LInuxでサーバの起動とか停止を管理してくれるsystemctlコマンド <h1 id="systemctlコマンドとは"><a href="#systemctl%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%81%AF">systemctlコマンドとは</a></h1> <p>Linuxの起動処理やシステム管理をコントロールするためのコマンド。<br /> サービスの起動や停⽌の操作をする際に⽋かせない。<br /> systemctlは、<strong>systemd</strong>を採⽤しているディストリビューションで使われる。</p> <pre><code># systemctl [サブコマンド] [サービス名(ユニット名)] 例(Webサーバを自動起動設定する場合) # systemctl enable httpd </code></pre> <h1 id="サブコマンド集"><a href="#%E3%82%B5%E3%83%96%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E9%9B%86">サブコマンド集</a></h1> <pre><code>サブコマンド 効果 start 開始する restart 再起動する stop 停⽌する status 状態を確認する enable ⾃動起動を有効にする disable ⾃動起動を無効にする is-enabled ⾃動起動の状態を確認する list-unitfiles インストールされているユニットを表⽰する </code></pre> tobara tag:crieit.net,2005:PublicArticle/17333 2021-05-31T15:38:05+09:00 2021-05-31T15:38:05+09:00 https://crieit.net/posts/Linux-CentOS7-Web Linux(CentOS7)でWebサーバ構築(~インストール、起動、自動起動設定まで~) <h1 id="Webサーバ構築前に"><a href="#Web%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89%E5%89%8D%E3%81%AB">Webサーバ構築前に</a></h1> <p>この記事でインストールするWebサーバ「Apache HTTP Server」の説明をば</p> <h3 id="Apache HTTP Serverとは"><a href="#Apache+HTTP+Server%E3%81%A8%E3%81%AF">Apache HTTP Serverとは</a></h3> <p>世界中でもっとも多く使われているOSSのWebサーバソフトウェア。<br /> 無料。<br /> 歴史が⻑い、信頼性が⾼い、Webで情報を⼊⼿しやすい、といった特徴がある。</p> <h1 id="Webサーバ構築手順"><a href="#Web%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89%E6%89%8B%E9%A0%86">Webサーバ構築手順</a></h1> <h3 id="①Apacheのインストール"><a href="#%E2%91%A0Apache%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">①Apacheのインストール</a></h3> <p>su -コマンドの後管理者パスワード打ち込む必要あり</p> <pre><code>1.$ su - ※インストールする為にroot権限が必要なため 2.# yum -y install httpd ※CentOSではhttpdというパッケージ名を指定する </code></pre> <h3 id="②Apacheの起動、起動できてるか確認"><a href="#%E2%91%A1Apache%E3%81%AE%E8%B5%B7%E5%8B%95%E3%80%81%E8%B5%B7%E5%8B%95%E3%81%A7%E3%81%8D%E3%81%A6%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D">②Apacheの起動、起動できてるか確認</a></h3> <p>WindowsのIISと異なり、インストールしてもApache HTTP Serverは起動していない。</p> <pre><code># systemctl start httpd ※指定したサーバを起動させるコマンド # systemctl status httpd ※起動したのか状態を確認するコマンド </code></pre> <p>この時にステータスのActivの欄がactiv(running)になっていたら起動している</p> <h3 id="③Apacheの自動起動、自動起動になっているか確認"><a href="#%E2%91%A2Apache%E3%81%AE%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E3%80%81%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D">③Apacheの自動起動、自動起動になっているか確認</a></h3> <p>OSを起動(再起動)した時に⾃動でApache HTTP Serverを起動させたい場合に行う</p> <pre><code># systemctl enable httpd※指定したサーバを自動起動させるコマンド # systemctl is-enabled httpd ※⾃動起動が有効なのかを確認するコマンド </code></pre> <p>is-enabledで表示された結果がenabledになっていればhttpdは⾃動起動している</p> tobara tag:crieit.net,2005:PublicArticle/17329 2021-05-31T15:05:15+09:00 2021-05-31T15:05:15+09:00 https://crieit.net/posts/5-60b47c9bf2e13 サーバ入門5 運用体験まとめ <h1 id="運用体験「アップデート」"><a href="#%E9%81%8B%E7%94%A8%E4%BD%93%E9%A8%93%E3%80%8C%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%80%8D">運用体験「アップデート」</a></h1> <p>・LinuxのWebサーバのパッケージを最新にする。<br /> ・Webサーバ(Linux)のパッケージを全て最新のものへとアップデートして、サーバを再起動する。<br /> <手順><br /> <code>$su - でroot権限にする</code><br /> ↓<br /> <code>#yum cheak-update (アップデートを確認)</code><br /> ↓<br /> <code>#yum -y update (アップデートを開始)</code><br /> ↓<br /> <code>#yum cheak-update (アップデートをもう1度確認)</code><br /> ↓<br /> <code>#systemctl restart httpd (Webサーバ再起動)</code><br /> ↓<br /> <code>#cat /etc/redhat-release (OSのバージョンを確認)</code><br /> ↓<br /> 完了</p> <h1 id="運用体験 「Webサーバのアインストール」"><a href="#%E9%81%8B%E7%94%A8%E4%BD%93%E9%A8%93%E3%80%80%E3%80%8CWeb%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%80%8D">運用体験 「Webサーバのアインストール」</a></h1> <p>・Webサーバ(Linux)からApacheのパッケージを削除する。<br /> <手順><br /> <code>#systemctl stop httpd (httpdを停止)</code><br /> ↓<br /> <code>#yum -y remove httpd (Apacheのアインストール)</code><br /> ↓<br /> <code>#yum list installed httpd (httpdがアインストールされているか確認)</code><br /> ↓<br /> <code>#firewall-cmd --permanent --remove-service=http (ファイアウォールを閉じる※「--permanent」で永続化を指定しなければ、再起動したら元の状態に戻ってしまうことに注意)</code><br /> ↓<br /> <code>#firewall-cmd --reload (ファイアウォールをリロードする)</code><br /> ↓<br /> <code>#fairewall-cmd --list-services (リストを見て、httpがなくなっていたら完了)</code><br /> ↓<br /> 完了</p> <p>### 補足<br /> ・vimのインサートモードで編集を終えて、保存して終了する方法は、「Esc」で戻り「:x」で保存して終了<br /> ・httpの自動起動無効化の方法は「#systemctl disable httpd」<br /> ・設定ファイルをvimで編集する際、サーバ上でできることは、cpを使って設定ファイルをバックアップし、編集後はdiffで編集前後の差分を確認する。スナップショットも有効。<br /> ・Windows10やMacOSでは、Linuxと同様に、scpコマンドを使ったファイルを転送できる。<br /> ・Apache(httpd)だけをアップデートするコマンドは「yum -y update httpd」</p> ko00w1 tag:crieit.net,2005:PublicArticle/17327 2021-05-31T14:38:45+09:00 2021-05-31T14:41:12+09:00 https://crieit.net/posts/5-fail2ban サーバ入門5 fail2banのインストールと動作確認 <h2 id="fail2banとは"><a href="#fail2ban%E3%81%A8%E3%81%AF">fail2banとは</a></h2> <p>サーバのアクセスログを解析してパスワード総当たり攻撃を行っているIPアドレスを自動でブロックするソフトウェア。インターネットにサーバを公開すると、攻撃されるので、不正アクセス地策が必要。</p> <h2 id="EPELリポジトリのインストール"><a href="#EPEL%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">EPELリポジトリのインストール</a></h2> <p>fail2banはCentOS7の標準リポジトリでは公開されていない。EPEL(Extra Packages for Enterprise Linux)リポジトリで公開されている。</p> <h3 id="リポジトリ"><a href="#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA">リポジトリ</a></h3> <p>・・・ソフトウェア(パッケージ)が公開されているサーバのこと。EPELリポジトリにアクセスするには、別途インストールが必要。<br /> ※EPELリポジトリが使えない状態でfail2banをインストールしようとするとエラー表示になる。<br /> ・EPELリポジトリが使える状態にするため、「epel-release」をインストールする。<br /> <code>#yum -y install epel-release</code><br /> インストールが完了した直後から、EPELサーバへアクセスができる。</p> <h2 id="fail2banのインストール"><a href="#fail2ban%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">fail2banのインストール</a></h2> <p>fail2banをインストールする。<br /> <code>#yum -y install fail2ban</code><br /> ・<strong>fail2banはインストールしてもすぐに使えない</strong>。<br /> ・<strong>設定ファイルに、足りない情報(どのような不正アクセスをブロックするか)の記述が必要</strong>。</p> <h2 id="fail2ban設定ファイルのコピー"><a href="#fail2ban%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC">fail2ban設定ファイルのコピー</a></h2> <p>設定テンプレートファイルjail.confをディレクトリ/etc/fail2ban/jail.d/にjail.localという名前でコピーし、編集を行う。<br /> <code>#cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.d/jail.local  ファイルをコピーする</code><br /> <code>#ll /etc/fail2ban/jail.d/jail.local   ちゃんとコピーできたかどうか確認</code><br /> <code>#vim /etc/fail2ban/jail.d/jail.local   jail.localをvimで編集する。</code></p> <h2 id="設定ファイル(jail.local)の編集"><a href="#%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%28jail.local%29%E3%81%AE%E7%B7%A8%E9%9B%86">設定ファイル(jail.local)の編集</a></h2> <p>3行だけ変える内容がある。<br /> <code>23: # [sshd]  →  23:[sshd] (先頭の#とスペースの2つを削除する)</code><br /> <code>24: # enable = true → 24:enabled = ture (先頭の#とスペースの2つを削除する)</code><br /> <code>208:banaction = iptables-multiport → 208:banaction = fairewallcmd-ipset (文字列変更)</code><br /> 23、24行目は<strong>sshでfail2banを有効(enable)にする意味</strong><br /> 208行目は<strong>fail2banはfairewalldと連携してブロックするという意味</strong><br /> ※fail2banのバージョンによって、編集対象の文字列がある行や位置が変わるので注意。</p> <h2 id="diffコマンド"><a href="#diff%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">diffコマンド</a></h2> <p><strong>ファイルの差分を見られる</strong>便利なコマンド。<strong>変更作業の実務でよく使う</strong>。元ファイルとの差分を見れば、変更すべき行だけ変更したのかすぐわかる。<br /> <code>$diff [比較元ファイル] [比較先ファイル]</code><br /> ・diffの出力は、数字が変更のある行数、「<」の記号が比較元の文字を表し、「>」の記号が比較先の文字を表す。<br /> ※fail2banのバージョンによって、編集対象の文字列がある行や位置が変わるので注意。</p> <h2 id="fail2banの起動及び自動起動"><a href="#fail2ban%E3%81%AE%E8%B5%B7%E5%8B%95%E5%8F%8A%E3%81%B3%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95">fail2banの起動及び自動起動</a></h2> <p>Apache HTTP Serverの時と同じ要領で、systemctlコマンドを使う。サービス名は「fail2ban」<br /> 1.fail2banを起動<code>#systemstl start fail2ban</code><br /> 2.起動したことを確認<code>#systemctl status fail2ban</code><br /> 3.自動起動の有効化<code>#systemctl enabled fail2ban</code><br /> 4.自動起動が有効化になったことを確認<code>#systemctl is-enabled fail2ban</code><br /> ※設定ファイルの記述がおかしいとfail2banはエラーで起動しない。エラーの場合は設定ファイルの記述を見直すこと。<br /> ・fail2banが起動すると、攻撃元のIPアドレスを<strong>一定時間(600秒)ファイアウォールでブロックする</strong>。※ログイン回数や遮断時間はfail2banのデフォルト設定値。</p> <h2 id="fail2banの状態確認"><a href="#fail2ban%E3%81%AE%E7%8A%B6%E6%85%8B%E7%A2%BA%E8%AA%8D">fail2banの状態確認</a></h2> <p>fail2banには、攻撃背れた回数、ブロックした回数、ブロックしたIPアドレスの統計情報を出力するコマンドがある。<br /> <code>#fail2ban-client status [サービス名]</code><br /> ※SSHに設定している場合は、サービス名は「<strong>sshd</strong>」となる。</p> <h2 id="fail2banおまけ"><a href="#fail2ban%E3%81%8A%E3%81%BE%E3%81%91">fail2banおまけ</a></h2> <p>・実際にfail2banを運用する場合、ブロックする時間は600秒では短い。長めの時間に設定することがほとんど。時間を変更したい場合は、<strong>jail.local</strong>に「<strong>bantime=(秒)</strong>」を追記する。なお、vimで修正しても、systemctlコマンドで<strong>fail2banを再起動させないと新しい設定が反映されない</strong>。<br /> ・ブロック中のIPアドレスのbantimeは「<strong>ipset --list</strong>」で確認できる。※ipsetはfirewalldの管理ユーティリティの1種。<br /> ・ブロックしたIPアドレスをbantimeを待たずに解除させる方法は<br /> <code>#fail2ban-client set sshd unbanip [IPアドレス]</code></p> ko00w1