■システムバックアップ
※正規OSのシェルにて、
0. 事前調査
parted -l
pvs
vgs
lvs
cat /etc/fstab
blkid
/dev/mapper/rhel-root: UUID="72feb562-c19f-4a7a-a058-0b8741bb8cb5" TYPE="xfs"
/dev/nvme0n1p1: UUID="6CBD-4356" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="1b3dce1e-34fe-4e16-be26-ca2a6a9dd554"
/dev/nvme0n1p2: UUID="ee854401-c0bd-43c6-8fce-5326e9f1bbc7" TYPE="xfs" PARTUUID="336a2778-6bf0-44f5-8925-8e91731da6b7"
/opt配下にremiやepel由来のパッケージがインストールされていないか念のため確認


1. 外付けHDD(例: /dev/sda)をマウントして移動
mount /dev/sda /mnt/
cd /mnt

2. ルート上の3つの重要ディレクトリを「1つのtar」にまとめmる
tar cpf boot_efi.tar --xattrs --acls --one-file-system /boot/efi
tar cpf boot.tar --xattrs --acls --one-file-system /boot
tar cpf sys_core.tar --xattrs --acls /etc /usr /var/lib /var/cache /opt/remi /opt/※epel系


dnf update -y


■システムリストア
※rescue OSのシェルにて、

1. マウントポイントを作成し、内蔵LVM(ルート)と外付けHDDをマウント
vgchange -ay
mkdir -p /mnt/target /mnt/usb
mount /dev/sda /mnt/usb
mount /dev/mapper/rhel-root /mnt/target

2. 内蔵ディスク側のブートパーティションも忘れずにマウントする
mount /dev/nvme0n1p2 /mnt/target/boot
mount /dev/nvme0n1p1 /mnt/target/boot/efi

3. 【超重要】古いデータをピンポイントで削除(100GBの/homeは触らない)
cd /mnt/target
rm -rf etc usr var/lib var/cache opt/remi opt/※epel系
rm -rf boot/*
rm -rf boot/efi/*

4. バックアップから復元(すべて「-C /mnt/target」を指定するのが正解!)
# 展開時に自動的に etc/ や usr/ などの正しいフォルダ位置へ上書き・配置されます
tar xpf /mnt/usb/sys_core.tar --xattrs --acls -C /mnt/target
tar xpf /mnt/usb/boot.tar --xattrs -C /mnt/target/boot --strip-components=1
tar xpf /mnt/usb/boot_efi.tar --xattrs -C /mnt/target/boot/efi --strip-components=2

5. SELinuxのリラベル設定(tar復元時の必須おまじない)
touch /mnt/target/.autorelabel
touch /mnt/target/.autorelabel

6. アンマウントして再起動(gpt方式でなくMBR方式でも可))
cd /
umount /mnt/target/boot/efi
umount /mnt/target/boot
umount /mnt/target
umount /mnt/usb
reboot

■システムのサブスクリプション登録

※RedHatアカウントを事前に登録しておく。

 Redhat customer portal:https://access.redhat.com/

# subscription-manager register --username <ユーザ名> --password '<パスワード>'

・確認

# subscription-manager identity

システム ID: XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
名前: xymon-server
組織名: XXXXXXXX
組織 ID: XXXXXXXXX

 

■Red Hat Developer Subscription for Individuals登録

個人ユーザの場合は以下のサイトから登録すると無料でupdateできるようになる。

https://developers.redhat.com/

※RedHatアカウントとはまた別にアカウントを登録する必要がある

上記登録後以下を実行

# subscription-manager refresh

・確認

# subscription-manager list --consumed

使用済みサブスクリプションプールは見つかりませんでした。

⇒Red Hat Developer Subscription for Individuals登録するだけで自動的にすべてのリポジトリが解放され、割り当てが成功していても「使用済み(消費済み)」としてはカウントされず、「見つかりませんでした」と表示されるらしい。

・利用できるリポジトリの一覧表示

# dnf repolist --enabled
サブスクリプション管理リポジトリーを更新しています。
repo id                                                                     repo の名前
rhel-9-for-x86_64-appstream-rpms            Red Hat Enterprise Linux 9 for x86_64 - AppStream (RPMs)
rhel-9-for-x86_64-baseos-rpms                    Red Hat Enterprise Linux 9 for x86_64 - BaseOS (RPMs)

 

 

 

 

清書はこれから
■手動でsambaマウント

mount -t cifs -o username=smbuser //192.168.159.128/Share /mnt/smb_share
 

■fstabに記載
//192.168.159.128/Share /mnt/smb_share cifs credentials=/etc/samba/auth.cred,uid=apache,gid=apache,file_mode=0777,dir_mode=0777,defaults,_netdev 0 0

# mount -a

# systemctl daemon-reload

 

■mountコマンドを実行すると、デフォルトで以下のmountオプションが適用されている

---中略---

//192.168.159.128/Share on /mnt/smb_share type cifs (rw,relatime,vers=3.1.1,cache=strict,upcall_target=app,username=smbuser,uid=48,forceuid,gid=48,forcegid,addr=192.168.159.128,file_mode=0777,dir_mode=0777,soft,nounix,serverino,mapposix,reparse=nfs,nativesocket,symlink=native,rsize=4194304,wsize=4194304,bsize=1048576,retrans=1,echo_interval=60,actimeo=1,closetimeo=1)

■sambaクライアント側で以下を実行

# time cp -p /mnt/smb_share/testfile.img /tmp/

※ちなみにtestfile.imgは5GBのファイルで以下の実行には15秒くらいかかる

■sambaクライアント側でコピー開始から数秒後にsambaサーバ側でネットワークインタフェースを80秒間切断してから再接続
# nmcli device disconnect ens160 ; sleep 80 ; sudo nmcli device connect ens160

■コピー完了後にファイルが壊れてないか確認
# md5sum /mnt/smb_share/testfile.img
ec4bcc8776ea04479b786e063a9ace45  /mnt/smb_share/testfile.img
# md5sum /tmp/testfile.img
ec4bcc8776ea04479b786e063a9ace45  /tmp/testfile.img

■以下のようにretransとecho_intervalを変えてやれば十数秒の瞬断ではsamba接続は120秒おきに5回試行されるようになりコピー時間は伸びるがコピー自体は成功する
//192.168.159.128/Share on /mnt/smb_share type cifs (rw,relatime,vers=3.1.1,cache=strict,upcall_target=app,username=smbuser,uid=48,forceuid,gid=48,forcegid,addr=192.168.159.128,file_mode=0777,dir_mode=0777,soft,nounix,serverino,mapposix,reparse=nfs,nativesocket,symlink=native,rsize=4194304,wsize=4194304,bsize=1048576,retrans=5,echo_interval=120,actimeo=1,closetimeo=1)

逆に、,retrans=0,echo_interval=1にしたらコピーが失敗し、ファイルも破損した。

※echo_interval=0はkernelの仕様上許可されない設定範囲らしい

■このほかの考慮点

Webサーバ(バックエンドWebサーバとフロントエンドリバースプロキシ)の両方でTimeout値が存在し、httpd2.4ではデフォルト値は60秒。こちらに抵触してWeb通信がエラーになることがあるらしいが、この場合はWebクライアント側で通信が失敗したことが検知されるはずなので、クライアント側に誤って壊れたコンテンツがダウンロードされることはないらしい。クライアント側がブラウザならエラー画面が表示され、APIクライアントならやはりhttp通信の失敗が検知されるらしい。

 

ーーーーーーーーーーー以後したがきーーーーーーーーーーーーーーーーーーー

📋 本番作業時の想定挙動リスト(ネットワーク瞬断影響)

1. 前提条件と環境構成

  • 作業内容: Web/DBサーバーが経由するネットワーク機器の再起動(想定通信断絶時間: 最大80秒間)
  • アクセス領域: ApacheのDocumentRootは、別の共有サーバーからSambaマウント(cifs)されている
  • 処理内容: 静的コンテンツ(5GB等)のダウンロード、およびDB(PostgreSQL)に対するユーザー認証(SELECT文のみの参照処理)
  • クライアント要件: コンテンツ破損は絶対に不可(NG)。ただし、エラー検知後のクライアント側でのリトライ(再試行)は許容とする。


2. 各レイヤーにおける想定挙動とタイムアウト値

📂 ① ストレージ層(Sambaマウント / CIFS)

  • 適用オプション: retrans=1, echo_interval=60(デフォルト値、または明示的指定)
  • 想定挙動:
    • 機器の切断が発生しても、OSの低レイヤー(TCP Retransmission)が自動的にパケット再送を繰り返し、最大数分間(約15分)バックグラウンドで粘り続けます。
    • 80秒の切断であれば、Sambaマウントは「Host is down」等の致命的エラー(マウント解除)にはならず、セッションを完全に維持(暗黙の再マウント)します。
  • データ整合性: cache=strict の働きにより、ファイルが「虫食い(破損)」の状態で読み込まれることは絶対にありません。

🌐 ② Webサーバー層(Apache httpd 2.4 / nginx)

  • 適用設定: Apache Timeout 120 / nginx proxy_read_timeout 120s(★60秒から変更済)
  • 想定挙動:
    • Sambaマウント層がバックグラウンドで粘っている間、Web層へデータが届かなくなるため、Apacheとnginxのタイムアウトタイマーが一斉にカウントを開始します。
    • タイムアウト値を 120秒 に拡張しているため、80秒の瞬断中もWebサーバー側が先に諦めてセッションをブチ切ることはありません。 機器が復帰(80秒後)した瞬間に、データ転送が何事もなかったかのように再開されます。
    • ※もしデフォルト(60秒)のままだった場合は、80秒を待てずにWebサーバーが接続を切り、クライアントへエラーを返します(これも仕様上検知可能なので許容内です)。

🗄️ ③ データベース層(PostgreSQL)

  • 対象処理: ユーザー認証用の SELECT 文(参照のみ)
  • 想定挙動:
    • Sambaと同様にTCPプロトコル上で動いているため、数十秒〜80秒の瞬断であればOSのTCP再送が自動で耐え、復帰後に正常にクエリ結果が返ります。
    • データ整合性: データの書き換え(INSERT/UPDATE)を行わないため、DB内のユーザーアカウント情報が破損・消失するリスクは「ゼロ」です。
    • ※アプリやDB側で statement_timeout が短く(30秒など)設定されている場合、瞬断中にログインを試みた一部のユーザーが「認証タイムアウト(500/504等)」になりますが、データは守られます。

💻 ④ クライアント層(Webブラウザ / APIクライアント)

  • 想定挙動:
    • ブラウザ(Chrome/Edge等): HTTPヘッダーの Content-Length を厳密にチェックしています。万が一サーバー側のタイムアウト(60秒など)が先に発動して途中で通信が切れた場合、一時ファイルを隔離して画面に「失敗 - ネットワークエラー」と赤字で明確に表示します。壊れたファイルを正常として保存する盲点は一切ありません。
    • APIクライアント: データの不足、あるいはTCPソケットの突然の切断をプログラム上の「例外(Exception)」として100%確実に検知します。
    • リトライ実行時: クライアントがエラーを検知してリトライをかければ、復帰後は確実に100%正しいファイルを最初から(または続きから)取得し直すことができます。