Linux で映像制作メモ

自分用の覚書です。

Shotcut

たまに不安定になるけど、いろいろできそう。

Google 先生の空気読むスキルが全開になると、検索結果が「shortcut」だらけになる不遇のソフト名。ショートカットでもなければキスショット・アセロラオリオン・ハートアンダーブレードでもありません先生。

Adobe Affter Effects の古いやつ(バージョン6.0?)ならライセンスを持っているので使えるんだけど、VM で動かした Windows 10 上でやるにはとてもかったるい。僕が Windows や Mac の人だったら迷わず Creative Cloud に契約するんだけどなぁ。というか、そろそろ Linux 版を出してください Adobe 様。

納豆が大好きな嫁ちゃん

切ったり貼ったりだけだったら ffmpeg や Openshot を使ってたけど、真面目にやろうと思うと Shotcut はかなり使えそうです。 HTML を画面上に重ねるフィルタがあるのはありがたい。外部のペイントツールで画像素材を作らなくても、WYSIWYG でそれっぽい文字や簡単な画像挿入ならOK。ちゃんと使えるようになろう〜。

フリー素材

音楽

Sound Cloud に Creative Commons なまとめがあった。

ところで WordPress の新しいエディタって Sound Cloud の URL (https://soundcloud.com/wearecc みたいなの) を貼ると、自動で組み込みプレイヤーにしてくれるのか〜。便利。

映像素材

適当にパーティクルをキラキラ飛ばしまくってる映像をジェネレートするジェネレータが欲しい。書こうかな。あるだろうな。

MPEG 圧縮泣かせの細かなパーティクルの★なんかが、大量に舞う映像は雑でも「わぁ、綺麗」と思わせるのにもってこいだし、パラメータを変更するだけで無尽蔵に作れるような素材はとても便利。CC の素材集や商用ソフトに頼らないんだったら Blender とかで作るのが早いかも。まだちゃんと調べていない。

NHK のクリエイティブ・ライブラリーで NHK が撮影した実写映像の素材が配布されてる。結構前からあるサイトみたい。

僕がNHKで映像制作をやってた時は、権利がガチガチの制限がついているイメージしかなかったけど、時代に則した形態になってきてるんだ。今もそうだとは思うけど、放送に乗っけられるフォントも限られていたから、イメージ通りのフォントから自作しなくちゃいけなかったな。

PCが壊れました。

表題のとおりです。より正確に表現すると、LMDE2 のパッケージマネージャの依存関係データベースがふっ飛んだ上に systemd などの OS の実行に必要な機能が使えなくなりました。

電源を入れても Linux Mint のロゴが表示されるだけで、init の次でコケている模様。ちょうど LMDE3 もリリースされていることだし、必要なファイルを避難させてインストールし直すことにしました。

ストレージ構成

元々の環境は以下のとおりです。

  • /dev/sda … GRUB
    • /dev/sda1 … スワップ領域
    • /dev/sda2 … 「/」にマウント。ext4。
  • /dev/sdb
    • /dev/sdb1 … RAID10 アレイ (1)
  • /dev/sdc
    • /dev/sdc1 … RAID10 アレイ (2)
  • /dev/sdd
    • /dev/sdd1 … RAID10 アレイ (3)
  • /dev/sde
    • /dev/sde1 … RAID10 アレイ (4)

RAID10 環境の復旧と、パーティションを切っていない 「/」 以下の必要ファイルの復旧が目的です。なお、sda は 256GB SSD、sdb 〜 sde はそれぞれ 3TB の HDDです。

ソフトウェア RAID ツールの mdadm を用いて、sdb1 〜 sde1 までの RAID10 アレイすべてを合わせて /dev/md0 として認識させていました。

サルベージ

まず、対象マシンが起動できないとどうにもこうにもならないので、別マシンで LMDE3 x64 の Live DVD イメージをダウンロードUnetbootin を使って、ブータブル USB キーを作成しました。

次に対象マシンの電源を入れ、ブートシーケンス設定で USB Key をプライマリに設定。作成したブータブル USB キーを USB ポートに挿して、LMDE3 をライブ起動しました。(…ライブ起動っていう表現でいいのかな。要は、対象マシンの内蔵ストレージにインストールせずに起動。)

ライブ起動した LMDE3 上のコンソールで /dev を確認すると、sda 〜 sde まですべて確認することができました。

SSDのsda1とHDDのsdb〜sdeたち。
sudo mkdir /mnt/sda1
sudo mount /dev/sda1 /mnt/sda1

/dev/sda1 をマウントすると、そのまま LMDE2 の「/」を覗くことができます。ここから必要なファイルを RAID ストレージに移動したいのですが、ライブ起動した LMDE3 には /dev/md0 がありません。

そこで、ターミナルより

sudo apt update
sudo apt install mdadm

とし、ソフトウェア RAID の mdadm を導入。

sudo mdadm --assemble --scan

すると、RAID アレイを認識し /dev/md/0 と /dev/md0 の仮想デバイスファイルが作成されました。あとはマウントして旧「/」配下のファイルを救出するだけです。

# マウントポイントを作成
sudo mkdir /mnt/md0
# マウント
sudo mount /dev/md0 /mnt/md0
# バックアップディレクトリを作成
sudo mkdir /mnt/md0/backup
# バックアップ
sudo time rsync -aAXv /mnt/sda1/ --exclude={"/mnt/sda1/dev/*",\
"/mnt/sda1/proc/*","/mnt/sda1/sys/*","/mnt/sda1/tmp/*",\
"/mnt/sda1/run/*","/mnt/sda1/mnt/*","/mnt/sda1/media/*",\
"v/lost+found"} /mnt/md0/backup; date

やたら時間がかかったので、 /mnt/md0 内にあるマンガを mcomix で読みながら待っていました。バックアップが終わったら、/dev/sda1 および /dev/md0 をアンマウントし、新しい OS をインストールします。

LMDE3 Cindy x64 のインストール

デスクトップにある「Linux Mintをインストール」アイコンから GUI で入れていきます。最近のディストリはインストールがとても簡単だし、Youtube を見ながらネットサーフィンしながらできるし、とても快適ですね〜。

ストレージの構成だけ注意して、 /dev/sda1 をこれまでどおりスワップ領域に、/dev/sda2 を新しい OS の「/」にして EXT4 でフォーマット。/dev/sda に GRUB をインストールする設定で進みました。

あと、セットアップウィザード中で行ったことといえば、僕は英語キーボード (PFU Happy Hacking Keyboard) を使っているのでキーレイアウトを US 配列にした程度です。滞りなくできました。

インストール完了後、USB キーを抜いて内蔵ストレージから再起動します。

環境の再構築

無事に起動できたら、また mdadm をインストール。マウントします。

sudo apt update
sudo apt upgrade
sudo apt install mdadm
sudo mdadm --asemble --scan
sudo mount /dev/md0 /mnt

OS 上で一度スキャンすると、/etc/mdadm/mdadm.conf にアレイ情報が書き込まれるようですね。

続いて、ユーザーやグループ情報の移動を行い、これまで使っていたソフトのインストールを行いました。

起動できなくなった時は少し焦ったけど、とりあえず使える程度までには現状回復できたし、ゴミファイルの整理にもなって良かったと思います。

イシューズ

下記は積み項目。

  • IMの調子が変。UIM で SKK 使いなんだけど、入力のタイミングでキーが変なことになったり、辞書を引き継げなかったり。
  • GeForce GTX460 の nVidia の公式ドライバの組み込みに失敗する。いや、組み込みはできるんだけど、cinnamon がクラッシュする。以前は lightdm を停止して X を殺して、端末から startx してたら起動できたけどそれも無理。んー、今のところ、noveau ドライバで問題ないけど…。グラボの替え時かなぁ。
  • 動画やコミックアーカイブのサムネイル表示が nemo でできなくなってる。ffmpegthumbnailer や ffmpegthumbs をインストールしても改善せず。謎ファイル名の動画が多いんで割と不便。
  • Ruby や Python といったプログラミング環境は必要になったら順次、入れていこうと思う。とりあえず Git は入れておいた。
  • オーディオや動画のオーサリングツール系も必要に応じて入れる。
  • LMDE3って標準で mozjpeg が入ってるんだ!

ffmpeg によるバイク走行動画のスタビライズ(手ぶれ補正)

アクションカメラ

アクションカメラで運転中の動画を撮影するととても楽しいです。

僕が一昨年購入したのは中華製ですが、安価といえど立派に撮影できます。マウント用のアタッチメントが最初からたくさん付属していて、防水ケースも付属。この手のものは他にもいくつも出ていますが、僕が購入したアクションカメラは、防水ケースに入れたまま USB で給電・撮影ができるもので重宝しています。

ただ、ハードウェアはもとよりソフトウェアでの手ぶれ補正(スタビライズ)機能がついていないため、撮れた動画はかなり「ガタガタ」しています。(Go Pro のような、ちゃんとしたアクションカムは補正機能があるのかなぁ)

振動が気になる

出来るだけ振動が少なく、実際に見ている視点と同じような画にするため、僕はヘルメットのチン部分にカメラをしばりつけています。それでも振動が気になる。エンジンや車体の振動というより、走行している路面そのもののガタつきの影響のようです。

比較的、路面がキレイな国道でこんな感じ。

体が振動して視点位置が細かくズレても人間の目は優秀で、注視点をトレースしてモノを見ます。そのため、実際にはもっと滑らかな動きとして目に映っています。

Youtube の手ぶれ補正

Youtube に手ぶれ補正機能があったな。と思って調べてみると、動画をアップロードする際に設定ができたクイック加工の「スタビライズ」は、2018年8月頃に使えなくなったみたいです。残念。

なお、最近は Youtube Studio (β)なるものが出てきて、ブラウザ上で簡単な編集ができるみたいです。あくまでも、まだ「簡単な」編集だけのようですが、今後に期待。

ffmpeg の vid.stab プラグイン

動画で困った時の駆け込み寺、ffmpeg でのスタビライズについて調べてみると、とても強力な vid.stab というプラグインがある事が分かりました。

公式のデモビデオがスゴい!

左側の元動画はこれだけブレブレなのに、右側の補正後の動画はとても滑らか。

さっそく手元の ffmpeg でも使えるか見てみます

$ ffmpeg 2>&1 | grep -o enable-libvidstab
enable-libvidstab

コンパイルオプションに –enable-libvidstab が入っています。わあい、使えるようです。こちらのページを参考に元動画 rec.mp4 に補正をかけて out.mp4 として保存します。

ffmpeg -i rec.mp4 -vf vidstabdetect -an -f null - && \
ffmpeg -i rec.mp4 -vf vidstabtransform -y out.mp4

最初のコマンドで手ぶれを検知して transforms.trf という情報ファイルを生成し、次のコマンドでその手ぶれ情報を用いて補正をかけるようです。補正できた動画がこちら。

おおー、良い塩梅!

画面右下にある日時表示が動いているのが、映像を主体にして手ぶれ補正されている証拠。もっと細かなオプションもあるようなので、さらに調整するとヌイヌイと進む映像になりそうです。

僕が使ってきた携帯電話たち

ついこの間「新世紀になった!」と思ったら、気付けばもう2019年になってしまいました。僕が初めて移動体通信音声デバイスを運用したのは、今から20年前の1999年。ちょうど良い節目なので、これまでどういうデバイスを使っていたか、覚え書きとして書いておきます。

1999年春〜 ケンウッド ISD-P67

中学3年生の時に初めて持った PHS です。元々、母が契約・購入したものですが、あまり使う用途がなかったのか、おねだりしたら貰うことができました。

当時は中学生で携帯電話・PHSを持っている人は少なくて、クラスでも片手で数えられる程度だったと思います。最近話題になっていたポケベル世代、よりはちょっと後なので、「携帯電話・PHSを持っているか否か」で考えてOKと思います。

本体カラーは白。画面はモノクロ液晶で、緑色のバックライトでした。着信音は単音。通話とショートメールに対応。

今のデバイスと比較するととても質素ですが、持っているのと持っていないのとでは大違いでした。中学生なので、用途はもちろん友達との遊び用です ;-D

1999年冬〜 東芝 C301T

高校生の頃に使っていた cdmaOne に対応した携帯電話。当時はまだ KDDI じゃなくてセルラーだったと思います。

本体カラーはシルバー。画面はモノクロ液晶で、オレンジ色のバックライトでした。前の PHS に比べれば格段に表示できる情報量も多く、Eメールにも対応。それまで PC でしかできていなかったEメールが手元のケータイでできて、夜遅くまで友達とつながっているのはとても楽しかったです。Emoji が進化してきたのもこの頃ですね!

着信音は三和音で、EzWeb によって i モードサイトの表示もできていました。

高校生世代とその当時の背景から、周辺でもケータイ保有率が一気に上がった気がします。高1の頃はクラスの1/3、高3の頃には、クラスの2/3くらいは持ってたんじゃないかな。

着メロ作りや、携帯電話でも閲覧できるホームページ作成など、それなりに楽しかったです。

2002年冬〜 カシオ A5302CA

高3の冬から使っていた携帯電話。カラー液晶を搭載して、(僕として)初めての着うた対応モデル。本体は白。

他社が「写メ」という言葉を出してきた頃で、au ケータイにもカメラが付きました。写真が撮れてメールに添付できて表示ができる…コレはスゴい。

広い画面でカラー画像が見れるし、今まで電子音だった着信音が音楽になったのは感動でした。マルチメディア時代の到来ですねー!

2004年秋〜 三洋電機 W22SA

専門学校生の時に購入した携帯電話。CDMA 1X WINで、BREWアプリ対応しています。本体は青。サブディスプレイが搭載されていたのは地味に便利でした。

この機種の前と後はそれなりに良い進化が分かるのですが、この頃のケータイはあんまりパッとしません。驚くような進化率じゃなくなってるって意味です。知らないだけで色々と新しい技術が盛り込まれているんでしょうが…

電話ができて、ケータイサイトが見れて、アプリが充実して、メールができて、写真が撮れて、音楽が聴けて、ちょっとした動画の撮影・再生もOK。

2008年秋〜 カシオ W63CA

地元に戻ってきた頃に購入した携帯電話。カシオのデジカメ EXILIM の機能を盛り込んだ「EXILIM ケータイ」らしく、カメラレンズがかなり大きいです。画面をひっくりかえすと本当にコンデジのような見た目になります。始まったばかりのワンセグのチューナーも搭載。本体は黒。

ワンセグチューナーを搭載した機種は初めてだったので、一人暮らしの僕にとっては良い相棒でした。風呂でもトイレでも自室でも簡単に持っていってテレビを見ることができます。

コンパクトでおさまりも良く、操作性も悪くなかったのですが、バッテリーの持ちが怪しくなってきたのと、世界がスマートフォンのビッグウェイブに乗りかけている時期だったので、次の IS01 に買い替えをすることにしました。

2010年秋〜 シャープ IS01

Android 1.4 搭載の au 初の Android スマートフォン。結果から言うと地雷でした。腐ってやがる…早すぎたんだ…!

ここから数年間、携帯電話を携帯しない率が高くなります。

ハード的なスペック不足と初期の頃の不安定な Android のために動作がカクカク。着信があっても、タッチ操作の処理が追いつかずに電話がとれない事もあるレベルでした。電話ができない電話機っておま。

この端末を持ってからほどなくして、au とのインターネット通信 (2Gかな?) を解約して音声プランだけにしました。インターネットはモバイル Wi-Fi 経由で、事業者は日本通信 b-mobile。

当初は月額費用を抑えるためと、PC でテザリングをするために通話と通信の事業者を分けて契約したのですが、携帯でネット接続するたびにモバイル Wi-Fi を携帯して電源を入れて接続して…のくりかえしの煩雑さに嫌気が差し、モバイル Wi-Fi を携帯しなくなりました。すると、もろもろの割引サービスが全解除されて高額な通話しかできない・デカい・遅い IS01 を不携帯、という現象に拍車がかかりました。

メリットは、広くて自立する液晶画面とワンセグチューナーを搭載しているので、小型テレビとして使える点。レトロゲームのエミュレータを入れて携帯ゲーム機にするとおさまりが良い点、くらいかな…。

2014年2月〜 シャープ SHL22

IS01 から4年。「そろそろ Android も脂が乗った頃で、買い替えても良いだろう…」と購入したスマートフォン。

2017年6月〜 ASUS Zenfone 3

Honda VRX Roadster の 3D モデルを作ってみました。

複数の写真から 3D モデルを生成できる 3DF Zephyr を使って、VRX の 3D モデルを作成してみました。FBX モデルにして sketchfab にアップロードしたモデルを貼りつけておきます。

画面内をマウスでドラッグ、または、指でスワイプするとモデルを回転させることができます。環境によっては表示されない場合があります。

元にした写真はこんな感じ。

まー、ディティールはさておき、普通のカメラで適当に撮影した二次元の写真からここまで立体モデルを起こせるのは面白いですね!

勤め先に、レーザースキャナー計測をしている部門があり、たまに話を聞くこともあるので、このお手軽さは驚きです。

特に VRX はマイナー車種すぎて、インターネットで探しても図面データがないので大雑把なパーツの検討をする時に使えそうです。

もし、チャレンジしてみたい方がいらっしゃれば、3D 化の手順を記事にて解説しますのでコメントをください。

LMDE(Linux Mint Debian Edition)2 で Google Drive を使う

Linux で Google Drive を使う方法は google-drive-ocamlfuse 一択かなーと思っていたら、Grive というオープンソースのソフトを知ったので入れてみました。google-drive-ocamlfuse は fuse でマウントできるのに対し、Grive は Windows 版の Google Drive クライアントのように同期させるためのソフトです。(Google ドキュメントで作成したファイルは同期されません)

fuse でマウントすると、ローカルにデータを置いておかなくてもバックエンドで Google Drive にアクセスして省スペースになりますが、ネットワークが切れたり、通信コストを抑えたい場合に厄介です。Grive は二重にデータを保持するもののネットワーク環境がなくてもデータが利用可能ですし、Grive を単体で使うと自動同期もしないので、ユーザーが好きなタイミングで同期することができます。

自分にぴったり…! ピコーン (‘A`)

公式サイト

LMDEやDebianのリポジトリにあって、APT で降ってくる grive を最初に入れたものの使えず、調べてみると新しいバージョンを使った方がいいらしいです。 ということで、Github から入手してビルドします。

インストール方法は、公式の手順のとおりです。

1. ビルドに使うものをインストール

C++ 方面の団体さんがお着きです。

sudo apt-get install git cmake build-essential \
  libgcrypt11-dev libyajl-dev libboost-all-dev \
  libcurl4-openssl-dev libexpat1-dev libcppunit-dev \
  binutils-dev

2. ダウンロード、ビルド、インストール

cd /tmp
git clone https://github.com/vitalif/grive2.git
cd grive2
mkdir build
cd build
cmake ..
make -j4
sudo make install

インストールすると次の位置にコマンドが配置されました。

$ sudo make install
[ 78%] Built target grive
[ 83%] Built target btest
[ 98%] Built target unittest
[100%] Built target grive_executable
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/bin/grive
-- Installing: /usr/local/share/man/man1/grive.1
$

3. 初回設定

初回の Google アカウント認証は WWW ブラウザ経由で行います。 同期用のディレクトリは作成されないので、自分で作って移動します。 最初、ホームディレクトリで grive コマンドを実行してしまい焦りました。(-p dir オプションを指定することにより、ディレクトリを指定することも可能。省略時はカレントディレクトリです。)

$ mkdir ~/GoogleDrive
$ cd ~/GoogleDrive
$ /usr/local/bin/grive -a

-a オプションが初回の認証を行うオプションです。認証用 URL が印字されるので、そのリンクを WWW ブラウザで開きます。

$ /usr/local/bin/grive -a
----------------------
Please go to this URL and get an authentication code:

https://accounts.google.com/o/oauth2/auth?... # ← 認証コード

-----------------------
Please input the authentication code here: 
(ここに認証コードをコピペ)
Reading local directories
Reading remote server file list
Synchronizing files
...

認証コードを貼りつけた後は、Return キーを押してそのまま待ってください。手癖で C-d などタイプしてしまったら、そのまま終了してしまいます(終了させてしまいました)。 あとは Google から降ってくるファイルを淡々と眺めていくだけです。

初回の同期に終了すると

Finished!

と表示されてコマンドが終わります。

4. その後の同期

あとは、

$ cd ~/GoogleDrive
$ /usr/local/bin/grive

または

$ /usr/local/bin/grive -p ~/GoogleDrive

とすれば、同期することができます。Ubuntu では grive-tools パッケージを入れたら常駐型の GUI ソフトが入って自動同期してくれるようですね。僕の場合は、Git のプッシュとプルのようにマニュアル同期の方が助かるのでこれ以上の設定はしませんが、ユーザー権限で動く grive を cron に登録しておけば自動同期も可能だと思います。

Let’s Encrypt + nginx で SSL 化

自分用の覚え書きです。

環境

  • Debian GNU/Linux Jessie
  • さくらVPS
  • ドメイン取得・DNS設定済
  • Let’s Encrypt を利用

準備

手順は大体ここに載っているとおり。ドメインが割り当てられたホストにログインして certbot を使って証明書を発行します。Debian の Jessie の場合、APT リポジトリに backports を追加します。

# echo 'deb http://ftp.debian.org/debian jessie-backports main' \
  >> /etc/apt/sources.list
# apt update

backports から certbot をインストールします。

# apt -t jessie-backports install certbot

次にファイアウォールで外部から80番(HTTP)ポートにアクセスできるようにしておきます。Let’s Encrypt のホストがドメインを確認する時に接続し、certbot が実行されているホスト、申請内容が正しいかチェックするためです。iptables/ufw、各種クラウドサービスのインバウンド設定は割愛します。

証明書の発行

certbot を実行します。 -d オプションでドメインを指定します。複数個を指定して OK です。

# certbot certonly --standalone -d example.com -d www.example.com

画面に表示される手順に従って、項目を入力していきます。メールアドレスは、証明書の失効の通知などが届く連絡先になります。ここでは、HTTPD を止めると書いてありますが、私の環境では無停止でいけました。HTTPD が立ち上がってたらcertbot が80番でListenしなくなった、とかそういう事かな。

端末に

IMPORTANT NOTES:

とメッセージが出て、ドメインや失効日が表示されたら正常終了です。次の場所に証明書が保存されます。

/etc/letsencrypt/live/example.com/*.pem

nginx の設定

設定ファイルの server 項目を下記のように編集します。

# -- snipped --
server {
  listen *:80;
  server_name example.com *.example.com;
  return 301 https://$host$request_uri;
}
server {
  listen 443 ssl;
  ssl on;
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  # -- snipped --

非SSL(http://~)経由でのアクセスをSSL経由のアクセスをするようリダイレクトしています。また、SSL のプロトコル指定では、脆弱性がある SSLv3 を抜いて無効にしています。 コンフィグテストを行なって問題がないようであれば、リロードします。

# /etc/init.d/nginx configtest
[ ok ] Testing nginx configuration:.
# /etc/init.d/nginx reload

必要に応じて、外部から443番ポートへのアクセスを許可すれば完了です。

証明書の更新

Let’s Encrypt が発行してくれる証明書は90日間で失効します。定期的に更新する必要があります。 手動で行うには certbot コマンドに renew オプションを与えます。このホストに登録されている Let’s Encrypt のすべての証明書の有効期限を調べ、失効日が近いものを更新してくれます。 試しに実行してみると

# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
#

となりました。先ほど作ったばかりの証明書なので、ここは「リニューアルする必要なし」です。

手動更新はアレですので、cron に登録しておきます。

# echo 'certbot renew && /etc/init.d/nginx reload' > /etc/cron.weekly/certbot
# /etc/init.d/cron reload

以上です。

参考

LMDE2 で RAID10 環境を組みました(追加編)

メインマシンはデータ保存用に3TBのハードディスクを4本積んでいます。前回換装してから3年半ほどが経ち、使用時間が軒並3万2000時間を越えている状態です。 去年の10月に新しいマシンを組んだ際にハードディスクをそのまま移し騙し騙し使っていたのですが、先週になってとうとう1台がシステム側から認識しない自体が発生しました。システムを再起動すると正常に認識し、特に物理的なエラーも論理的なエラーも発生していなかったものの、良いタイミングだと思い換装することにしました。

将来の換装のためと全12TBのストレージ領域中5.5TBまでデータの整理を行なっていたので、新しい3TBストレージを4本準備してRAID10を組んでみます。

準備

下記のものを4台購入しました。

Amazon.co.jp | TOSHIBA DT01ACA300 3TB 6Gbps SATA対応 3.5インチ内蔵ハードディスクドライブ | 東芝(TOSHIBA) | 内蔵ハードディスク (アフィリエイトなし)

これらを使って標準的な RAID10 構成にしたいと思います。新規のストレージをマシンに接続するとそれぞれ sdc, sdd, sde, sdf と認識されているとします。

システムから認識される論理デバイスは /dev/md0 になる予定です。ストレージの利用率は50%のミラーリング+ストライピング構成です。

早速、それぞれのストレージを parted を使って初期化します。以降はほぼずっと root 権限での作業になります。

for t in /dev/sd{c,d,e,f}; do \
  parted --script $t "mklabel gpt"; \
  parted --script $t "mkpart primary 0% 100%"; \
  parted --script $t "set 1 raid on"; \
done

GPT に設定し、パーティションを作成後、RAID フラグを立てています。初期化に成功すると、

$ ls /dev/sd*1
/dev/sdc1
/dev/sdd1
/dev/sde1
/dev/sdf1

パーティションに対応するデバイスファイルが生成されます。

ソフトウェア RAID の構築

Linux でソフトウェア RAID を実現するには、例に漏れず mdadm を使います。インストールは次のとおり。

apt update
apt install mdadm

実行します。

mdadm --create /dev/md0 -v --raid-devices=4 --level=raid10 \
  /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1

/dev/md0 は作成したい論理デバイスファイル名です。 --level=raid10 で RAID10 を指定しています。最後にデバイスを指定しています。 こちらの記事によると、デバイスの順序によってどのデバイス同士が RAID1 ペアなのかの構成が変わるようですね。 コマンドを実行すると、最終確認をしてくるので y と入力。

mdadm: array /dev/md0 started.

と表示されシェルに戻ってくれば設定終了です。あとはバックグラウンドで初回の resync 処理が走るので

watch -n 5 -d cat /proc/mdstat

で進捗状況を見ましょう。私の環境では処理が終わるまでに6、7時間を要しました。resync している最中でも /dev/md0 を使うことは可能ですがパフォーマンスが凄く落ちてしまうので、できるだけ放っておく方が無難。処理している間に、アレイ情報をファイルに書き出しておきます。これをしないと次回起動時にアレイを正しく扱ってくれません。

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

mdadm.conf の内容は下記のようになりました。

# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md0 metadata=1.2 name=**********:0 UUID=********:********:********:********

末尾にアレイ情報が追記されています。これで再起動しても正しくアレイを認識できるようになります。なお、resync 中に再起動をかけると処理が最初からやり直しで、自動的に実行もしてくれないので手動で実行する必要があります。 アレイとしてスキャンしたいデバイスを明示的に指定したりするには、 DEVICE 部分を指定します。

resync 処理が完了したら /proc/mdstat の内容が

# cat /proc/mdstat
Personalities : [raid10]
md0 : active raid10 sdd1[0] sde1[3] sdf1[2] sdc1[1]
      5860268032 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
      bitmap: 0/44 pages [0KB], 65536KB chunk

unused devices: <none>

となります。 [UUUU] の部分が「4本すべて正常」を表しています。異常が出た場合には、この U_ (アンダースコア)になります。例えば、sed1 に異常があった場合は [U_UU] という表示になります。

論理デバイスを初期化

論理デバイスの /dev/md0 が使える状態になったので、後は通常どおりフォーマットしてマウントします。

# mkfs.ext4 /dev/md0
# mkdir /mnt/raid10
# mount /dev/md0 /mnt/raid10

私の環境の場合、 df -h で5.5TBボリュームとして認識しました。

定期チェック設定の確認

mdadm をインストールすると、自動的に cron に定期チェックのスクリプトが登録されます。

# cat /etc/cron.d/mdadm
#
# cron.d/mdadm -- schedules periodic redundancy checks of MD devices
#
# Copyright © martin f. krafft <madduck@madduck.net>
# distributed under the terms of the Artistic Licence 2.0
#
# By default, run at 00:57 on every Sunday, but do nothing unless the day of
# the month is less than or equal to 7. Thus, only run on the first Sunday of
# each month. crontab(5) sucks, unfortunately, in this regard; therefore this
# hack (see #380425).
57 0 * * 0 root if [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ]; \
  then /usr/share/mdadm/checkarray --cron --all --idle --quiet; fi

毎週日曜日の午前0時57分に実行され、その日が毎月7日より前…つまり毎月最初の日曜日であれば、 checkarray コマンドが実行されます。「平日は避けたいけど、実行は月に1回だけでいい」という設定を crontab では素直に書けないのでコメントで軽くdisってますねー。実行するトリガーを決めるのは実行したいもの各々によって違うはずなので、cron は今以上高機能化する必要もない気もします。一方で「日付や曜日、何分毎…といったある程度の時間の概念を扱っているし、可読性が落ちてバグも増えるから、このくらい標準機能で出来てもいいじゃない」と言いたくなる気持ちも分かります。

手動でのチェック

cron にも登録されている /usr/share/mdadm/checkarray はスケジュールを考慮しており、最近チェックが走ったアレイはチェックをスキップします。手動で強制的にチェックを行いたい場合は次のコマンドを実行します。

# echo check > /sys/block/md0/md/sync_action

また、停止したい場合は

# echo idle > /sys/block/md1/md/sync_action

を実行します。リビルド中に sync_action に書き込んでもエラーになって弾かれるため注意が必要です。

様子は構築時同様に cat /proc/mdstat で確認することができます。

気付いた点

  • 今回はあわてて作業をしたため忘れていましたが、障害発生時にどのストレージを換装すればいいかスムーズに見極めるため、ラベルを付けていた方がいいです。
  • 通電したまま電源やSATAケーブルをいじるのが怖くて今回は試してませんが、SATAもホットスワップに対応してるんですねー。内蔵デバイスでの運用ばっかりなので考えてもみませんでした。
    確かに外付けSATAがある訳だ…。
  • 暇が出来たら、今度は既存のストレージ(しかもブートデバイス)のRAID化をやってみようと思います。最近、CUDA 環境を整えようといろいろやっていたら update-initramfs の実行処理が帰って来なくなるようになってブートシーケンスを触るのは毎回どきどきします。まあ、ブートデバイス周りだけだから GRUB 設定だけでいけるのかな…。

参考