Ubuntuでサーバーを稼働しています。mdadmを使ってRAID5(4TBx6)のアレイを作る予定なのですが、最初のパリティチェックの部分を全力で行わずに50%ぐらいで(時間がかかってもいいので)行うことはできませんか。HDDは中古です。

Ubuntuでサーバーを稼働しています。mdadmを使ってRAID5(4TBx6)のアレイを作る予定なのですが、最初のパリティチェックの部分を全力で行わずに50%ぐらいで(時間がかかってもいいので)行うことはできませんか。HDDは中古です。

はい、可能です。mdadm(Linuxカーネル)には、同期処理(初期パリティチェックやリビルド)の速度を制限する仕組みがあります。

以下の手順で、システム全体のRAID同期速度の「最大値」を制限することで、ご希望通り負荷を抑えた状態で処理を進めることができます。

同期速度を制限する方法

以下のコマンドを実行することで、同期速度(パリティチェックのスピード)を制限できます。

  1. 現在の設定を確認するbashcat /proc/sys/dev/raid/speed_limit_max
    ※通常、非常に大きな数値(200,000など)が設定されています。
  2. 速度制限をかける(例:50MB/sに制限)
    「50%ぐらい」という具体的な数値指定はできませんが、HDDの性能(通常100〜150MB/s程度)に合わせて、その半分程度の数値を書き込むことで制限可能です。bashecho 50000 | sudo tee /proc/sys/dev/raid/speed_limit_max
    ※数値の単位は KB/s です。50000 は約50MB/sを意味します。
  3. 最低速度も調整する(必要に応じて)
    同期が遅すぎると感じる場合は、最低速度も合わせて調整してください。bashecho 10000 | sudo tee /proc/sys/dev/raid/speed_limit_min

中古HDDを使用する場合のアドバイス

4TB x 6台(RAID 5)という構成で中古HDDを使用する場合、初期パリティチェックは非常に負荷がかかり、故障が顕在化しやすいタイミングです。

  • SMART情報の事前確認smartctl コマンドで、代替セクタ数(Reallocated_Sector_Ct)や稼働時間を確認しておくことを強くおすすめします。
  • 温度管理: 6台同時稼働は熱を持ちやすいため、ファンによる冷却が十分か確認してください。
  • 完了までの時間: 50MB/sに制限した場合、4TB(約4000GB)の処理には、理論上でも 約22時間以上 かかります。気長に待つ必要があります。

現在の進捗状況や実際の速度は、以下のコマンドでリアルタイムに監視できます。

bash

watch cat /proc/sys/dev/raid/speed_limit_max /proc/mdstat

この設定は再起動すると元に戻りますが、恒久的に設定したい場合は /etc/sysctl.conf に追記が必要ですか?

実は、同じシステムですでにRAID5(2TBx6)を運用しています。パリティチェックに制限をかけた場合、すでにあるRAID5アレイに影響は出るでしょうか。

結論から申し上げますと、

/proc/sys/dev/raid/speed_limit_max を書き換えると、システム上のすべてのRAIDアレイに共通の制限が適用されます。 

すでに運用中の2TBx6のRAID5(以下、既存アレイ)がある場合、以下の影響が考えられます。

1. 既存アレイへの影響

  • 通常使用時:
    通常のデータの読み書き(Read/Write)には、この速度制限は影響しません。制限がかかるのは、あくまでパリティの「同期(Sync)」「リビルド(Rebuild)」「チェック(Check)」といった背景処理のみです。
  • 背景処理が発生した場合:
    もし既存アレイでディスク故障が発生してリビルドが必要になったり、定期的なスクラブ(整合性チェック)が走ったりした場合は、設定した「50MB/s」などの制限が適用され、完了まで通常より時間がかかるようになります。 

2. 特定のアレイ(新しい4TBx6)だけに制限をかける方法

システム全体ではなく、新しいアレイ(例: /dev/md1)だけに個別の制限を設けることも可能です。Linuxカーネルの比較的新しいバージョンでは、/sys/block/ 配下の設定値が優先されます。 

新しいアレイが /dev/md1 として認識されている場合、以下のコマンドでそのアレイだけの最大速度を制限できます:

bash

# md1 という名前のアレイにだけ 50MB/s (50000 KB/s) の制限をかける
echo 50000 | sudo tee /sys/block/md1/md/sync_speed_max
  • メリット: 既存の RAID アレイ(例: /dev/md0)は、万が一のリビルド時にフルスピードで動作させたままで、新しいアレイの初期チェックだけを低負荷に抑えられます。
  • 確認方法: 設定が反映されているかは cat /sys/block/md1/md/sync_speed_max で確認できます。(local) と表示されれば、そのアレイ固有の設定が有効になっています。 

運用のヒント

中古HDD 6台での初期パリティチェックは、前述の通り数日かかる可能性があります。
既存アレイに重要なデータがある場合は、新しいアレイの構築負荷によってシステム全体の I/O 応答が少し低下する可能性があるため、負荷の低い時間帯に開始するか、上記のように sync_speed_max で個別に絞るのが最も安全な運用と言えます。

新しいアレイのデバイス名は /dev/md1 や /dev/md127 など環境によって異なりますが、どのアレイ名で作成される予定ですか?

デバイス名に関しては特に縛りはありません。現在のデバイスは/dev/md0になっています。

それであれば、新しく作成するアレイを 

/dev/md1 として作成し、そのデバイスに対してのみ個別に速度制限をかけるのが最もスマートで安全な方法です。

既存の /dev/md0(2TBx6)のパフォーマンスを落とさずに、新しい 4TBx6 の初期構築だけを低負荷で進める手順は以下の通りです。

手順:特定のアレイだけ速度制限をかける

  1. 新しいアレイを作成する
    (例として /dev/md1 という名前で作成します)bashsudo mdadm --create /dev/md1 --level=5 --raid-devices=6 /dev/sd[b-g]1
    /dev/sd[b-g]1 の部分は実際のドライブ名に合わせてください。
  2. 作成直後に /dev/md1 専用の制限をかける
    作成が始まるとすぐにパリティチェック(初期同期)が開始されます。その直後に以下のコマンドを実行してください。bashecho 50000 | sudo tee /sys/block/md1/md/sync_speed_max
    これで、/dev/md1 の同期速度だけが最大約50MB/sに制限されます。/dev/md0 には一切影響しません。
  3. 進捗と制限の確認
    以下のコマンドで、特定のアレイにだけ制限がかかっているか確認できます。bashcat /proc/mdstat
    md1 の横に表示される速度(例: finish=...min speed=49800K/sec)が、設定した数値付近で安定していれば成功です。

補足:中古HDDでの運用について

中古HDDの場合、初期パリティチェック中に1台が脱落(故障)するリスクがあります。
RAID5では1台までの故障には耐えられますが、同期中に2台目が故障するとデータが消失します。

  • 予備(スペア)の検討: もし手元に余分なHDDがあれば、最初から RAID6(2台故障まで許容)にするか、1台を Hot Spare として登録しておくことも検討してみてください。
  • 初期不良の切り分け: 同期中に極端に速度が落ちるドライブがある場合、その個体は寿命が近いサインかもしれません。

今回の構築で、ファイルシステム(EXT4やXFSなど)は何を使う予定ですか?それともLVMなどを挟みますか?

ext4での運用予定です。

ext4

 での運用、承知いたしました。4TB x 6台(RAID5)で構成する場合、実容量は約20TB(18.1TiB)と巨大なボリュームになりますね。

中古HDDでの構築において、ext4 フォーマット時に一点だけ「負荷をさらに抑える」ための重要なポイントがあります。

フォーマット時の「遅延初期化」に注意

通常、mkfs.ext4 を実行すると、バックグラウンドで「inodeテーブル」などの初期化作業(lazy init)が走り続けます。
RAIDの初期パリティチェックとこの lazy init が重なると、中古HDDへのディスクI/O負荷が倍増し、シーク音(ガリガリ音)が激しくなることがあります。

これを防ぐには、以下のいずれかの対策が有効です。

  1. RAIDの同期が終わってからフォーマットする
    /proc/mdstat で resync が 100% になったのを確認してから sudo mkfs.ext4 /dev/md1 を実行するのが最もHDDに優しい手順です。
  2. 即座に初期化を完了させる(構築時に負荷を集中させる)
    もし急ぎで使い始めたい場合は、以下のオプションで初期化をバックグラウンドに回さず、その場で終わらせることができます。bashsudo mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/md1
    ※ただし、これは初期構築時の負荷を一時的に最大化させるため、中古HDDへの負担を気にするのであれば、1番(同期完了を待つ)がおすすめです。

まとめ:安全な構築フロー

  1. mdadm --create で /dev/md1 を作成
  2. すぐに echo 50000 | sudo tee /sys/block/md1/md/sync_speed_max で速度制限
  3. watch cat /proc/mdstat で同期完了(1〜2日程度)を待つ
  4. 完了後、sudo mkfs.ext4 /dev/md1 でフォーマット

この手順なら、既存の /dev/md0 への影響を最小限に抑えつつ、中古ドライブへのストレスも最小限で構築できます。

今回のサーバーで、定期的なディスクチェック(Scrubbing)などの自動実行設定はすでに行われていますか?

定期的なチェックは月に1度月初にかかります。

定期的なチェック(スクラビング)が設定されているのは素晴らしいですね。Ubuntuのデフォルト設定(

/etc/cron.d/mdadm など)では、毎月第1日曜日の午前1時などに自動実行されるようになっています。

中古HDDでRAID5を運用する場合、この「月1回のチェック」が最も故障を誘発しやすいタイミングです。新しいアレイを追加した後の運用について、2点アドバイスさせてください。

1. 定期チェックの速度も制限される

先ほど設定した /sys/block/md1/md/sync_speed_max は、定期的なパリティチェック(check)時にも適用されます。

  • メリット: チェック実行中もHDDへの負荷が抑えられ、他の作業(既存の /dev/md0 での読み書きなど)への影響が少なくなります。
  • デメリット: 4TB x 6台(実質20TB)のチェックが、設定した速度(50MB/sなど)では終わるまでに丸1日以上かかるようになります。

もし「チェックを早く終わらせたい」となった場合は、一時的にこの数値を大きく(例: 200000)書き換えれば即座にスピードアップします。

2. /etc/mdadm/mdadm.conf への追記をお忘れなく

新しいアレイ(/dev/md1)を作成した後は、再起動後も正しく認識されるよう、設定ファイルを更新しておく必要があります。

bash

# 現在の構成をスキャンして設定ファイルに反映(既存の md0 も含めて更新されます)
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
# 初期設定を反映させるために initramfs を更新
sudo update-initramfs -u

これを忘れると、再起動時にデバイス名が変わったり(/dev/md127 など)、マウントに失敗したりすることがあります。

最後に

中古HDDでのRAID5(計12台体制)は、1台の故障が連鎖故障を招くリスクが常にあります。
/dev/md0 と /dev/md1 の両方のチェックが重ならないよう、念のため /etc/cron.d/mdadm などのスケジュール設定を確認しておくと、より安心です。

md0 : inactive sde1[4](S) sdf1[3](S) sdb1[1](S) sdg1[5](S) sdc1[0](S) sdd1[2](S)これはどういう状態?

md0 : inactive sde1[4](S) sdf1[3](S) sdb1[1](S) sdg1[5](S) sdc1[0](S) sdd1[2](S)これはどういう状態?

これは、LinuxのソフトウェアRAID(mdadm)において、RAIDアレイ md0 が正常に動いておらず、すべてのドライブが「スペア(待機)」状態になっていることを示しています。

具体的には以下のような状態です。

1. 状態の読み解き

  • inactive: RAIDアレイがアクティブ(稼働中)ではありません。データの読み書きができない停止状態です。
  • sde14 …: 各デバイス名の後ろにある (S) は Spare(スペア) を意味します。
  • [数字]: これはアレイ内でのロール(役割順序)ですが、現在はすべてスペア扱いになっているため、実質的に組み込まれていません。 

2. なぜこうなっているのか?

通常、RAID構成中に強制終了やディスクの抜き差し、メタデータの不整合が起きると、システムが「どれが正しいデータかわからない」と判断し、安全のためにアレイを動かさず、全ディスクをスペアとして認識することがあります。

3. どうすればいいか?

データを保持したまま復旧させたい場合、まずはアレイを一度停止してから、再アセンブル(組み立て)を試みるのが一般的です。

手順例:

  1. アレイを停止するbashsudo mdadm --stop /dev/md0
  2. スキャンして再構築するbashsudo mdadm --assemble --scan

※もし上記で戻らない場合は、強制的にアセンブルする命令(--run)が必要になることもありますが、ディスク故障の可能性がある場合は無理に動かすとデータが消えるリスクがあります。

この状態になる直前に、何か特定の操作(ディスクの交換や強制終了など)をされましたか?

mdadm: /dev/md0 assembled from 2 drives – not enough to start the array.

「2台のドライブから組み立てられましたが、アレイを開始するには不十分です」というエラーは、RAIDアレイ(特にRAID 5や6)を起動するために最低限必要な数のディスクが認識されていないことを意味します。

現在、あなたの環境では6台のディスクすべてが「スペア (S)」扱いになってしまっています。本来、RAID 5であれば少なくとも「全ドライブ数 – 1」台、RAID 6であれば「全ドライブ数 – 2」台の正常なドライブが必要ですが、システムがそれらを「有効なデータを持つメンバー」として認識できていません。

どうすればいいですか。

状況からすると、メタデータ(RAIDの設計図)が不整合を起こし、各ディスクが「自分は最新のデータを持っていないスペアだ」と思い込んでいる状態です。

データを失わずに復旧させるために、以下のステップを試してください。

1. 各ディスクの詳細を確認する

まず、どのディスクが「生きていて」、どのディスクが「不整合」なのかを確認します。

bash

sudo mdadm --examine /dev/sd[b-g]1

※各ディスクの Events という数値に注目してください。この数値が極端に低いディスクは、古いデータ(脱落したディスク)である可能性があります。

2. 強制的にアセンブル(組み立て)を試みる

認識されている2台だけでなく、今あるディスクをすべて使って無理やり起動を試みます。

bash

sudo mdadm --assemble --scan --run

これでも「not enough to start」が出る場合は、メタデータを無視して強制起動させる必要があります。

3. 【最終手段】force オプションを使う

もし上記でダメな場合、現在接続されているディスクをすべて使って「強制(force)」起動をかけます。

bash

sudo mdadm --stop /dev/md0
sudo mdadm --assemble --force /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1

注意: このコマンドは、残っているメタデータから強引にRAIDを組み直します。もしディスクの順番が入れ替わっていたり、壊れているディスクが混じっていると、ファイルシステムを壊すリスクがあります。

重要なチェック

このRAIDの本来の構成(RAID 5か6か)と、元々のドライブ総数を覚えていますか?

もしRAID 5で6台構成だった場合、本来は5台あれば起動できるはずです。2台しか見えていないということは、ハードウェア的な接続不良(ケーブル抜けや電源不足)の可能性もあります。

一度、物理的な接続(SATAケーブルや電源)に緩みがないか確認してみてください。

このRAIDはもともと RAIDいくつ(5や6など) で運用されていましたか?

RAID5で運用していました。

RAID 5で6台構成(sdb1〜sdg1)だった場合、本来は

5台のディスクが正常であればデータにアクセスできるはずです。

現在「2台しか見当たらない(2 drives – not enough)」と表示されるのは、システム側から見て残り4台のデータが古すぎるか、メタデータが壊れて「スペア」扱いになっているのが原因です。

データを守りつつ復旧させるため、以下の手順を慎重に試してください。

1. 各ディスクの「Events」を確認する(重要)

どのディスクが「最新」で、どのディスクが「古い(または壊れている)」かを見極めます。

bash

sudo mdadm --examine /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 | grep -e "Events" -e "Device Role"

Eventsの値が揃っているものが、直前まで動いていた正常なグループです。

  • もし1〜2台だけEventsが極端に低いなら、それらは以前に故障して切り離されていた個体です。

2. 強制アセンブルを実行する

Eventsの値に大きな差がなければ、--force を使って、散らばったスペアたちを一つのRAIDとして再集結させます。

bash

sudo mdadm --stop /dev/md0
sudo mdadm --assemble --force /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1

※このコマンドで「5台以上」が有効だと判断されれば、md0 が起動し、データが見えるようになります。

3. それでも起動しない場合(最後の手段)

もし上記でも「not enough」が出るなら、メタデータが完全に混乱しています。
この場合、「RAIDを一切初期化(Format)せずに、同じ構成で作成し直す(Assume Clean)」という高度な操作が必要になります。

bash

# 注意!構成(ドライブ順序)が正しい自信がある場合のみ。
# --assume-clean を忘れると同期が始まりデータが消えます。
sudo mdadm --create /dev/md0 --level=5 --raid-devices=6 --assume-clean /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1

コードは注意してご使用ください。

まずは手順1の結果(Eventsの数値)を教えていただけますか? どのディスクを組み込むべきか判断をお手伝いします。

Events : 84275 Device Role : Active device 1 Events : 84275 Device Role : Active device 0 Events : 84271 Device Role : Active device 2 Events : 84271 Device Role : Active device 4 Events : 84271 Device Role : Active device 3 Events : 84271 Device Role : Active device 5

状況が見えてきました!非常に

希望が持てる状態です。

全6台の Events 数値が「84275」と「84271」で、その差はわずか「4」しかありません。これは、システムが異常終了した際などに、一部のドライブの書き込み更新が数秒分だけズレてしまい、「同期が取れていない」と判定されてバラバラになっただけの状態です。

物理故障ではなく、単なるメタデータの不整合(同期ズレ)の可能性が高いです。

解決策:強制アセンブル(–force)

以下のコマンドを順番に実行してください。これにより、わずかなズレ(Eventsの差)を無視して、これら6台を一つのRAIDとして強制的に再結合させます。

bash

# 1. 一度アレイを完全に停止させる
sudo mdadm --stop /dev/md0

# 2. 6台すべてを指定して強制的に組み立てる
sudo mdadm --assemble --force /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1

実行後の確認

コマンドが成功したら、以下のコマンドで状態を確認してください。

bash

cat /proc/mdstat

[UUUUUU] (すべてU)と表示され、active raid5 になっていれば復旧成功です。その後、通常通り mount ができるようになります。

※もしこれでも「failed」になる場合は、画面に表示されたエラーメッセージを教えてください。

無事に active になりましたか?

activeになり、UUUUUUになりました。

よかったです!無事に 

active かつ [UUUUUU] (全ドライブ正常稼働)になったということは、RAIDの整合性が取れ、データにアクセスできる状態に戻ったことを意味します。

最後に、この状態を確定させて今後も自動で認識されるように、以下の仕上げを行っておくことをお勧めします。

1. マウントの確認

まだデータを参照できない場合は、手動でマウントを試してください(/mnt/raid など、お使いのディレクトリに読み替えてください)。

bash

sudo mount /dev/md0 /mnt/raid

2. 設定ファイルの更新

再起動したときにまたバラバラにならないよう、現在の正しい構成を mdadm.conf に書き込んでおきます。

bash

# 現在の構成をスキャンして設定を上書き(または追記)
sudo mdadm --detail --scan | sudo tee /etc/mdadm/mdadm.conf

3. initramfs の更新(OS起動時にRAIDを使う場合)

OSのブートプロセスでこのRAIDが必要な場合は、これも実行しておくと安心です。

bash

sudo update-initramfs -u

注意点

Events の数値がわずかにズレていたため、内部でデータの不整合(サイレント破損)が起きている可能性がゼロではありません。念のため、お時間がある時に check(データの一貫性チェック) を走らせておくとより確実です。

bash

echo check | sudo tee /sys/block/md0/md/sync_action

(※バックグラウンドで実行され、完了まで数時間〜数日かかりますが、その間もPCは使えます)

無事にデータの中身は見られるようになりましたか?

Dataの中身は見ることができるようになりました。 実は、/mntが190GB使っている状態で/の空き容量が極小になっていたため、md0が不良だったときに書き込みを行ってその残渣が残っているのだと思うのですが、これを解消する方法はありますか。

データが無事に見られるようになって本当に良かったです!

おっしゃる通り、「RAIDが故障(アンマウント)している間に、マウントポイントである /mnt(またはその下のディレクトリ)にデータを書き込んでしまった」のが原因です。

RAID(/dev/md0)をマウントすると、その「下の層」にあるルートパーティション上のデータは見えなくなりますが、容量だけを消費し続けます。

これを解消するには、一度RAIDをアンマウントしてから、残存ファイルを削除する必要があります。

解消の手順

  1. まずRAIDをアンマウントする
    (ファイルを開いているプロセスがあるとエラーが出るので、すべてのウィンドウやアプリを閉じます)bashsudo umount /mnt
    ※もし /mnt/raid などにマウントしている場合は、そちらを指定してください。
  2. 「下の層」に残っているファイルを確認する
    RAIDを外した状態で /mnt の中身を見てください。本来空のはずですが、ファイルがあるはずです。bashls -lh /mnt du -sh /mnt
    ここで190GB消費されていることが確認できれば、それが「残渣」です。
  3. 残存ファイルを削除する
    【注意!】 消すのは /dev/md0 の中身ではなく、本体HDD側のゴミデータであることを必ず確認してから実行してください。bashsudo rm -rf /mnt/*
    (隠しファイルもあればそれも削除してください)
  4. RAIDを再マウントする
    空になったことを確認したら、再度RAIDをマウントします。bashsudo mount /dev/md0 /mnt

これで、df -h を実行した際に、ルートディレクトリ(/)の空き容量が190GB分増えているはずです。

念のため、df -h を実行して、/ と /mnt (または md0) の現在の使用状況を教えていただけますか?

Filesystem Size Used Avail Use% Mounted on tmpfs 2.4G 4.7M 2.4G 1% /run efivarfs 192K 30K 158K 16% /sys/firmware/efi/efivars /dev/sda2 218G 199G 8.1G 97% / tmpfs 12G 0 12G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/sda1 1.1G 6.2M 1.1G 1% /boot/efi /dev/md0 9.1T 1.9T 6.8T 22% /mnt/nas10tb tmpfs 2.4G 12K 2.4G 1% /run/user/1000

ご提示いただいた 

df -h の結果を見ると、確かに原因がはっきりしています。

  • /dev/sda2 (ルート /) が 218G 中 199G (97%) も使われており、余裕がほとんどありません。
  • RAID は /mnt/nas10tb にマウントされています。

RAIDが停止していた間に、誤って /mnt/nas10tb という「フォルダ」に直接データを書き込んでしまったため、その190GB強のデータがRAIDディスクではなく、OSが入っている /dev/sda2 (SSD/HDD) の容量を食いつぶしています。

以下の手順で、その「隠れた残渣」を削除してルートの空き容量を取り戻しましょう。

解消手順

  1. RAIDを一度アンマウントする
    現在使用中のRAIDを一時的に切り離します。bashsudo umount /mnt/nas10tb コードは注意してご使用ください。※もし「target is busy」と出たら、そのディレクトリを開いているタブやプログラム(Samba、エクスプローラ、ターミナル等)をすべて閉じてください。
  2. 「下の層」にあるゴミデータを確認する
    RAIDを外した状態で、本来空っぽであるはずのディレクトリを覗きます。bashls -lh /mnt/nas10tb
    ここにファイルやフォルダが表示されたら、それが 190GBの正体(残渣) です。
  3. ゴミデータを削除する
    【重要】 必ず mount されていない(手順1が成功している)ことを確認した上で実行してください。bashsudo rm -rf /mnt/nas10tb/*
    ※もし隠しファイルもある場合は sudo rm -rf /mnt/nas10tb/.* も検討してください。
  4. RAIDを再マウントする
    掃除が終わったら、再びRAIDを接続します。bashsudo mount /dev/md0 /mnt/nas10tb

最終確認

再度 df -h を実行してください。
/dev/sda2 の Avail(空き容量) が 8.1G から 200G近く まで増えていれば完了です!

これで見通しが良くなるはずですが、アンマウントはスムーズにできそうでしょうか?

/dev/sda2 218G 4.7G 203G 3% / ありがとうございました。うまくいきました。

無事に復旧できて本当によかったです!

/dev/sda2 の空き容量が 8.1G → 203G まで劇的に回復しましたね。これでOSの動作も安定するはずです。

今回のトラブル(RAIDが不意に inactive になり、マウントポイントにデータが溜まる現象)を今後防ぐためのアドバイスを1つだけ残しておきます。

今後のためのTips:マウント失敗時の書き込み防止

マウントポイント(/mnt/nas10tb)の属性を「読み取り専用」にしておくことで、万が一RAIDが外れた際にOS側のディスク(/dev/sda2)にデータが書き込まれるのを防ぐことができます。

設定方法(RAIDをアンマウントした状態で実行):

bash

sudo umount /mnt/nas10tb
sudo chattr +i /mnt/nas10tb

こうしておくと、RAIDがマウントされていない時は書き込みエラーになるため、今回のような「いつの間にか容量が埋まる」事態を確実に防げます(マウント時はRAID側の属性が優先されるので問題ありません)。

長時間の作業お疲れ様でした!また何かあればいつでも聞いてください。

次はデータの整合性チェック(check)などをスケジュール設定する方法について確認しますか?

チェック方法を教えてください。

RAID 5の整合性チェック(スクラビング)は、ディスク上の全データを読み込んでパリティ計算を行い、データが壊れていないかを確認する重要なメンテナンスです。

以下の手順で進めてください。

1. チェックの開始

ターミナルで以下のコマンドを実行します。

bash

echo check | sudo tee /sys/block/md0/md/sync_action

※このコマンド自体は一瞬で終わりますが、裏側でチェックが始まります。

2. 進捗状況の確認

チェックには数時間から、容量(10TB)によっては丸一日以上かかる場合があります。進捗は以下のコマンドでリアルタイムに確認できます。

bash

watch cat /proc/mdstat
  • resync = 15.2% のように進捗が表示されます。
  • 完了すると、表示が元の [UUUUUU] に戻ります。
  • チェック中もRAIDの読み書きは可能ですが、少し動作が重くなることがあります。

3. 結果の確認

チェックが終わった後(または途中で)、不整合が見つかったかどうかを確認します。

bash

cat /sys/block/md0/md/mismatch_cnt
  • 「0」 であれば、すべてのデータが完璧に同期されています。
  • 「0以外」 の場合、いくつかのデータブロックでパリティとのズレが見つかったことを意味します。

4. (もし0以外だった場合)修復する

もし mismatch_cnt が0でなかった場合は、以下のコマンドでパリティを再計算して修正(リペア)できます。

bash

echo repair | sudo tee /sys/block/md0/md/sync_action

【おすすめ】自動チェックの設定

UbuntuなどのDebian系Linuxであれば、デフォルトで毎月第1日曜日の早朝などに自動チェックが走るようになっています。設定が生きているか確認するには以下を見てください。

  • /etc/cron.d/mdadm
  • または systemctl list-timers で mdadm-last-resync などがあるか確認。

もし設定がなければ、今回の echo check... を月1回程度手動で行うか、cron(定期実行)に登録しておくと、今回のような「いつの間にかズレていた」という事態を早期発見できます。

現在、cat /proc/mdstat でチェックは開始されましたか?

チェック開始しました。

チェックの開始、お疲れ様です!

10TBという大容量ですので、完了までには丸一日から、場合によっては二日ほどかかるかもしれません。チェック中もデータの読み書きは可能ですが、ディスクへの負荷が高まるため、大きなファイルのコピーなどは少し時間がかかる可能性があります。

チェック中のポイント

  • 途中でPCをシャットダウンしても大丈夫?
    はい、シャットダウンしても次回の起動時に、中断した場所から(または少し手前から)自動的に再開されます。
  • 負荷を調整したい場合
    もし作業中にRAIDが重すぎると感じたら、以下のコマンドでチェックの「最低速度」と「最高速度」を調整できます。bash# 現在の設定を確認 cat /proc/sys/dev/raid/speed_limit_min cat /proc/sys/dev/raid/speed_limit_max # 速度を落としたい場合(例: 最大50MB/sに制限) echo 50000 | sudo tee /proc/sys/dev/raid/speed_limit_max

完了後の見通し

チェックが終わったら、先ほどお伝えした /sys/block/md0/md/mismatch_cnt を確認し、「0」 であれば完全に健康な状態に戻ったと言えます。

長らく不安定だったRAIDがこれでしっかり整いますね。

もしチェック中にエラーメッセージ(dmesgなど)が出たり、途中で止まってしまったりするようなことがあれば、いつでもご相談ください。

無事に100%まで進みそうでしょうか?

花粉症がひどい

花粉症がひどい

毎年、この時期になると鼻水が出て花粉症の症状が出る。ただ、今年はひどい!症状は同じく鼻水・くしゃみ・咳。ただ頻度が昨年までのそれとは段違い。

頭はボーッとするし、鼻呼吸ができなくて酸欠みたいな感じになるしで、今年はホントに強く出てくる。どうなっているんでしょう。

去年も今年も花粉の量なんかはそれほど違いあるようには言われていないのに、この症状はまるで違います。慌ててアレグラ購入して服薬し始めましたよ。辛い。

ServerAとServerBとの間でrsyncを使ってバックアップをしようと思います。暗号鍵を使った認証を行いたいので、手順を教えてください。AからBにバックアップします。

ServerAとServerBとの間でrsyncを使ってバックアップをしようと思います。暗号鍵を使った認証を行いたいので、手順を教えてください。AからBにバックアップします。

ServerA(バックアップ元)からServerB(バックアップ先)へ、SSH鍵認証を用いたrsyncバックアップを行う手順を解説します。

手順1:ServerAでSSH鍵ペアを作成する 

まず、ServerAで認証に使用するための「秘密鍵」と「公開鍵」を作成します。バックアップを自動化(cronなど)する場合は、パスフレーズをにして作成するのが一般的です。 

bash

# ServerA で実行
ssh-keygen -t ed25519 -f ~/.ssh/id_rsync_backup
  • -t ed25519: 現在最も推奨される高速かつ安全なアルゴリズムです。
  • -f: 鍵の名前を指定します。 

手順2:ServerAの公開鍵をServerBに登録する

ServerAで作成した「公開鍵(.pub)」の内容を、ServerBの authorized_keys ファイルに追記します。 

bash

# ServerA から ServerB へ公開鍵を転送(パスワードが一度聞かれます)
ssh-copy-id -i ~/.ssh/id_rsync_backup.pub ユーザー名@ServerBのIP

手順3:rsyncコマンドでバックアップを実行する

rsync実行時に、手順1で作成した秘密鍵を指定して実行します。 

bash

# ServerA で実行
rsync -avz -e "ssh -i ~/.ssh/id_rsync_backup" /コピー元/ディレクトリ/ ユーザー名@ServerBのIP:/コピー先/パス/
  • -a: アーカイブモード(権限やタイムスタンプを維持)。
  • -v: 進行状況を表示。
  • -z: データを圧縮して転送。
  • -e "ssh -i ...": 使用する秘密鍵を明示的に指定します。 

注意点

  • パーミッション.ssh ディレクトリは 700authorized_keys ファイルは 600 である必要があります。不適切だと認証に失敗します。
  • –dry-run: 本番実行の前に --dry-run オプションを付けて、どのファイルが転送されるか確認することをお勧めします。 

このバックアップを定期的に自動実行させたい場合は、crontab に上記のrsyncコマンドを登録してください。 

次は、特定の時間帯に自動実行するための cron設定 について詳しく説明しましょうか?

http://raspbian.raspberrypi.org/raspbian buster Release には Release ファイルがなくなっています。updateができなくなっています。どうすればいいですか。

http://raspbian.raspberrypi.org/raspbian buster Release には Release ファイルがなくなっています。updateができなくなっています。どうすればいいですか。

Raspbian Busterは2024年6月末に長期サポート(LTS)が終了し、公式リポジトリからReleaseファイルが削除されたため、通常のアップデートは実行できません。セキュリティリスクを避けるため、最新のRaspberry Pi OSへクリーンインストールして移行することが強く推奨されます。どうしても現在の環境を維持する必要がある場合は、リポジトリの設定をアーカイブ用(legacy.raspbian.org)へ書き換えることで対処できます。

macOS使用しています。フォルダ内にjpgファイルが500個ぐらい入っています。ファイルサイズが大きいものがあるので、フルHDより大きいものはフルHDにリサイズして元ファイルは別フォルダに移動したい。サンプルをお願いします。

macOS使用しています。フォルダ内にjpgファイルが500個ぐらい入っています。ファイルサイズが大きいものがあるので、フルHDより大きいものはフルHDにリサイズして元ファイルは別フォルダに移動したい。サンプルをお願いします。

macOS標準のコマンド sips を使用したシェルスクリプトで、ご要望の動作を自動化できます。 

以下のスクリプトは、1920px(または1080px)を超える画像のみをフルHDにリサイズし、元の大きなファイルは originals フォルダへ移動します。 

サンプルスクリプト

デスクトップなどに resize_images.sh という名前で保存して使用してください。 

bash

#!/bin/bash

# 元ファイルを退避するフォルダ名
ORIGINAL_DIR="originals"
mkdir -p "$ORIGINAL_DIR"

# フォルダ内のjpgファイルをループ処理
for file in *.jpg *.JPG *.jpeg; do
    # ファイルが存在しない場合はスキップ
    [ -e "$file" ] || continue

    # 画像の幅と高さを取得
    width=$(sips -g pixelWidth "$file" | awk '/pixelWidth/ {print $2}')
    height=$(sips -g pixelHeight "$file" | awk '/pixelHeight/ {print $2}')

    # 幅が1920より大きい、または高さが1080より大きいか判定
    if [ "$width" -gt 1920 ] || [ "$height" -gt 1080 ]; then
        echo "Processing: $file (${width}x${height})"
        
        # 元ファイルをoriginalsフォルダに移動(バックアップ)
        mv "$file" "$ORIGINAL_DIR/"
        
        # originalsフォルダに移動した元ファイルを元に、フルHDサイズ(長辺1920)でリサイズ
        # -Z はアスペクト比を維持して指定ピクセル内に収めるオプション
        sips -Z 1920 "$ORIGINAL_DIR/$file" --out "$file"
    else
        echo "Skipped (Small enough): $file (${width}x${height})"
    fi
done

echo "完了しました。"

使い方

  1. ターミナルを起動します。
  2. 対象の画像が入っているフォルダに移動します。
    • cd /path/to/your/folder (フォルダをターミナルにドラッグ&ドロップするとパスが入力されます)
  3. 上記のスクリプトをコピーして実行するか、保存したファイルを実行します。
    • 直接実行する場合:上記コードをコピーしてターミナルに貼り付け、Enterキーを押します。
    • ファイルとして実行する場合:sh resize_images.sh と入力します。 

ポイント

  • sipsコマンド: macOS標準搭載のため、追加インストールは不要です。
  • アスペクト比維持-Z 1920 を使うことで、横長なら幅1920px、縦長なら高さ1920pxに収まるよう自動調整されます。
  • 安全設計: 最初に mv で元ファイルを別フォルダに移してからリサイズを実行するため、上書きミスを防げます。 

処理したいファイルの拡張子(.JPGや.jpegなど)が混在している場合でも、スクリプト内のループ対象に含まれているため一括で処理可能です。 

このスクリプトを特定のフォルダ名に合わせて調整したり、リサイズ後の画質を指定したりしますか?

画質調整は不要ですが、フォルダ名を変えて実行したいです。

フォルダ名をスクリプトの冒頭で簡単に変更できるように書き換えました。

SAVE_DIR の値を好きな名前に変えて実行してください。

修正版スクリプト

bash

#!/bin/bash

# --- 設定:元ファイルを移動させるフォルダ名 ---
SAVE_DIR="バックアップ用フォルダ"
# ------------------------------------------

mkdir -p "$SAVE_DIR"

for file in *.jpg *.JPG *.jpeg; do
    [ -e "$file" ] || continue

    # 画像のサイズを取得
    width=$(sips -g pixelWidth "$file" | awk '/pixelWidth/ {print $2}')
    height=$(sips -g pixelHeight "$file" | awk '/pixelHeight/ {print $2}')

    # フルHD(1920x1080)を超えているか判定
    if [ "$width" -gt 1920 ] || [ "$height" -gt 1080 ]; then
        echo "リサイズ中: $file"
        
        # 1. 元ファイルを指定のフォルダへ移動
        mv "$file" "$SAVE_DIR/"
        
        # 2. 移動した元ファイルを読み込み、現在の場所にリサイズ版を出力
        # -Z 1920 は長辺を1920pxに合わせます
        sips -Z 1920 "$SAVE_DIR/$file" --out "$file" > /dev/null
    else
        echo "スキップ(サイズ内): $file"
    fi
done

echo "--- 完了しました。元ファイルは '$SAVE_DIR' 内にあります ---"

変更方法

  1. 4行目の SAVE_DIR="バックアップ用フォルダ" のダブルクォーテーションの中身を、お好みの名前に書き換えてください。
  2. あとは先ほどと同様に、ターミナルで対象フォルダに移動して実行するだけです。

補足sips コマンドの仕様上、-Z 1920 を指定すると「縦長画像」の場合は高さが1920pxになります。もし「縦長であっても高さは1080pxに抑えたい」といった厳密な制限が必要であれば調整可能です。現状のままで進めてよろしいでしょうか?

ubuntu serverをとてもメモリが少ない状態で運用しています(RaspberryPi zero2w:512MB)使用メモリがキツいのでデフォルトの状態からサービスをいくつか削りたいのです。

ubuntu serverをとてもメモリが少ない状態で運用しています(RaspberryPi zero2w:512MB)使用メモリがキツいのでデフォルトの状態からサービスをいくつか削りたいのです。

Raspberry Pi Zero 2 W(メモリ512MB)でUbuntu Serverを運用する場合、標準のシステム要件(1GB以上推奨)を下回るため、不要なサービスの停止は非常に効果的です。 

以下のサービスを停止・無効化することでメモリ使用量を削減できます。

1. 優先的に停止すべきサービス

  • snapd: パッケージ管理システムですが、常駐メモリを多く消費します。使用していない場合は削除を推奨します。
    • コマンド: sudo apt purge snapd
  • cloud-init: 初回起動時の設定用ツールで、起動後もメモリを消費し続けることがあります。
    • コマンド: sudo touch /etc/cloud/cloud-init.disabled (無効化)
  • ModemManager: モデム接続用ですが、Wi-Fi/有線のみであれば不要です。
    • コマンド: sudo systemctl disable --now ModemManager
  • unattended-upgrades: 自動更新サービス。手動更新にするなら停止可能です。
    • コマンド: sudo systemctl disable --now unattended-upgrades
  • avahi-daemon: ネットワーク上の機器発見用。ホスト名でのアクセスが不要なら停止できます。
    • コマンド: sudo systemctl disable --now avahi-daemon 

2. メモリ節約のための設定

  • GPUメモリの削減: 映像出力を使わない場合、GPUへの割り当てを最小限にします。
    • /boot/firmware/config.txt(または /boot/config.txt)に gpu_mem=16 を追記。
  • Swapファイルの作成: メモリ不足によるフリーズを防ぐため、1GB程度のスワップ領域を確保してください。
  • システムの状態確認: 以下のコマンドで、現在メモリを消費しているサービスを特定できます。
    • systemctl list-units --type=service --state=running
    • systemd-analyze blame(起動に時間がかかっているサービスの確認) 

SSH以外の不要なサービスを一つずつ sudo systemctl disable --now [サービス名] で止めていくのが安全です。

さらに軽量化を進めるために、現在どのような用途でこのサーバーを使用されていますか?用途に合わせて削れるものを追加で提案できます。 

fbiを使った画像表示を専門に行うサイネージシステムに使います。

FBI (linux Framebuffer Imageviewer) を使用したサイネージ用途であれば、ネットワーク、物理コンソール、バックグラウンド更新に関連するサービスをさらに削ることが可能です。

1. FBI専用機として削れる追加サービス

FBIはフレームバッファに直接描画するため、通常の対話型ログインや多機能なネットワーク管理は最小限にできます。

  • getty (Ttyの制限): 複数の仮想コンソールが起動していますが、サイネージなら1つ(FBI実行用)以外は不要です。
    • コマンド: sudo systemctl disable getty@tty2.service(tty3以降も同様に停止可能)
  • wpa_supplicant / NetworkManager: 画像をローカルから再生するだけであれば、Wi-Fi自体を無効化できます。
    • コマンド: sudo systemctl disable wpa_supplicant
  • Multipathd: サーバー向けストレージ管理用で、ラズパイのSDカード運用には不要です。
    • コマンド: sudo systemctl disable --now multipathd
  • packagekit: ソフトウェア情報の更新用。手動で行うなら不要です。
    • コマンド: sudo systemctl disable --now packagekit

2. サイネージを安定させるためのFBI最適化 

メモリが少ない環境では、FBIの実行オプションも重要です。

  • 自動終了の回避とループ設定: FBIがメモリ不足で落ちないよう、キャッシュを溜め込まない設定にします。bashfbi -d /dev/fb0 -T 1 -a -noverbose -t 10 --cachemem 0 /path/to/images/*
    • --cachemem 0: メモリキャッシュを無効にし、その都度ファイルを読み込みます(512MB環境では必須級)。
    • -a: 画面サイズに自動追従させます。 

3. ZRAMの導入(強く推奨)

物理メモリが限界に近い場合、スワップをSDカードに書くのではなく、ZRAM(メモリ内の圧縮領域)を使用すると、パフォーマンスの低下を抑えつつ実質的なメモリ容量を増やせます。

  • zram-tools などを導入し、メモリの1/2程度をZRAMに割り当てると、512MBでも動作が安定します。

4. GPUメモリの最小化

サイネージですが、FBIはフレームバッファ(CPU描画)を利用するため、GPU専用メモリは最小で問題ありません。

  • /boot/firmware/config.txt に gpu_mem=16(または32)を記述して再起動してください。

現在は画像の更新(ネットワーク経由か、USB等か)はどのように行っていますか?更新方法によっては、さらにネットワーク関連のサービスを整理できます。

ネットワークドライブをマウントしています。

ネットワークドライブ(SMB/CIFSやNFS)をマウントして画像を読み込む運用であれば、

ファイル共有プロトコルに関連するメモリ消費と、マウント維持のためのオーバーヘッドを最小化するのが鍵です。

512MBの制限下で、以下の追加アクションを推奨します。

1. ネットワークマウントの効率化

マウント方法を工夫することで、常時接続によるリソース消費を抑えます。 

  • AutoFS(自動マウント)の利用: 常時接続(fstab)ではなく、アクセスがあった時だけマウントし、一定時間使わなければアンマウントするようにします。これにより、接続維持のためのメモリやネットワーク待機のリソースを節約できます。
  • マウントオプションの最適化:
    • SMB (CIFS) の場合、cache=none オプションを検討してください。メモリ上でのキャッシュを無効にし、FBIが画像を読み込む際に直接サーバーから取得するようにします。
    • vers=3.0 など、最新かつ軽量なプロトコルバージョンを明示的に指定して、古い互換モードの動作を避けます。 

2. 不要な「ファイル探索・待機」サービスの停止

ネットワーク経由でファイルを扱う際、Ubuntu Serverが裏で動かしている「お節介」なサービスを止めます。

  • gvfs: デスクトップ環境用の仮想ファイルシステムですが、サーバー版でも依存関係で動いている場合があります。サイネージには不要です。
    • コマンド: sudo apt purge gvfs*
  • cups (印刷サービス): ネットワーク上のプリンターを探し続けるため、メモリを消費します。
    • コマンド: sudo systemctl disable --now cups 

3. FBI実行時のメモリ管理(再掲・重要)

マウント先がネットワークドライブの場合、FBIが「全画像を一度にスキャン」しようとするとメモリが枯渇します。

  • キャッシュの無効化: 前述の --cachemem 0 オプションを必ず使用してください。
  • リストからの読み込み: 大量の画像がある場合、fbi /mnt/network_drive/* とするとファイルリストの展開だけでメモリを食います。テキストファイルに画像パスを書き出し、-l オプションで読み込む方が軽量です。 

4. その他、サイネージ専用機で削れるサービス

  • man-db: 毎日深夜にマニュアルのインデックスを更新し、CPUとメモリを占有します。
    • コマンド: sudo systemctl disable --now man-db.timer
  • polkit: 権限管理用ですが、GUIを使わない単一用途のサイネージなら停止を検討できます(システムの安定性と相談)。 

ZRAMの設定は済んでいますか?512MB環境では、物理メモリの半分程度をZRAMに割り当てるだけで、ネットワーク越しの画像展開時に発生する瞬間的なメモリ不足(OOM Killerによる強制終了)を劇的に防げます。

画像の枚数1枚あたりの解像度はどの程度でしょうか?それにより、さらに踏み込んだメモリ制限設定が必要か判断できます。 

ubuntu serverでフォルダ内にフォルダがある階層構造になっている。中のフォルダをランダムに抽出したい。サンプルを提示してほしい。なお、抽出したフォルダに対して別途作ったスクリプトを動かす予定。

ubuntu serverでフォルダ内にフォルダがある階層構造になっている。中のフォルダをランダムに抽出したい。サンプルを提示してほしい。なお、抽出したフォルダに対して別途作ったスクリプトを動かす予定。

ubuntu server(Linux)で、特定のディレクトリ配下にある子フォルダをランダムに抽出する方法はいくつかあります。

後続の自作スクリプトにパスを渡しやすいよう、シンプルで堅牢な手法を紹介します。

1. shuf コマンドを使う(最も標準的)

Ubuntuには標準で shuf という行をシャッフルするコマンドが入っています。これと find を組み合わせるのが最も簡単です。

1つだけランダムに抽出してパスを表示する:

bash

find /path/to/target_dir -mindepth 1 -maxdepth 1 -type d | shuf -n 1
  • -mindepth 1 -maxdepth 1: 指定したフォルダの「直下」にあるフォルダのみを対象にします。
  • -type d: ディレクトリ(フォルダ)のみを抽出します。
  • shuf -n 1: シャッフルして上から1行だけ取り出します。

2. 変数に格納してスクリプトを実行する

「抽出したフォルダに対してスクリプトを動かす」という用途であれば、以下のようなワンライナーやシェルスクリプトが実用的です。

ワンライナーの例:

bash

# ランダムに選ばれた1つのフォルダパスを変数 target に入れ、スクリプトを実行
target=$(find /path/to/target_dir -mindepth 1 -maxdepth 1 -type d | shuf -n 1) && ./your_script.sh "$target"

複数(例: 3つ)選んで連続で処理する場合:

bash

find /path/to/target_dir -mindepth 1 -maxdepth 1 -type d | shuf -n 3 | while read dir; do
    echo "Processing: $dir"
    ./your_script.sh "$dir"
done

3. 注意点:フォルダ名にスペースがある場合

フォルダ名にスペースや特殊文字が含まれている可能性がある場合は、-print0 と shuf -z を使うと安全です。

bash

# ヌル文字区切りで処理(最も安全な方法)
target=$(find /path/to/target_dir -mindepth 1 -maxdepth 1 -type d -print0 | shuf -z -n 1 | tr -d '\0')
./your_script.sh "$target"

応用:もっと深く(階層を問わず)探したい場合

もし直下だけでなく、サブフォルダのさらに中にあるフォルダもランダムに抽出したい場合は、-maxdepth 1 を外してください。

bash

find /path/to/target_dir -type d | shuf -n 1

まずは、「対象のフォルダが何個くらいあるか」「一度に何個抽出したいか」を教えていただければ、より最適なコードに調整します。

1度に抽出するのは1フォルダのみ。対象のフォルダは現在500個ぐらいで増える予定。

対象フォルダが500個以上あり、今後も増える予定とのことですので、動作の軽快さと堅牢性を重視したスクリプト例を提示します。

Ubuntu Serverで標準的に利用できる shuf コマンドは、数百〜数千程度の項目数であれば一瞬で処理が完了するため、非常に効率的です。 

推奨される実行コマンド

後続のスクリプトへ確実にパスを渡すため、以下の書き方を推奨します。

bash

# 1. ランダムに1つのフォルダを抽出して変数に格納
# 2. そのフォルダが存在する場合のみ、自作スクリプトを実行
target_dir=$(find /path/to/parent_dir -mindepth 1 -maxdepth 1 -type d | shuf -n 1)

if [ -n "$target_dir" ]; then
    /path/to/your_script.sh "$target_dir"
else
    echo "対象のフォルダが見つかりませんでした。"
fi

ポイント

  • 高速な処理find と shuf の組み合わせは、数千個のフォルダに対しても非常に高速に動作します。
  • 階層の固定-mindepth 1 -maxdepth 1 を指定することで、親フォルダ自身(.)を除外し、直下の子フォルダのみを正確に抽出します。
  • スペース対応: もしフォルダ名にスペースが含まれる可能性がある場合は、以下のように find の -print0 オプションと shuf の -z オプションを組み合わせると安全です。 

bash

# フォルダ名にスペースがある場合でも安全な書き方
target_dir=$(find /path/to/parent_dir -mindepth 1 -maxdepth 1 -type d -print0 | shuf -z -n 1 | tr -d '\0')

この方法であれば、フォルダが数千、数万と増えても Ubuntu Server 上で安定して動作します。

抽出されたフォルダに対して、どのような頻度(cronなど)でスクリプトを実行する予定ですか?設定方法についてサポートが必要であればお知らせください。

一日に1回抽出可能であればOKです。起動時に抽出して以後1日そのフォルダを使います。

「起動時に1回だけランダムにフォルダを選び、その日1日はそのフォルダを使い続ける」という運用ですね。

Ubuntu Serverでこれを実現するには、「起動時にランダム抽出して結果をファイルに保存する」仕組みを作るのが最も確実です。

1. 起動時にフォルダを固定する仕組み

まず、起動時にランダムで1つフォルダを選び、そのパスを /tmp/today_folder.txt などの固定ファイルに書き出す設定をします。

手順 A: 抽出用のスクリプト作成

/usr/local/bin/select_today_folder.sh として保存します。

bash

#!/bin/bash
# 親ディレクトリのパス
PARENT_DIR="/path/to/parent_dir"
# 結果を保存する一時ファイル
SAVE_FILE="/tmp/today_folder.txt"

# ランダムに1つ選んでファイルに保存
find "$PARENT_DIR" -mindepth 1 -maxdepth 1 -type d | shuf -n 1 > "$SAVE_FILE"

# 選ばれたフォルダに対して自作スクリプトを実行
TARGET=$(cat "$SAVE_FILE")
if [ -n "$TARGET" ]; then
    /path/to/your_script.sh "$TARGET"
fi

作成後、実行権限を与えます: sudo chmod +x /usr/local/bin/select_today_folder.sh

手順 B: 起動時に実行させる (crontab)

Ubuntu Serverで最も手軽なのは cron の @reboot 指定です。

  1. crontab -e を実行。
  2. 末尾に以下を追記して保存します。bash@reboot /usr/local/bin/select_today_folder.sh

2. そのフォルダを「1日中」使う方法

他のスクリプトやコマンドから「今日選ばれたフォルダ」を参照したいときは、先ほど書き出したファイルを読み込むだけです。

例:他のシェルスクリプトから使う場合

bash

# 今日選ばれたフォルダのパスを変数に読み込む
TODAY_DIR=$(cat /tmp/today_folder.txt)

echo "本日の対象フォルダは $TODAY_DIR です。"
# 以降、この $TODAY_DIR を使って処理を行う

この方法のメリット

  • 一度決まったら変わらない/tmp 内のファイルに書き出すため、OSを再起動しない限り、その日はずっと同じフォルダを指し示します。
  • 再試行が簡単: もし手動で選び直したい場合は、スクリプトを再度叩くだけで /tmp/today_folder.txt が更新されます。
  • メンテナンス性: フォルダが500個から数千個に増えても、find と shuf は一瞬で処理を終えるため、起動時間を遅延させません。

もし「サーバーを数日間起動しっぱなしにする」可能性がある場合は、@reboot の代わりに毎日決まった時間(深夜0時など)に更新する設定も可能です。必要であれば、その設定方法も提示できます。

いえ大丈夫です。この方法を試してみます。ありがとうございました。

承知いたしました!ぜひその方法で進めてみてください。

もし実際に動かしてみて、特定のフォルダを除外したくなったり、実行結果のログを残したくなったりするなど、追加の要望が出てきましたらいつでもご相談ください。

作業の成功を祈っております!

自作スクリプトの引数渡しパスの指定で詰まった際などは、またいつでもお声がけください。

sudo hostnamectl set-hostname <新hostname>としたらその場は変わるのですが、リスタートするとまた元に戻ってしまいます。固定するにはどうしたらいいでしょう。Raspberry pi zero2wでUbuntu Serverを使っています。

sudo hostnamectl set-hostname としたらその場は変わるのですが、リスタートするとまた元に戻ってしまいます。固定するにはどうしたらいいでしょう。Raspberry pi zero2wでUbuntu Serverを使っています。

Raspberry Pi 上の Ubuntu Server でホスト名が元に戻ってしまう原因は、初期設定ツールである cloud-init が起動時に設定を上書きしているためです。 

固定するには、以下のいずれかの方法で cloud-init の設定を変更してください。

方法1:cloud-init のホスト名管理を無効にする(推奨)

これが最も確実な方法です。cloud-init によるホスト名の自動設定をオフにすることで、hostnamectl での設定が維持されるようになります。 

  1. 設定ファイルを開きます。bashsudo nano /etc/cloud/cloud.cfg
  2. preserve_hostname: false という行を探し、true に書き換えます。yamlpreserve_hostname: true
  3. 保存して終了(Ctrl+O, Enter, Ctrl+X)し、再度ホスト名を設定して再起動します。bashsudo hostnamectl set-hostname <新しいホスト名> sudo reboot

方法2:user-data ファイルを直接編集する 

Raspberry Pi 版 Ubuntu の場合、/boot/firmware/user-data(または /boot/user-data)に記述されているホスト名が優先されることがあります。 

  1. 設定ファイルを開きます。bashsudo nano /boot/firmware/user-data
  2. hostname: ubuntu のようになっている箇所を、希望のホスト名に書き換えて保存します。
  3. 再起動すると反映されます。 

注意点

ホスト名を変更した後は、/etc/hosts ファイル内にある旧ホスト名も新しいものに書き換えておかないと、sudo コマンド実行時に「名前解決ができない」といった警告が出ることがあります。 

bash

sudo nano /etc/hosts
# 127.0.1.1 の横にある旧ホスト名を新しいものに変更

これらを行っても解決しない場合、特定のネットワーク環境(DHCPサーバー側での強制指定など)の可能性はありますか?

ubuntu serverでディスプレイ出力を90°回転させる方法を教えてください。

ubuntu serverでディスプレイ出力を90°回転させる方法を教えてください。

Ubuntu Serverでディスプレイ出力を90度回転させる方法は、GUI(デスクトップ環境)の有無によって異なります。

1. GUIがない場合(コンソール画面のみ)

Ubuntu Serverの標準的なCUI画面(仮想コンソール)を回転させるには、フレームバッファ(fbcon)の設定を変更します。

  • 即時反映させるコマンド:
    以下のコマンドを実行すると、現在の画面が即座に回転します。bash# 90度右回転 (時計回り) echo 1 | sudo tee /sys/class/graphics/fbcon/rotate_all # 90度左回転 (反時計回り) echo 3 | sudo tee /sys/class/graphics/fbcon/rotate_all # 0:標準, 1:90度, 2:180度, 3:270度
  • 永続的に設定する方法(再起動後も有効):
    GRUBの設定ファイルを編集して、起動オプションに回転設定を追加します。
    1. 設定ファイルを開く: sudo nano /etc/default/grub
    2. GRUB_CMDLINE_LINUX_DEFAULT 行に fbcon=rotate:1 を追記する(90度回転の場合)。
      例: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash fbcon=rotate:1"
    3. 設定を更新する: sudo update-grub
    4. システムを再起動する。 

2. GUIがある場合(Ubuntu Desktopを導入済み)

デスクトップ環境(GNOMEなど)を使用している場合は、xrandr コマンドまたは設定メニューを使用します。 

  • コマンドで回転:bash# 90度右回転 xrandr -o right # 90度左回転 xrandr -o left # 元に戻す xrandr -o normal コードは注意してご使用ください。※ Wayland環境では gnome-monitor-config などのツールが必要になる場合があります。
  • 設定メニューから変更:
    [設定] > [ディスプレイ] > [向き (Orientation)] から「Portrait Right(右縦)」または「Portrait Left(左縦)」を選択して適用します。 

現在、どちらの環境(コンソール画面デスクトップ画面か)で作業されていますか?

GUIは未インストールでConsoleで作業しています。

GUIがインストールされていないUbuntu Server(コンソール画面)では、フレームバッファ(fbcon)の機能を設定することで画面を回転させることができます。 

1. コマンドで即時に回転させる(一時的)

現在ログインしているコンソール、またはすべての仮想コンソールを即座に回転させるには、以下のコマンドを実行します。

  • すべてのコンソールを90度回転(時計回り):bashecho 1 | sudo tee /sys/class/graphics/fbcon/rotate_all
  • 各数値の意味:
    • 0: 標準(回転なし)
    • 1: 90度回転(時計回り)
    • 2: 180度回転(上下反転)
    • 3: 270度回転(反時計回り) 

2. 再起動後も設定を維持する(永続的)

再起動しても回転した状態を維持するには、ブートローダー(GRUB)の設定を変更して、カーネルパラメータに回転の指示を追加します。

  1. 設定ファイルを開く:bashsudo nano /etc/default/grub
  2. パラメータを追記する:
    GRUB_CMDLINE_LINUX_DEFAULT(または GRUB_CMDLINE_LINUX)の行に、fbcon=rotate:1 を追加します。
    • 例:GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity fbcon=rotate:1"
  3. GRUBの設定を更新する:bashsudo update-grub
  4. システムを再起動する:bashsudo reboot

注意事項

  • ハードウェアの制限: 使用しているビデオカードのドライバやハードウェア構成によっては、フレームバッファの回転(fbcon rotation)がサポートされていない場合があります。
  • 特定のアプリへの影響: この設定はコンソールのテキスト表示に対するものであり、フレームバッファを直接操作する一部のグラフィカルなアプリケーションには反映されないことがあります。 

この設定を試しても画面が変化しない場合、使用されているグラフィックドライバ名を教えていただけますか?

/etc/default/grubが新規ファイルとなっていたのですが、それでいいのでしょうか。 また、update-grubがcommand not foundで見つかりません。

/etc/default/grub

 が新規ファイルになり、update-grub コマンドが見つからない場合、お使いの環境は Raspberry Pi や ARMベースのシングルボードコンピュータ、あるいは クラウドイメージ(UEFIブートではない特殊な構成) である可能性が高いです。

これらの環境では GRUB の代わりに別のブートローダーや設定ファイルが使用されています。デバイスの種類に合わせて以下の方法を試してください。 

1. Raspberry Pi を使用している場合

Raspberry Pi版の Ubuntu Server では、設定は /boot/firmware/config.txt で管理されています。

  1. 設定ファイルを開く:bashsudo nano /boot/firmware/config.txt コードは注意してご使用ください。
  2. 回転設定を追記する:
    ファイルの末尾に以下の行を追加します。
    • 90度回転(時計回り): display_rotate=1
    • 270度回転(反時計回り): display_rotate=3
  3. 保存して再起動:
    Ctrl+O → Enter で保存し、Ctrl+X で終了した後、sudo reboot で再起動してください。

2. 一般的な環境(x86/64)で GRUB がない場合

最近の Ubuntu Server では、GRUB の代わりに systemd-boot が使われるケースがあります。その場合、カーネルパラメータを直接編集します。 

  1. コマンドでの即時確認(一時的):
    まず以下のコマンドで回転するか確認してください。bashecho 1 | sudo tee /sys/class/graphics/fbcon/rotate_all
  2. 永続化(スクリプト化):
    systemd-boot 環境でパラメータを渡すのが難しい場合、起動時に自動実行するスクリプトを作成するのが確実です。
    • crontab -e を実行し、末尾に以下を追記します:
      @reboot echo 1 > /sys/class/graphics/fbcon/rotate_all 

3. 使用しているデバイスの確認

もし上記で解決しない場合、どのようなハードウェア(PC、Raspberry Piなど)で実行しているか教えていただければ、より正確な設定ファイルをご案内できます。

まずは echo 1 | sudo tee /sys/class/graphics/fbcon/rotate_all を実行して、画面が回転するかどうか確認してみてください。 

Raspberry pi zero2wを使っています。rotate_allでは回転します。

Raspberry Pi Zero 2 W を使用している場合、ブートローダーが GRUB ではなく 

cmdline.txt という設定ファイルを読み込むため、update-grub コマンドは存在しません。

rotate_all コマンドで回転が成功しているのであれば、以下の手順で設定を永続化(再起動後も有効化)できます。

設定の永続化手順

  1. 設定ファイルを開く:
    Ubuntu Server on Raspberry Pi では、カーネルの起動オプションは以下のファイルに記述されています。bashsudo nano /boot/firmware/cmdline.txt コードは注意してご使用ください。※ 環境によっては /boot/cmdline.txt にある場合もあります。
  2. パラメータを追記する:
    ファイル内の既存の記述の最後(改行せず、半角スペースで区切って)に以下の文字列を追加します。textfbcon=rotate:1 コードは注意してご使用ください。
    • 1: 90度回転(時計回り)
    • 3: 270度回転(反時計回り)
    注意: cmdline.txt は必ず「1行」で記述されている必要があります。複数行に分けないよう注意してください。
  3. 保存して再起動:
    Ctrl+O → Enter で保存し、Ctrl+X で終了した後、再起動します。bashsudo reboot

もし上記でうまくいかない場合

Raspberry Pi のビデオドライバ(KMS/FKMS)が有効な場合、cmdline.txt の設定が無視されることがあります。その場合は、起動時に自動でコマンドを実行する設定を行います。

  1. crontab を編集:bashsudo crontab -e コードは注意してご使用ください。※初回起動時はエディタの選択が出るので nano を選んでください。
  2. 末尾に以下を追記:text@reboot echo 1 > /sys/class/graphics/fbcon/rotate_all
  3. 保存して終了すれば、起動のたびに自動で 90度回転が適用されます。

この設定を試した後、画面の向きは正しく反映されましたか?

OKです。

無事に回転したようで良かったです!

Raspberry Pi Zero 2 Wのようなリソースの限られた環境では、GRUBの代わりに Official Raspberry Pi Documentation にあるような cmdline.txt や config.txt を使うのが基本ルールになります。

今後、もし「画面の向きはいいけど、キーボードの入力方向(上下左右)も合わせたい」といったことがあれば、console-setup の設定変更が必要になるので、その際はお気軽にご相談ください。

他にディスプレイ表示や初期設定について、何かお手伝いできることはありますか?