カテゴリー: ガジェット Page 1 of 101

UbuntuサーバからIPv6を削除

「時代はIPv6」と呼ばれてから四半世紀。未だにIPv4が幅をきかせているという状態。

  • DNSの都合上、IPv4でないと困る
  • IPv6は管理で手に負えない

等の問題を抱えている運用者(つまり私)のため、「カーネルレベルでIPv4のみにする」手順のメモです。

環境

  • Ubuntu 24.04

そろそろUbuntu 26.04が出るタイミングではありますが、おそらく大幅な変化はないでしょう。

さっくりとした手順

  1. 現状を確認します。
  2. sysctlでIPv6を無効化するファイルを作成します。
  3. 作成したファイルを有効化してIPv6を無効化します。
  4. (利用している方は)ufw側の設定でIPv6を無効化します。

作業の前に

  • 本作業はカーネルをいじります。つまり、神経を使うという作業です。
  • 念には念を入れてサーバ再起動も伴います。

構築作業であれば好きなタイミングでサーバ再起動ができる環境を祝いましょう。
本番運用であればタイミングを調整する政治交渉が必要な環境を呪いましょう。

現状の確認

  • IPv6アドレス割当の確認
ip -6 addr

アドレスが返ってくればIPv6アドレスは有効化されています。何も表示されていなければ、ここからの作業は不要です。

ファイル追記

cat <<- __EOF__ | sudo tee -a /etc/sysctl.d/99-disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
__EOF__

元々存在しないファイルなのでコマンドで流し込みます。

設定反映

  • 設定反映
sudo sysctl --system

エラーがなければOKです。

  • 設定反映確認
ip -6 addr

IPv6アドレスが無いことを確認します。

  • 念のためのサーバ再起動
sudo reboot

サーバ再起動を行います。

  • 再起動後にIPv6がないことを確認
ip -6 addr

link-local IPv6のみが見えていればOKです。(NICの中でのみ使えるv6アドレスです)

(オプション)ufwでIPv6の無効化

※この作業はufwをいじります。ufwを有効化しているという方は、下手にいじると自分自身がロックアウトされる怖さを知っていると思います。

慎重に、深呼吸をするなり飲み物を飲むなどして落ち着かせてから作業を行いましょう。もっと具体的に言うと

  • 物理環境であればコンソール近くにいること
  • vps環境はWebコンソールを開いて
  • SSH接続しかない場合は新規セッションで接続を維持する

の作業を推奨します。(この場合の推奨は義務という意味です

  • ufw設定ファイルのバックアップ
sudo cp -pi /etc/default/ufw /path/to/backup/directory/ufw.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • ファイルのバックアップ確認
diff -u /path/to/backup/directory/ufw.$(date +%Y%m%d) /etc/default/ufw

差分が無いことを確認します。

  • ファイル修正

以下のような形で修正します。

IPV6=yes

これを

#IPV6=yes
#yyyy/mm/dd IPv6無効
IPV6=no

という形です。

日付管理をしないと「万が一のことがあったときにどっからおかしくなったか」を管理しやすくなります。同様に、コメントin/outとすることで切磋の対応をしやすくします。

  • ファイル修正確認
diff -u /path/to/backup/directory/ufw.$(date +%Y%m%d) /etc/default/ufw
-IPV6=yes
+#IPV6=yes
+#yyyy/mm/dd IPv6無効
+IPV6=no
  • ufw再起動

三回ぐらい深呼吸をしましょう。

sudo ufw reload

最終確認

  • IPv6無効化確認
ip -6 addr

link-local IPv6のみが見えていればOKです。

  • LISTENがない
ss -lntup | grep :::  

v6 のLISTENがないことを確認します。

  • ufw確認
sudo ufw status verbose

IPv6に関わるルールが無いことを確認します。

まとめ

以上、「IPv6無効」と簡単に言うけれど、言うほど簡単では無いという作業でした。

ASNとは何か?インターネットの“住所録”を支える番号と「盗人宿」の把握

インターネットの通信は、単にIPアドレスだけで動いているわけではありません。
その裏側には ASN(Autonomous System Number) という仕組みがあり、これが世界中のネットワークをつないでいます。

本記事では、

  1. ASNとは何か
  2. なぜ存在するのか
  3. セキュリティ運用でどう役立つのか

を順番に解説します。

ASNとは何か

ASNは:

インターネット上の「組織単位の番号」

です。

もう少し正確に言うと:

独立したネットワークを運用する組織に割り当てられる識別番号

です。

例えば:

組織ASN
Amazon AWSAS14618
GoogleAS15169
MicrosoftAS8075
NTTAS2914

IPアドレスが「端末の住所」だとすると、ASNは「プロバイダや企業の名前札」

のようなものです。

なぜASNが必要なのか

インターネットは巨大なネットワークですが、実態は無数のネットワーク同士の集合体です。

各プロバイダ、クラウド事業者、大学、企業はそれぞれ独立したネットワークを持っています。

この独立した単位をAutonomous System(AS)

と呼びます。そしてその識別番号が ASNです。

郵便で例えると

  • IPアドレス = 家の住所
  • ASN = 市区町村

と考えていただくと分かりやすいでしょう。

郵便物はまず「市区町村」に届き、そこから各家庭へ配送されます。

インターネットでも:

  1. まずAS単位でルーティング
  2. その中でIP単位に配送

という仕組みになっています。

BGPとASN

ASNが本領を発揮するのは:

  • BGP(Border Gateway Protocol)

というルーティングプロトコルです。

BGPは「どのネットワークがどのIPを持っているか」

を世界中で共有する仕組みです。

例えば:

このIPレンジはAS14618(Amazon)が持っています

という情報を各AS同士が交換しています。

これによって世界中のルータが最適な経路を選べる

ようになります。言い換えるなら、ASNとBGPがなければ、現在の規模のインターネットは成立しません。

セキュリティ運用でのASNの意味

サーバーログを見ると攻撃IPがどこから来ているかを知りたくなりました。

そこで、ASN単位でみることにしました。

なぜ運用者はASNを見るのか

筆者が運用しているVPSはONE OUTSという独自防御システムを敷いていますが、ここでの防御は

  • IP単体BAN
  • ASN単位防御

なぜなら、多くの攻撃者は海外の規制が緩いプロバイダ/組織を隠れ蓑にしています。

  • 利用の際に厳格な身分証明がなく
  • 当局の規制が緩い(どころかそういう行為を推奨している

(『鬼平犯科帳』で言うなら「盗人宿」の概念です。

実際の例

では、そういったASNをどのように調べるのか?

Linuxでは使いやすいコマンドが存在します。

whois -h whois.cymru.com " -v 8.8.8.8"

と打ってみます。(言わずと知れたGoogleのDNSです

AS      | IP               | BGP Prefix          | CC | Registry | Allocated  | AS Name
15169   | 8.8.8.8          | 8.8.8.0/24          | US | arin     | 2023-12-28 | GOOGLE - Google LLC, US
  • ASN
  • 事業者
  • IPレンジ

が見えてきたという次第。これをサーバのログから調べるのはかなり困難なので、以下のようなワンライナーを組んでみました。

エラーログからIPを抽出し、一意にソートしてWHOIS情報(AS番号、国、事業者名)を取得します。

grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' /var/log/apache2/web_server_error.log \
| sort -u \
| while read ip; do
    whois -h whois.cymru.com " -v $ip" | tail -n1
  done

以下、無害化した解析結果テーブルです。(無害化に関してはAIの力を借りています

AS      | IP               | BGP Prefix          | CC | Registry | Allocated  | Info (Sanitized)
--------|------------------|---------------------|----|----------|------------|-------------------------------------------
58466   | 106.75.x.x       | 106.75.144.0/20     | CN | apnic    | 2011-03-23 | Major ISP / IDC Network (CN)
4837    | 123.139.x.x      | 123.138.0.0/15      | CN | apnic    | 2007-02-28 | China Network Backbone
8075    | 13.86.x.x        | 13.64.0.0/11        | US | arin     | 2015-03-26 | Global Cloud Service Provider (MS)
14061   | 144.126.x.x      | 144.126.208.0/20    | US | arin     | 2020-01-09 | Cloud Hosting / VPS Provider (DO)
212238  | 149.40.x.x       | 149.40.50.0/24      | US | arin     | 1992-01-28 | International Content Delivery Network
396982  | 162.216.x.x      | 162.216.150.0/24    | US | arin     | 2013-07-02 | Global Cloud Infrastructure (G)
51167   | 173.212.x.x      | 173.212.224.0/20    | DE | ripencc  | 2009-10-26 | European VPS/Dedicated Server Provider
211298  | 185.247.x.x      | 185.247.137.0/24    | GB | ripencc  | 2018-03-01 | Cyber Security Research Entity
213412  | 195.184.x.x      | 195.184.76.0/24     | FR | ripencc  | 2022-11-09 | Internet Scanning & Security Platform
398324  | 206.168.x.x      | 206.168.34.0/24     | US | arin     | 2022-10-26 | Global Threat Intelligence Scanner
14618   | 34.224.x.x       | 34.224.0.0/12       | US | arin     | 2016-09-12 | Global Cloud Services (AWS)
132203  | 43.153.x.x       | 43.153.0.0/18       | SG | apnic    | 1989-02-21 | Asia-Pacific Cloud Network (T)
6939    | 65.49.x.x        | 65.49.0.0/17        | US | arin     | 2007-10-04 | International Internet Backbone Provider
200593  | 91.202.x.x       | 91.202.233.0/24     | RU | ripencc  | 2008-03-03 | Eastern European Network Services

注意点

ログが数万行に及ぶ環境ではこの解析は膨大なものになります

head -50 /var/log/apache2/web_server_error.log | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' \
| sort -u \
| while read ip; do
    whois -h whois.cymru.com " -v $ip" | tail -n1
  done

とした方が良いでしょう。

まとめ

こうして、ASNを調べることができれば、先に示した「悪辣な攻撃を行うクローラー/攻撃者が潜む盗人宿」的な事業体/ASNという、「盗人宿」ごとの対策が容易に行えます。

悪を知らぬものが悪を取り締まれるか

という「鬼平」の言葉を元にログを調べていく手法について紹介しました。

Matomo、強制SSL接続の実施

環境

  • Matomo 5.7.0
  • PHP-FPM8.3
  • Ubuntu 24.04

を利用中、Matomoの管理画面で

安全な SSL 接続のみで Matomo を使用することをお勧めします。 Http で安全でないアクセスを防ぐには、Matomo config / config.ini.php ファイルの General セクションに force_ssl = 1 を追加します。

と警告があったので、これに対処したときのメモです。

そもそもの問題として:SSL化することの意義

通信の盗聴と改ざんの防止(中間者攻撃対策)

HTTP(暗号化されていない接続)を利用している場合、ブラウザとサーバー間の通信内容はすべてプレーンテキスト(平文)で流れます。

  • ログイン情報の保護:
  • 管理画面にログインする際のユーザー名やパスワードがネットワーク上で丸見えになります。
  • 解析データの保護:
  • 収集しているアクセスログやレポートデータが第三者に盗み見られるリスクがあります。
  • 改竄防止:
  • 通信の途中でJavaScriptを注入されるなどの改竄を防ぎ、Matomoの正確な動作を保証します。

Cookie(セッション情報)の安全な送信

Matomoは管理者のログイン状態を保持するためにCookieを使用します。

  • セッションハイジャックの防止:
    • HTTPSを強制しない場合、ログイン状態を証明する「セッションID」が暗号化されずに送信される可能性があります。これが攻撃者に盗まれると、パスワードを知らなくても管理者としてログイン(なりすまし)されてしまいます。
  • Secure属性の有効化:
    • SSLを強制することで、ブラウザに対して「このCookieはHTTPS通信の時のみ送信する」という指示(Secure属性)が正しく機能するようになります。

ブラウザのセキュリティ仕様への対応

近年のWebブラウザ(Chrome, Firefox, Safariなど)は、セキュリティを重視しており、HTTP接続に対して厳格な制限を設けています。

  • SameSite属性の制限: 多くのブラウザでは、Cookieの SameSite=None 属性を利用する場合、Secure 属性(=HTTPS)が必須となっています。SSLを強制しないと、Matomoのトラッキングコードが正しく動作しなかったり、ログインが維持できなかったりする不具合の原因になります。
    -「保護されていない通信」の警告: HTTPでアクセスするとブラウザのアドレスバーに警告が表示され、ユーザーや管理者に不安を与えます。

リファラ(参照元)情報の保持

Webサイトの計測において重要な「どこから来たか」という情報(リファラ)は、「HTTPSのページからHTTPのページへ移動する際」にはセキュリティ上の理由でブラウザによって削除されることが一般的です。

もしMatomoのサーバーがHTTPで動作していると、HTTPS化されたサイトからの流入元データが取得できず、解析精度が著しく低下します。

筆者のサイトでは既に、apacheのバーチャルホスト設定で

<VirtualHost _default_:80>
ServerName hoge.example.com
 RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

としていますが、念には念を入れます。

大前提

「ドメインに即した証明書を取得していること」

が必要です。(設定メモ

さっくりとした手順

  1. matomoの.confファイルのバックアップを取ります。
  2. matomoの.confファイルの編集を行います。
  3. 設定を反映します。

matomoの.confファイルのバックアップ

  • バックアップディレクトリへコピー
sudo cp -pi /path/to/matomo/config/config.ini.php /path/to/backup/directory/conf_backup/config.ini.php.$(date +%Y%m%d)

`

.confの格納場所は自分の環境に合わせます。(筆者環境/home/www-data/matomo)

  • バックアップ確認
diff -u /path/to/backup/directory/conf_backup/config.ini.php.$(date +%Y%m%d) /path/to/matomo/config/config.ini.php

差分が無ければバックアップ成功です。

  • 再掲:なぜこの方法をとるのか?

「バックアップとオリジナルの両方があることが一発で分かるから」です。

cp -pi として、 ls -lを行うよりも確実です。

そして、この時点で差分があった場合は「これから修正するファイルを間違えた」というまたとない確認手段になります。(もしくはリアルタイムで改竄を受けているか、不思議なことが起こっているか)

matomoの.confファイルの編集

/path/to/matomo/config/config.ini.phpを、任意の方法で(教義・信仰に沿ったエディタで)編集します。

 [General]

セクションの下、trusted hostsあたりの直下に

force_ssl = 1

を追記して保存します。

  • 編集確認
diff -u /path/to/backup/directory/conf_backup/config.ini.php.$(date +%Y%m%d) /path/to/matomo/config/config.ini.php

以下のような結果が得られれば成功です。

 [General]
 salt = "UUID"
 trusted_hosts[] = "Your Domain"
+force_ssl = 1

このように、diffの元と先をcpの逆にすることは、編集したところが+で表示される視覚的な安心感を生みます。

設定反映

  • apache構文確認
sudo apache2ctl configtest

SyntaxOKを確認します。それ以外のエラーが起きていたら、編集時に誤りがあるので確認しましょう。

  • apache再開前確認
systemctl status apache2.service

active(running)を確認します

  • apache再開
sudo systemctl restart apache2.service
  • apache再開確認
systemctl status apache2.service

active(runnning)を確認します

  • php-fpm再開前確認
systemctl status php8.3-fpm.service 

active(running)を確認します

  • php-fpm再開
sudo systemctl restart php8.3-fpm.service 
  • php-fpm再開確認
systemctl status php8.3-fpm.service 

active(runnning)を確認します

設定反映確認

  1. 設定を行ったmatomoサイトに管理者権限でログインします。
  2. 設定 > システムの確認 > 完全なシステムチェックレポートを表示する をクリックします。
  3. 強制 SSL 接続にチェックが入っていれば設定完了です。

Matomoでcron処理を実行。

環境

  • Matomo 5.7.1
  • PHP-FPM8.3
  • Ubuntu 24.04

セルフホストでMatomoを用いている場合のcron処理を行ったときのメモです。

なぜcron処理が必要なのか?

Matomoには、データを処理する2つの方法があります。

  • リアルタイム集計(デフォルト): 管理画面を開いた瞬間に、溜まっている生データを計算してグラフを表示します。アクセスが少ないうちは良いですが、アクセスが増えると表示が非常に重くなります。
  • cronによる事前集計(推奨): 「5分に1回」などの頻度で、裏側でこっそり計算を済ませておきます。管理画面を開いたときは、計算済みの結果を表示するだけなので、動作が非常にサクサクになります。

さっくりとした手順

  1. crontabを編集します。
  2. Matomoの管理画面で設定を行います。

Crontab編集

  • crontabを開く
sudo crontab -u www-data -e

Matomoを実行しているユーザー(通常は www-data)として編集します。

  • 実行コマンドを追記する

ファイルの末尾に以下の1行を追加します(パスはご自身の環境に合わせて調整してください)。

5 * * * * /usr/bin/php /var/www/html/matomo/console core:archive --url=https://your-matomo-domain.com/ > /dev/null

解説: > 5: 毎時5分に実行するという意味。
/usr/bin/php: PHP 8.3の実行パス。
core:archive: これが「溜まったデータを集計しろ」というMatomo専用の命令です。

Matomo管理画面での設定変更

cronを設定しただけでは不十分です。Matomo側に「自分で集計するから、画面を開いたときに集計しなくていいよ」と教える必要があります。

  1. Matomoにログインし、「設定(歯車アイコン)」をクリックします。
  2. 左メニューの 「システム」 > 「一般設定」 を開きます。
  3. 「アーカイブの設定」 セクションを確認します。
    1. 「ブラウザでレポートを表示するときにアーカイブをトリガーする」を 「いいえ」 に変更。
  4. 下部の「保存」ボタンをクリックします。

注意点

  • PHP 8.3のメモリ制限:
    • 大規模なデータを集計する場合、CLI(コマンドライン)用の php.inimemory_limit を多めに(512Mや1Gなど)設定しておくと安心です。
  • ログの確認:
    • 最初は > /dev/null を書かずに実行して、エラーが出ないか確認することをおすすめします。

その他の設定に関しては改めて述べます。

Ubuntu パッケージ更新エラーの解決メモ

aptitude(apt)で捕まったときのメモです。

発生した状況

Ubuntu 24.04 で sudo aptitude update を実行した際、Phusion Passenger リポジトリに対して以下のエラーおよび警告が発生しました。

  • エラー:
    • 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY D870AB033FB45BD1
  • 警告:
    • Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

原因

GPG鍵の欠落:

システムが Passenger リポジトリのパッケージが真正なものであるかを確認するための公開鍵を持っていませんでした。

古い管理形式(非推奨):

以前の Ubuntu で一般的だった apt-key による鍵登録を行っていましたが、Ubuntu 24.04 ではその管理方式がセキュリティ上の理由で非推奨(Deprecated)となっていたためです。

対処内容

以下の手順で、鍵を新しい推奨形式(個別のキーリング管理)へ移行させました。

鍵の抽出と個別保存

sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --export D870AB033FB45BD1 | sudo tee /usr/share/keyrings/phusion-passenger.gpg > /dev/null

古い管理リストから鍵を削除

sudo apt-key del D870AB033FB45BD1

リポジトリ設定の更新

/etc/apt/sources.list.d/passenger.list 内の記述に [signed-by=/usr/share/keyrings/phusion-passenger.gpg] を追記し、特定のリポジトリと鍵を紐付けました。

→ 筆者にしては珍しく.listのバックアップを取っていませんが(切り戻しを取れるようにしていません)、これは「切り戻したところで古い鍵形式だから」です。

解決確認

sudo aptitude update

でエラーがないことを確認します。

作業が必要だった理由(背景)

Ubuntu 22.04 以降、OSのセキュリティ設計が強化され、

「すべてのリポジトリで共通の鍵束を使う方式」から「リポジトリごとに専用の鍵を個別に指定する方式」

への完全移行が推奨されているためです。これにより、以下のメリットがあります。

  • セキュリティ向上:
    • 万が一、一つのリポジトリの鍵が漏洩・悪用された場合でも、他のリポジトリの安全性に影響を与えない設計になっています。
  • メンテナンス性の向上:
    • どの鍵がどのリポジトリのものかが明確になり、不要になった鍵の削除や更新が安全に行えます。

Nextcloud Client 4.0.5アップグレードの失敗時の対応。

ローカルサーバに設置されているNextcloudを利用するためのデスクトップクライアント。

自動更新するはずが、以下のメッセージが出て

「再起動してアップデート」をクリックしても同じエラーが発生。

これの対処のメモです。

参考手順(というよりもリリース)

対処手順

タスクバーから「Nextcloudを終了」でアプリを終了します。

Nextcloud クライアント公式に飛びます。

v4.0.6以降をダウンロードして、インストーラーを実行します。

インストール終了後、上記エラーが出ないことを確認します。

メモ

  • クライアントを上書きするだけなのでデータや設定が吹き飛ぶことはありません。
  • 対処しないと延々と上記エラーが出続けてフラストレーションがたまります。
  • Nextcloudの設定に問題があるわけでもありません。

Zram運用後のメモリ量の推移

昨日運用を開始したzram。その効果を実感できる「単体テスト」にぶち当たりました。

  • 必要に応じて動かし
  • アップデートでメモリを恐ろしく消費する

Growiのアップデートです。

zram導入・運用環境 メモリ推移比較

項目1. 導入直後2. Growiアップデート後3. Growi起動中(安定時)
物理メモリ(使用/Total)2.78 / 5.78 GiB(高負荷)2.9 / 5.8 GiB
物理メモリ(空き/可用)0.42 GiB (Free)-2.9 GiB (Available)
zram展開サイズ (DATA)-1.4 GiB927.6 MiB
zram実占有 (TOTAL)-333.6 MiB258.1 MiB
圧縮率 (zstd)-約4.3倍約5.5倍
ディスクスワップ使用量0.02 GiB0 B0 B
主な状態初期クリーン状態ビルド等のメモリ最大消費時安定稼働・メモリ余裕あり

数値から見る運用の要諦

  • 導入直後はFreeが0.42GiBと心許ない数値でしたが、安定稼働時にはAvailableが2.9GiBまで回復しており、OSが自由に使える「机の広さ」が広くなっています。
  • Growiアップデートという最大の難所においても、Disk Swapを0Bに抑え込めたことが、システム全体のレスポンス維持に直結しています。
  • 安定稼働時に圧縮率が5.5倍まで向上しているのは、メモリ内の重複データやテキストデータが効率よく整理されているzstdの底力を見ました。

ここからのまとめ

「取り敢えず私のサーバには合っている」という形。他、気がついた事項は随時フィードバックしていきます。

UbuntuサーバにZramを導入したときの記録。

概要

筆者が運用しているWebサーバ。興味が向くまま様々なWebアプリを入れているため、メモリが心許ない事態が発生します。
単にスワップを増やすのではなく、Linuxの物理メモリ(RAM)の上に圧縮された専用領域(ブロックデバイス)を作成する、zramを導入します。

  • 通常の構造: RAM <---> Disk (HDD/SSD)
  • zram導入後: RAM [ 通常領域 | zram(圧縮領域) ] <---> Disk

環境

  • Ubuntu 24.04

メモリ環境

free -b | awk '
/Mem:/ {
  mem_total=$2/1024/1024/1024;
  mem_used=$3/1024/1024/1024;
  mem_free=$4/1024/1024/1024;
}
/Swap:/ {
  swap_total=$2/1024/1024/1024;
  swap_used=$3/1024/1024/1024;
  swap_free=$4/1024/1024/1024;
}
END {
  printf "| 項目 | 値 |\n| --- | --- |\n";
  printf "| Mem Total | %.2f GiB |\n", mem_total;
  printf "| Mem Used | %.2f GiB |\n", mem_used;
  printf "| Mem Free | %.2f GiB |\n", mem_free;
  printf "| Swap Total | %.2f GiB |\n", swap_total;
  printf "| Swap Used | %.2f GiB |\n", swap_used;
  printf "| Swap Free | %.2f GiB |\n", swap_free;
}'
項目
Mem Total5.78 GiB
Mem Used2.78 GiB
Mem Free0.42 GiB
Swap Total2.00 GiB
Swap Used0.02 GiB
Swap Free1.98 GiB

Caution! 導入の前に

これは万能薬ではありません。

メモリ上にブロックデバイスを作成しますが、その分、マシンパワーを喰います。

元々のメモリ量が少なければ効果を発揮しません。

例えば1GB未満のWebサーバでの運用は厳に慎むべきです。

破壊的アップデートを伴います。

「スワップをいじることのヤバさ」が知らない方は、この先の文章は読まないでください。(正直、DDoS喰らった時以上に神経を使う作業でした)

フェイズ・ゼロ(政治交渉)の必要性-再掲-

このvpsを個人的に運用しているのならばそのまま行って構いません。しかし、これを組織で運用しているとなると話はまるで違います。

  • メモリが心許ない。
  • ついてはこの計画でサーバ設定を行う
  • そのため、追加で作業時間をいただきたい
  • 作業時間は○時頃、○分程度で終わる。その間、サーバそのものの再起動を伴う

など、利用者への周知という名の政治交渉が必要になります。この運用者の政治的な立ち位置(担当者/担当部門が強権を振るえるか否か)でも言い方や手段が決まってきます。そこは状況に応じていきましょう。

当然、設定の大幅変更に関わるので設計書や運用のドキュメント化も待っています。

※ 検証環境を用意できる程度には時間と予算と環境に余裕がある方は、その環境にいることを感謝しつつ、検証を重ねていきましょう。

さっくりとした手順

以下、フェイズ・ゼロをクリアした(必要ない)方向けです。

  1. カーネルモジュールを追加インストールします。
  2. zramをインストールします。
  3. zramの設定を行います。
  4. zramを有効化します。
  5. zramの内容を確認します。

※筆者の好みでaptitudeを用いています。必要に応じてaptに読み替えてください。

強く推奨:イメージ全体のバックアップ

仮想サーバ、vps等で運用している場合は、イメージ全体をバックアップ(スナップショット)などとしておき、何かあったときにすぐに戻せるようにします。

カーネルモジュールの追加インストール

これが地味にハマりました。

sudo apt install linux-modules-extra-$(uname -r)

これを入れていないと「現在のカーネルにzramモジュールが存在しない、あるいはロードできない」事態が発生します。(発生しました)

zramインストール

sudo aptitude install zram-tools

と、コマンド一発で済む作業です。しかし、コマンド一発で済む作業であるからこそ、チューニングは細心の注意が必要です。

zramの設定

  • 設定ファイルのバックアップ
sudo cp -pi /etc/default/zramswap /path/to/backup/zramswap.$(date +%Y%m%d)
  • 設定ファイルのバックアップ確認
diff -u /path/to/backup/zramswap.$(date +%Y%m%d) /etc/default/zramswap

エラーがなければOKです。diffを逆にしているのは、この後で説明します。

  • ファイルの修正

/etc/default/zramswapを以下のように修正します。自身の環境に合わせます

# 圧縮アルゴリズムの指定
ALGO=zstd
# 物理メモリの半分ほどを指定します
PERCENTAGE=50
# 念のため、ディスクサイズも指定します
SIZE=2048
# 既存スワップ(通常の-2)より高く設定します
PRIORITY=100
  • ファイルの修正確認
diff -u /path/to/backup/zramswap.$(date +%Y%m%d) /etc/default/zramswap
 #ALGO=lz4
+ALGO=zstd

 # Specifies the amount of RAM that should be used for zram
 # based on a percentage the total amount of available memory
 # This takes precedence and overrides SIZE below
 #PERCENT=50
+PERCENTAGE=50

 # Specifies a static amount of RAM that should be used for
 # the ZRAM devices, this is in MiB
 #SIZE=256
+SIZE=2048

 # Specifies the priority for the swap devices, see swapon(2)
 # for more details. Higher number = higher priority
 # This should probably be higher than hdd/ssd swaps.
 #PRIORITY=100
+PRIORITY=100

等と表示されればOKです。そして、ここで、先ほど示したdiffのsrcとdstを逆にした理由です。

  • 逆にする(バックアップからの差分)とすることで
    • 「何を足したか(つまり、現時点での正」が明白になります。
  • 逆にしないと
    • 正しい設定が「引かれている」状態となり、視覚的に危険な状態になります。

zramの有効化

  • zram再起動
sudo systemctl restart zramswap

`

※筆者がハマったのはここです。ここでエラーが発生してカーネルモジュールをインストールする手戻りが発生しました。

  • zramサービス確認
systemctl status zramswap.service 

active(exited)を確認します。(これは、apache/mysqlなどの常駐型サービスと異なり「カーネルにロードしてしまえば後はOK」という状態のためexitedとなっています。

サーバ再起動

sudo reboot

行います。再起動に慎重を要する(クラスタリングなど)はその手順に従ってください。

ここで再起動しない事態が発生したら?

「さぱっと死せい 黄泉路の先陣じゃ 誉れじゃ」

ぐらいの潔さを持ちましょう。(持てなければそもそも筆者はサーバ運用をしていません

潔さがない方のためのイメージ全体のバックアップであり、スナップショットなので。

zramの有効化確認

swapon --show
NAME       TYPE      SIZE USED PRIO
/swapfile  file        2G   0B   -2
/dev/zram0 partition   2G   0B  100

/dev/zram0がリストにあれば、カーネルがスワップとして認識中です。

zramctl
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd            2G   4K   59B   20K       4 [SWAP]

で、数字がカウントされればOKです。

WindowsノートのCopilotキーをスクリーンショットに置き換え。

昨今のノートPCに強制的についてくるCopilotキー。

これが不便なので別のものに切り替えます。

試行1:失敗

設定 > Bluetoothとデバイス > キーボード

ショートカットとホットキー

ここで、「キーボードのCopilotキーをカスタマイズする」を行ったところで、選べるものが

  • Copilot
  • Copilot365

しか選べない状況でした。

試行2:成功

そこで試したのはMicrosoft PowerToysです。

これをストアでインストール。インストール後、

Keyboard Managerを選択。

これを有効化後、「ショートカットの再マップ」をクリックします。

ここで選ぶのは、ショートカット(左側)

  • Win (Left)
  • Shit (Left)
  • F23

という、Copilotのショートカット。

割当先を

PrintScreenに変更。

変更後、OKをクリックすることで、Copilotキーがスクリーンショットと、役立つ機能へのショートカットになりました。

ノートPCの装飾。

新調したノートPC、ThinkPad P14s Gen 6 (AMD)。

こちらを、例によってデコレーションしました。

天板

無軌道に貼るのではなく、視線誘導を意識。特に「浮遊せよ(Wingardium Leviosa)」を文字通り浮遊させる位置に置いたのは会心のできです。

パームレスト

こちらは好きな花と推し色で区別。CPUロゴやThinkPadロゴに重ならないように貼り付けました。

追加で

のぞき見防止フィルタも設置。マグネット着脱式ではなかったので、マステで貼り付け。この方が張り直しも用意で飾れるのでより気に入っています。

Page 1 of 101

Powered by WordPress & Theme by Anders Norén