雑記」カテゴリーアーカイブ

RAID6を使った48TBファイルサーバを構築するなら何が必要?

1年契約をしていた非常勤の仕事が契約満了となり、さらには予定していた請負の仕事は全く入ってこないというフリーランスにありがちなまともな収入がないやばい状態となっています。4月からマジでどうしようか…

それはとりあえず置いておいて、久しぶりのまともな記事として、前にちょっとだけ考えていたファイルサーバの件ですが、もし組み立てたらどんなパーツがいるのか、どんなOSがいるのかを考えてみたいと思います。どうせなら組み立ての過程をYouTubeなどで公開できれば面白いのですが、いろいろと機材やらソフトやらを用意する…前にまず組み立て対象のファイルサーバにどれくらいかかるのか?を考えるのが先ですので。

 

とりあえず構成を考えてみる

今回の目的は「48TBのファイルサーバ」ですので、問題になるのは

  • ストレージの構成をどうするか
  • ストレージを接続するインターフェイスをどうするか
  • ケースをどうするか

が主になります。CPUやマザーボード、メモリについては3万円台のPCレベルのものでも問題ないと思います。一応気になっているのはRAID6のパフォーマンスがCPUやメモリによってどの程度変わるのか?ということですが、YouTubeでその手の組み立てをしているほかの動画を見ている限りは「よほど悪いCPUを使わない限り+ファイルサーバ以外の用途でCPUを使うのでなければ問題はない」というところだと思います。まあ、10GbEを持ってきたとしてもこれはあまり変わらないかな~というところです。

 

一応ストレージの想定としてはOS用に4TB HDDx2でRAID1、ファイルサーバ領域として8TB HDDx8でRAID6(RAID Z2)」となっています。ファイルサーバ領域をRAIDで保護しているのにOS領域をRAIDで保護しないのは運用上どうなのか?と思い始めたいましたので、次の構成はこれが予定です。

そしてストレージを接続するインターフェイスについて。今回の構成予定だとSATA端子が10個はほしいのですが、通常SATAの端子はよほど高級なマザーボードでもない限り10個なんてあるわけないのでそれを拡張するためにSATAのインターフェイスカードをつける必要があります。

最後にケースについて。そもそも家庭用に使うPCで3.5inchのHDDが10個もつけられるケースというのがまずありません。一応kakaku.comで調べてみたのですが、5万円以下までではたった1つしか見つかりませんでした。こうなってくるとさすがに本当のブレードサーバで使えるものを探すしかなくなってくるのでそれはさすがに範囲外ということにして、今回はこの条件で考えてみたいと思います。

おまけとしてこのレベルのファイルサーバであれば10GbEのカードもつけたサーバの方がよいかもしれません。私が今現在使っている32TBのファイルサーバですら家庭用というには大分すごい状態なのに、上記の構成だと家庭用の領域を超えているのでは?と思えなくもないですよね。

 

実際どんなパーツが必要?

ということで、今回は「CPU、マザーボード、メモリを抜いて」「20万円以内で」を目標に考えてみたいと思います。

ストレージ

4TB HDDの方は適当にNAS用のHDDでもつけておけばよいでしょう。例えばこんな感じ。

Seagate IronWolf 3.5″ 4TB 内蔵ハードディスク HDD 3年保証 6Gb/s 64MB 5900rpm 24時間稼動 PC NAS向け ST4000VN008

ちなみにSeagateにしているのは信者とかではなく次の8TB HDDの影響です。この記事を書いている段階では13,700円ほど。

 

問題は8TBの方です。「20万円以内で」の条件の関係で、こちらにNAS HDDを使うと値段が跳ね上がってしまうのが最大の問題点。ちなみにこの記事を書いている段階では8TBを超えると常時使用のHDDのタイプしか残らず、費用がかなり高くついてしまうので8TBx8の構成にする、という理由もあります。値段重視にするとNASを構築しようとしているにNAS HDDが使えないんですよね…。この条件に最も適しているストレージがおそらくこれ。

Seagate BarraCuda 3.5″ 8TB 内蔵ハードディスク HDD 2年保証 6Gb/s 256MB 5400rpm 正規代理店品 ST8000DM004

これならば1台あたり14,500円ほどとOS用のHDDとまとめて10台買ったとしてもなんとか16万円で収まるため、残りのものを買っても目標金額内で購入できます。ちなみに上にも書きましたが、GB単価が一番安いのがこの付近で、10TB以上になると台数は少なくできるのですが値段が跳ね上がってしまいますし、NAS用だと8台も買うとそれだけで20万円を突破してしまうのでNAS用ではないことを考えてもこの選択となります。まあ、家に置く用であれば必要なときだけ電源を入れて不必要なら消す、壊れる可能性についてはRAID6(RAID Z2)に保障してもらうというところですね。

 

ストレージインターフェイス

マザーボードに何個SATA端子がついているかにもよりますが、とりあえずはこのくらいでしょうかね。

玄人志向 キワモノシリーズ SATA3 10ポート増設インターフェースボード SATA3I10-PCIE

画像がないのはAmazon経由だと引き出せなかったからです。1つのカードに複数のポートがついていると負荷がかかった場合に速度が遅くなるという問題はありますが、今回はインターフェイスの数を優先して考えてみました。こちらにストレージの8台をつないで、マザーボード側にOS用のHDDをつないでRAID1構成とすれば問題ないと思います。値段も7,000円くらいとほどほど。

 

PCケース

Fractal Design Node 804 black MicroATX PCケース 日本正規代理店品 CS4710 FD-CA-NODE-804-BL-W

HDD10台のケースというのがまともにないのが問題点。そんなPCを作る人がほとんどいないから当たり前か…。これなら13,000円レベルで3.5inchを10台搭載可能らしいのでこれくらいしか選択肢はありません。ちなみに大半のドライブは吊り下げ方式になるとのこと。一応今現在使っているファイルサーバの一代前にNode304というこれの小さいやつを使っていたのでどういうことかはわかっているのでまあ問題ないかな、と思います。なお、ケースの制約によりマザーボードはMicroATX以下のサイズでなければならないようです。MicroATX以下のサイズでSATAが10個もついているマザーボードなんぞ見たことがないような気が…。

 

資金を集めて組み立てないと…

とりあえず今年の目標になるかな、というところです。定職に就くなり大きいプロジェクトに参加するなり細かく仕事を請け負うなり、株なり為替なり宝くじなりで夢をつかむなり、という感じで資金を集めて…というところですね。コロナの影響で経済の状態がおかしい上に貿易も…となってくると値段の変動が心配にはなりますが、そこはそれ、ですね。

 

OSはどうするのか?

Unix系を使うのは確定なのですが、問題はRAID6の方。上にも書いてあるのですが、書き込みの保障のためにZFSを使ったRAID Z2で組みたいかな、とは思っているのですが、そうするといつも使っているCentOS系だとライセンスの問題などでZFSの構築がかなり面倒になったり、更新が行われるとそのたびに領域が見えなくなる、といった問題が発生しそうな気がしていて…。zfsの更新がちゃんとできるようにしてCentOSを使うか、逆にFreeBSD系を使ってみるのか、いろいろと選択肢はありそうですね。

 

FPSゲームがそれなりにできる本体が小型のPCって…

二連続でPC本体に関する話題です。ちょっととあるところからPCが遅すぎて困るのでなんとかならないか?という話を受けましていろいろと調べてみた結果を自分の考察とともに書きたいと思います。まあ、結論が悲しいですが…。

 

FPSゲームをやりたいけれどもPCが…

特にゲーム機(SwitchやらPS4やら)で展開しているFPSゲームの場合、PCを持っている場合PCでもできるようにならないか?と考えるのはまああることなのでしょう。ただ、PCに詳しい人ならばすぐにわかりますがFPSゲームはよほどのことがない限りグラフィック性能を大幅に要求するので古いPCやGPUがない場合まともに動かないです。しかも購入当時にホビーでの利用や事務利用を目的としている場合はグラフィック性能なんていうものはどうでもいいことが多いのでさらに悲惨です。ちなみに、10年~6年位前のPCだとちょうどIntelのCore iシリーズが大幅にシェアをとっていた上CPUにグラフィック処理が内蔵されてしかも最低限の3Dも動かせるようになっていたため高価格帯や性能特化でもない限り大半のメーカー製PCではGPUを別に導入してもコストが高くなりかつほとんど使われないので省かれる対象となっていたわけですね。というわけでまともに動かない、という結論に至ります。まあ、そこまで古いとHDDなんかは耐用年数の問題もあるので機械的に更新の時期でもあります。

 

とある条件を加えるとFPSができるPCが大幅に限定される

というわけでどういうものがあるか調べてほしい、という依頼を受けまして調べてみたのですが、その条件がこれ。

  • 1年間の間にPCを数回動かすこと、また常時置いておく場所にスペースがほとんどないので(ノートPCである必要はないが)PC本体のサイズは小さく持ち運びがしやすいこと。(この「持ち運びがしやすい」はLANやキーボード等が無線化されているなどケーブル類がほとんどないことも含む)
  • メインとなるモニタにはある程度のサイズがあること(20inch以上)
  • FPSゲーム(指定されたのはFortnite)がそれなりの速度で動かせること
  • 自作のようにサポートが個人に依存する・複数メーカーに渡るような状態は不可。(つまりメーカー製)
  • 予算は10万円~15万円を目安。ただしMicrosoftOfficeを含むこと

 

実は「小型PCのように動かしやすい」と「FPSゲームが動かせるGPUがある」は条件として相反に近い状態

理由は単純でFPSゲームが動かせるレベルのGPUは性能故に消費電力が大きく、発熱がかなりあるため小型化がしづらいということがあります。そして「持ち運びのため、ケーブル類がほとんどない」の条件に当てはまるのはこの場合ノートPCやモニタ一体型PCといった発熱をかなり気にするPCばかり、ということになってしまうからです。

そうでなくてもメーカー製PCでグラフィック性能がある程度あるGPUを積んでいるものはミドルタワー以上となり、設置場所の関係でミニタワーレベルすら使えないという条件が厳しいのでグラフィックカードは別積みしづらく、ノートPCもメインとなるモニタのサイズを求めると別モニタを買わざるを得なくなり上記の条件を満たしづらくなる、というものだったりします。

ちなみに自作が許されるのであればモニタの後ろにVESAマウンタで本体を止められる位の小型PCで組み立てて、PC本体にGPUを追加でくっつける、という手法が使えないか、とも考えましたが…。まあちょっと厳しいですか。そこまで小型のものだとほとんどのものはグラフィックカードを載せるスロットがないですからね。

 

そうなるとモニタ一体型PCに活路を求めるしかないのでは…

こんな条件に当てはまるのはモニタ一体型PC位しかない、という結論になってしまうわけです。ちなみに別のサイトでモニタ一体型PC全体についての考察として書かれていたこととして要約すると「モニタ一体型PCはデスクトップPCの悪いところとノートPCの悪いところを併せ持つようなもので、せいぜい家のリビングにおいて置くようなPCくらいの用途になるだろう」だったのですが、今回の条件からモニタ一体型PCから探すしかないのでは?というところでした。

 

FPSゲームを動かせるレベルのGPUを積んでいるものはあるのか?

最終問題はこれ。当たり前ですがIntelのUHDGraphics630(CPU内蔵グラフィクス)ではかなり性能が不足します。それを考慮に入れると、性能が低い方から

  • AMDのRyzenに内蔵されているGPUを利用する
  • AMD/NVIDIAのモバイル向けGPUが搭載されているものを利用する
  • AMD/NVIDIAのデスクトップ向けGPUが搭載されているものを利用する

となります。一応ベンチマークサイトなどを見る限りではRyzen内蔵GPUだとIntelよりはかなりましですがそれでもかなりきついのでできれば専用GPUがほしいところです。ちなみにこの時点で日本国内の大手メーカーのモニタ一体型PCはすべてアウト。そうなるとDellかHPか…というところになります。なお、ノートPCでもこの価格帯で専用GPUがあるものは数が少ないです。まあ、この価格帯でノートPCにグラフィック性能を求める人がどれだけいるか怪しいですからね。

ちなみに、簡単に検索するとこのあたりになります。

Dell デスクトップパソコン Inspiron 5490 Core i7 ブラック 20Q32/Win10/23.8FHD/8GB/512GB SSD+1TB HDD/MX110

ASUS 液晶一体型 デスクトップPC ZenAiO【日本正規代理店品】超狭額ベゼル/23.8型/1TB+128GB/GTX1050/第8世代Core i5/8GB/ZN242GDK-BA050T

HP 液晶一体型 デスクトップパソコン インテルCore i7 16GB 256GB SSD+2TB ハードドライブ 23.8 インチ タッチ対応 フルHD ディスプレイ NVIDIA GeForce GTX 1050 グラフィックス搭載 Windows10 HP Pavilion All-in-One 24 Microsoft Office付き (型番:6DU74AA-AABB)

 

自作とは違うマニアックさが求められるPC考察でした

あとFPSゲームに関してですが、PCに詳しくない人の場合はPCの性能について知らずにFPSゲームをプレイする場合があり、そもそもロードすらまともにできず固まって動かない、なんてことがよくあるように思われます。このあたり、ゲームを始めるときに「PCにゲームを動かせるだけの力がないよ」みたいな警告を出す機能があればいいのかも、と思いました。

 

DeskMini A300を使ってPCを移行してみた

TwitterでしばらくつぶやいていたPCのアップグレード計画を実行に移してみたものです。今回の計画にはちょうどよいタイミングでいろいろなことをやっていたので思い切ってやってみました。

 

とりあえずPCの強化を行いたい

自分が使うメインPCではない(親のもの)なので放置していたのですが、ちょっと気になったので見てみるとCPUがCore i3 530という多分10年くらい前に発表されたCPUで動いていました。物持ちよすぎるというべきでしょうか。なお、ストレージはさすがに遅すぎるので途中でSSDに切り替えてはいます。そのため、今回はいくつかの目的および条件を設定して強化を行うことにしました。それは、

  • PCを置く場所を変えたいのである程度小型(MiniITXレベルまでは下げたい)のPCであること
  • メインメモリが4GBしかないとWin10を動かすときにもっさりする場面があるのでメインメモリは最低でも8GBを用意したい
  • OSの移行が面倒なのでストレージ+OSは旧パーツを流用したい(つまりストレージやOSはなくてもよい)

というものです。これらの条件をすべて兼ね備えていたのが…

 

今回の主役はこれ

そう、いらないものを極力減らす+サイズを下げることを目的としてベアボーンにしてみました。今回使うのはASRockのDeskMini A300というもので、発売自体はこの記事を書いている時から見ると1年くらい前なのですが、サイズがMini-STXなのでかなり小さく(ちなみに公式でのサイズは155x155x80)、かつグラフィックもCPU内蔵ですがRadeonになるのでIntelCPUより強力になる、何よりずっとIntelばっかりだったので機会があればAMD系のCPUで組みたいな~と思っていたので今回はこれにしています。

まあ、実はというともう一つうますぎる条件があり、それが(この記事を書いている前後の期間だけだと思いますが)パソコン工房でちょうどこれを使ったセールをやっていて、このベアボーン(DeskMini A300)+Ryzen5 3400G+16GBメモリで税抜き32000円という今回の強化にもってこいなくらいのものがあった、というのが真相だったりします。値段的には16GBのメモリの分がそっくりそのままサービスで入っているような感じです。8GB位を目指していたのに一気に16GBとはこれはありがたいです。

 

つまりCPUはこれ

というわけでRyzen5 3400Gです。ちなみに個人的には少し残念なこととして、このCPUは3000番台で3000番台はグラフィクス内蔵でない通常のCPUのコアはZen2ですが、3400Gはグラフィクス内蔵なのでCPUコアは一世代前のZen+になっているようです。Zen2を搭載したグラフィクス内蔵CPUはこの記事を書いている少し前に発表されたばかり…。少しさみしいです。

 

組み付けそのものは簡単

このあたりはほかのYouTuberの方が組み立て動画をあげているので詳しい説明はしません。一応ベアボーンに電源(ACアダプタ)とCPUクーラー(Ryzen5の場合はCPU付属のものは大きすぎて入らない)のでそれを使えば問題はありません。ただ、組み立て動画での紹介ではベアボーン付属のCPUクーラーは騒音が気になるレベルとあったので私は別にCPUクーラーを買うことにしました。一度分解してサクサクと組み立てれば完成です。

 

移行作業は要注意

これはベアボーンだろうが何だろうが関係なく注意です。今回私が行ったストレージ(+OS)だけが旧PCからの引き継ぎとなる場合は必ず旧PC上で関係するすべてのドライバを削除しドライバを自動的に当てないようにして最低限の環境にすること、OSの整合性をとる(今回の場合はRyzenがWin10 64bitのみサポートなのでそれになっているかどうか)こと、そして今回私がはまったのがデバイスのUEFI対応を確認すること、になります。

特に古いストレージ(しかもパーティションがMBR形式)の場合UEFIに対応していないことがあるらしく、初期設定のままではデバイスは認識できてもブートデバイスとして認識できないためそのまま起動させることができません。この場合はM/Bの設定でCSM(Compatibility Supported Module)を有効にしてブートデバイスとして認識させましょう。ちなみにこの場合はSecureBootやFastBootが使えなくなりますのでこれはまあ仕方がないと思ってもらうのがよいかと思います。

 

移行作業で出てきたネズミにかじられたLANケーブルにびっくり

旧PCを解体したり掃除をしたりケーブル類も取り替えて…と見ているとびっくりしたのがこれ。たしかにネズミがそれなりの数走り回っていたのは聞いていましたし、設置してから9年前後たっているのでそうなっていても仕方がないのかもしれませんが…。LANケーブルがこんな感じになっていました。

かじられたLANケーブル

かじられたLANケーブル

外側だけではなく配線の被覆までかじられて一部の導線が露出している状態になっていました。導通チェックをしたくもない状態ですね。こうならないように状態のチェックやら配線の交換をしておきましょう。

2020お伊勢参りの旅+α

ということで、昨年もお伊勢参りに行きお参りをしてきたわけですが、今年も新年ということでお参りしてきました。

 

今年は二見興玉神社から・・・

今年は順番を少し考えてお伊勢参りする前には二見興玉神社に行くべし、ということを守りまして日が昇るタイミングで二見興玉神社を参拝してきました。日が出る前の夫婦岩や、日が昇り明るくなっていくときの様子などがなかなかよかったです。ちなみに1月では夫婦岩から日の出は拝めません。それが見られるのは夏至の前後1ヶ月ほどということを考慮に入れないといけません。

 

昨年より1時間前後早く移動してきたので

1月上旬の日の出の時間帯に二見興玉神社から出ると、自家用車の場合は大体7時30分までには外宮もしくは内宮へと着けると思います。この時間であれば正月三が日でもない限りは近くの駐車場に止められると思います。公共交通機関はあまり走っていない時間ですし、パーク&バスライドのバスは9時にならないと動き出さないので朝が早いとこのあたりをどう考えるか、で少し悩むところです。

 

内宮周辺・外宮周辺も合わせて午前中でなんとか参拝できた

午前8時より前に伊勢神宮への参拝ができれば別宮も合わせても参拝は可能ですね。一応神社は午前中に参拝した方がよいとどこかに書いてあったと思いますのでそれを守ろうとすると気になるところですが、今回それはOKだった、ということで。

 

関係する剣祓などを集めてくると・・・

こんな感じになりました。順番は適当です。

伊勢神宮内宮・外宮剣祓

なお、別宮のうち離れた場所にあるもの(伊雑宮、瀧原宮、瀧原竝宮)は今回含まれていません。計画を立てたときに失念していたので・・・。今年はこれらを神棚におまつりして一年を過ごしていきたいと思います。なお、これらをすべておまつりしようとしたので神棚がえらいことになりましたが・・・。

また、この写真から何か感じ取れる人がいたらぜひコメントを。神棚におまつりする前に並べると妙に神々しかったのでこれを紹介したかった、というのもあります。

C言語の仕様書に従うならNULLは0もしくは(void *)0らしい

ちょっとtwitter上でNULLに関することをつぶやきましたが、ツッコミが帰ってきてしまったため気になって仕様書(C89およびC99のもの)を読み込んでみました。そしてすべての論理をつなげてみると次のような結論となりました。

整数値の0もしくはそれをvoid *にキャストしたものがNULLとして定義される、と。

 

仕様書にはどう書いてあったか、というと・・・

C89でもC99でも記述は同じなのでそれは置いておいて。まず、null pointerおよびそれに関わる用語の定義です。関わる部分だけざっくりと翻訳すると次のようになります。

  • 整数値の0、もしくはそれをvoid *にキャストして表したものをnull pointer constant(ヌルポインタ定数)と呼びます
  • null pointer constant(ヌルポインタ定数)をそれぞれのポインタに変換したものをnull pointerと呼びます
  • null pointerはほかのどのオブジェクトおよび関数とも一致しないことが保証されています
  • null pointerをほかのポインタ型に変換してもそれはその型でのnull pointerとなります
  • null pointer constant(ヌルポインタ定数)はstddef.hでNULLとして定義されます

というわけで、この部分からNULLの定義について読み取るなら、それは1行目と5行目をつなぎ合わせることになり、「NULLは整数値0もしくは(void *)0として定義する」という結論が得られるわけです。ただし、3行目の説明を読んでみると、「何も指さないことが保証されている」という参考書の説明とは微妙に食い違っているように見えるのですが…。細かいことをいうなら特定のメモリ空間をオブジェクトに含めるのかどうか?というところでしょうか。

 

いくつかのシステムにおける例外について

なお、以下はWikipediaの記述(+リンクされていた参考資料)から読み取っている項目ですが、いずれもかなり古いシステムにおいて

  • null pointerが指しているアドレスが0でないシステムもある
  • (void *)0をキャストしてアクセスすると特定の読み書きとして成立するシステムもある

とのことでした。前者は48bitアドレスというなかなか変わった方式のものですし、後者は仮想メモリやメモリ保護の概念がない時代のものですので、今の時代には全くそぐわないものですから無視してもよいかもしれません。

 

ちなみにif(!p){ }の是非について

これが「ポインタ変数pがnull pointerのとき」の意味になるのか?については、仕様書から読み取ると

  • !pという演算は0==pと同一となる
  • ポインタとnull pointer constant(ヌルポインタ定数)が比較される場合はポインタの型に合わせたnull pointerとの比較として扱われる
  • 0はnull pointer constant(ヌルポインタ定数)として扱われる

ため、if(!p){ } はちゃんと「ポインタ変数pがnull pointerのとき」の意味になるようです。

 

意外と細かい仕様があってびっくり

というわけで「C言語の仕様書に従っている限りはNULLは0だし、null pointerによるifの判定にも誤りはない」という結論になりました。仕様書を読んでみるといろいろな動作についてちゃんと定義が書いてあるので、これに従ったコンパイラを完全に作るのは確かに大変だな、という感想もあります。ただし、逆にNULLをポインタにキャストしてアクセスした場合常にメモリ保護例外などのエラーとなるとは限らない、というのは調べていてびっくりした点です。今のシステムではほぼあり得ないことですが、昔のメモリ空間がカツカツだったりする環境のためなのでしょうかね。

 

C++にはnull pointerを表す定数が追加されていることを初めて知った

しばらく技術書を細かく眺めていなかったので知らなかったのですが、nullptrが追加されていて、C++11以降ではこれがnull pointerとして扱われるようです。NULLは上記の定義より整数型としての値を持つことがあり、引数として整数型とポインタ型のオーバーロードがあった場合にNULLを指定すると誤って整数型を引数とする方が呼び出されてしまう、という問題が起こってしまいます。それを防ぐために明示的にnull pointerで呼び出していることを示すものということでした。そういえば昔この手の問題で悩まされたことがあったな~と懐かしみながら。