FPGA入門機としてのCYC1000という選択肢
CPUのアーキテクチャを勉強したり、PLC*1を触っているとFPGAをやりたくなったので、そのボードを買ってみた話。 最終的にCYC1000とかいう日本語での解説記事が一切ない*2FPGAボードにたどり着いたので、今後このボードを買う人の助けになればと思う。
知人がDE0-CVというFPGAボードを持っていて、自由に使っていいとはいっていたがちょっと古いしせっかくなので買ってみようと選定をした。 AlteraがIntelに吸収されてからQuartusという開発環境がいいと小耳に挟んだので、そっちの方向のFPGAでいいものがないか調べてみた。
FPGAの選定ログ
2020年現在手頃な価格で購入できるAlteraのFPGAチップには以下のものがある。
- Cyclone II ~ V
- Amazonでも手頃に購入できる3000円程度のCyclone II
- よく普及しているCyclone Vを搭載したDE10-nanoボード
- Cyclone IIは2004年、Cyclone Vでも2011年発売のもので、すでに発売から10年近く経過しているため新しく購入するにはいささか古い
- MAX 10
- 雑誌などでもよく紹介されている有名なFPGAチップ
- 入手性もよく、発売は2014年だが入門機としては現役
- 安価に購入できる(3000円〜)
- Cyclone 10
- 廉価版のLPシリーズとハイエンドのGXシリーズがある
- 2017年発売で比較的新しい
- 評価ボードの種類は少なく、価格も高価(数万)であることが多い
以上、初心者の入門機として購入するので、CPUが最低限実装できるくらいの規模であとは価格重視で選定を行った。 ソフトウェアCPUのNios II/fで使用するLE数は約2500LEらしいので、一般的なFPGAなら問題なく実装できそう。
なのでMAX10でいいボードがないかと調べているとMAX1000というボードを見つけた。 小さいボードでMAX10が載ってて8kLEなのでCPUも行ける。 そんでもって3000円ということでもう少し調べてみると、同じ製造元が出しているCYC1000というボードを見つけた。
CYC1000はCyclone 10 LPが載っていて、LE数は25kとMAX1000の3倍だし、価格は1000円も変わらないということで明らかにこっちのほうが良さそうに思える。 しかし冒頭に述べたように、このボードに関する日本語の記事はどこにもなく、さらには英語でもレビューは存在しないというもので少し地雷臭のするボードであった。 それでもMAX1000は良さげだし、同じメーカーならそこまでひどいものはないだろうとポチったわけである。
CYC1000を見つけたサイトはchip1stopというところだが、残念ながらここはBtoBのお店らしく、個人向けには販売してくれないらしい。 ほかのサイトで購入できる選択肢としては、Aliexpressと特電という日本の会社、あとは製造元のArrowの公式サイトがあった。 Aliexpressはコロナの影響で納期が怪しかったのでパス。Arrowも同様ということで在庫を持っているらしい特電で注文をした。
ここも結局日本に在庫がなかったので、Arrowから取り寄せという形になってしまったが、1.5週間で手元に届いた。
詳しいレビューに関しては次回の予定。
ddでサイズの違うNTFSパーティションをクローンして失敗した話
256GB SSD x2から1TB NVME SSD x1に変更したときの失敗談。
初めの状態
最初にPCを組んだ時に手元にWindowsがなかった関係で、とりあえずWindows Insider Previewでも入れてみるかとなったのがすべての始まり。 そこに後で購入したWindowsをインストールしたら、次のような地獄のディスクマップになっていた。
Windowsをインストールしたときに新しいSSD挿すから全部良しなにやってくれとインストーラーにぶん投げていたので、こんなことになっていたことに今更気が付いた。
問題点
やったこと
Gentooのインストールメディアは有事に備えて常に準備しているので、こいつでddを使った。
arch wikiをベースに
dd if=/dev/sda of=/dev/nvme0n1 bs=64K conv=noerror,sync status=progress
といった感じで、SSD1の内容をNVME SSDにクローンして partedでリカバリーを削除、Insiderのパーティションを1TBまで拡張して
dd if=/dev/sdb1 of=/dev/nvme0n1p3 bs=64K conv=noerror,sync status=progress
ddでWindowsパーティションのクローンを行った。 このままだと256GBのパーティションの情報のままなので、partedでパーティションを拡張してディスク周りは完了。
パーティション周りを更新したので、最後にWindowsのインストールメディアからbootrec
なりbcdedit
でEFIのブートに関する情報を更新した。
結果
1TBが256GB程度と認識される。
- Windowsのディスクマネージャーやpartedで見てみると1TBのパーティションと認識
- mountして
df
やWindowsのエクスプローラーから見ると256GBしか使えない模様 - ディスクマネージャー側では正しく認識しているので、再度拡張しようとしてもうまくいかない
直し方
結局はフォーマットしなおして、ファイルベースのコピーをしたので、ここからは参考にならない情報であることを先に宣言します
ソフトウェアによって出ている情報が異なるので、ドライブ内部でデータの不整合が生じているっぽいと考え、GPTテーブル(ディスク単位での情報)とNTFSのboot sector(パーティション単位での情報)の内容を比較してみた。
HxDなどのバイナリエディタでディスクを開いてみる。
Wikipediaの情報をもとにこれを解読すると、LBAは[0xFF, 0x67, 0x70, 0x74](リトルエンディアン)を指しているので、おおよそ1TBの容量を持っている。
しかしながらNTFSのboot sectorでは、ここの情報を基に解読するとTotal Sectorsが[0xFF, 0xB7, 0xF1, 0x1B]となっており、256GB程度の容量となっていた。 Checksumは0埋めされていたので、ここのTotal Sectorsを正しく書き換えればうまくいきそうという指針が立つ。
GPTテーブルから計算したTotal Sectorsは0x745d27ffであるので、これをリトルエンディアンで書き込めばよさげである。
とここまで計算したが、Windows側からだと起動ドライブに対するRawな書き込みができず、Gentooのインストールメディアにはいい感じのディスクエディタが入っていなかったので、結局はmkfs
とrsync
でファイルベースのコピーをして直った。
まとめ
ddは同じサイズのパーティションに対して行うのが安全。
jupyterの布教
Sector数とかバイト数とか1TBオーダーだと平気でint64の範囲を超えてくるので、Excelなどの普通の電卓だと計算できなくなる。 pythonならデフォルトで多倍長整数だし、10進数と16進数の変換がとっても楽なので、こういう計算がしやすい。
jupyter notebookだと、インラインで計算しつつメモもとれるので、こんな感じの計算にピッタリだった。
参考程度に今回使ったjupyter notebookのmarkdown形式のexportを以下に載せてみる。
# 今回使用するクラス class Sector: # addr:リトルエンディアンのHexArray def __init__(self, addr): self.addr = 0 for i, h in enumerate(addr): self.addr += 256**(i)*h # バイナリエディタのジャンプ機能で必要 def offset(self): return hex(self.addr*0x200) class Partition: def __init__(self, cur, next): self.current = cur self.next = next
# GPTテーブルについて # 値が正しく計算できているか検証をした Primary = Partition(Sector([0x1]), Sector([0xAF, 0x6D, 0x70, 0x74])) # 計算結果のoffsetにジャンプしてGPTセカンダリテーブルがあったら正しく計算できている print(Primary.next.offset())
0xe8e0db5e00
# GPTテーブルから読み取ったData partitionの情報 Data = Partition(Sector([0x00, 0x40, 0x13]), Sector([0xFF, 0x67, 0x70, 0x74])) print(Data.current.offset()) # 容量 print((Data.next.addr - Data.current.addr)*0x200/2**30, "GiB")
0x26800000
930.9111323356628 GiB
# もともとのTotal Sectors original = Sector([0xff, 0xb7, 0xf1, 0x1b]) # 容量を計算してみる print(original.addr*0x200/2**30, "GiB") # GPT側から計算したセクタの数 print(hex(Data.next.addr - Data.current.addr)) # よって書き換えるべきセクタ数は print("ff 27 5d 74 00 00 00 00")
223.55371046066284 GiB
0x745d27ff
ff 27 5d 74 00 00 00 00
Gentooの沼
はじめに
最近はUbuntuが意外と普及をしているらしく、自分の周囲でもLinuxをメインで使っている人をチラチラ見かけるようにはなった。 しかしながら自分としてはGentooを押していきたい。
Gentooについてなにかを調べても日本語でヒットすることは稀で、Googleトレンドで検索件数を見てみても、Ubuntuと比べてその差は歴然であったりする。
そもそも記事が少ないのが、検索されない一因である気もするので*1、 そもそも少ないGentooの記事を少しでも増やそうと思う。
Gentooとは
意外とGentooという名前は有名らしく、そもそもこの記事にたどり着くような人にとっては耳タコ間違いないので、ここでは簡単な紹介だけにする。
Gentooはすべてのソフトウェアをセルフコンパイルしてしまおうというディストリビューションだ。 普段使うターミナルはもちろんLinuxのKernelも自分で設定してコンパイルする必要がある。
LinuxにはLinux From Scratchというもはやディストリビューションと呼べるかわからないものもあるが*2、それを除けば最も低レイヤから組み立てるディストリビューションであり、最もカスタムをしやすいLinuxであることは間違いない。
利点
ローリング・リリースである
自分がそもそもGentooに行き着いたのは、ローリング・リリースのLinuxを使いたいと思っていたからだ。
Gentooに行き着く前には、Debianをメインに使用していたが、Debianは安定性を売りにしているので普通のパッケージが古かったり、メジャーバージョンを更新するのが面倒だったりした。 そこでローリング・リリースのディストリビューションを探していて、これらの問題を解決できそうなArch LinuxとGentooに行き着いた。
ローリング・リリースだと、時々のメンテナンスさえすれば常に最新になるので、基本的に脳死で使えるのがとても良いと個人的には思っている。
カスタムがしやすい
セルフコンパイルができるということは、コンパイル時のオプションをいじることで様々な機能のスイッチングができることを意味する。 したがって、消費電力を最優先に全体をチューニングすることもできれば、安定性や機能性を求めることもできる。
具体的には、消費電力を気にすると、アイドル時の電力が10W程度のサーバー組み上げたり、 Laptopの場合だと充電をWindowsの1.5~2倍程度長く使うことができる。
カスタム自体は他のLinuxでもそこまで難しいものではないが、flaggie
などのコマンド一つでカスタムを行え、依存解決やコンパイル、インストールまでが簡単に行えるのはGentooだけの魅力だ。
パッケージのみならずKernelの設定やinitシステムなどありとあらゆるものを自由に設定できる。 Gentooらしさを作っているportageというパッケージマネージャについても、公式でArch Linuxのパッケージマネージャであるpacmanをインストールできるようになっている。したがって(意味もないのでやる人はいないと思うが)pacmanで管理するGentooすら作れるのだ。
Linuxの便利さに気がつく
Gentooをある程度自分好みにカスタムすると、もはやWindowsには戻れないのではないかと思う。 もともとLinuxはCUI文化であるため、コマンドなどを覚えていないうちはとっつきにくいものである。 しかしながらGentooのインストール時にはもちろんXシステムなんてないので、Gentoo Install Battleを終えたあとにはCUI文化に抵抗はないだろう。 そしてそのまま使う続けると、ターミナルさえあればで様々な問題が解決できるLinuxの便利さに気がつく。 サーバーやマイコンなどを開発するときは特に、WindowsよりもLinuxのほうが遥かに使いやすくなっているはずだ。
コントロールパネルのどこにあるかもわからないような設定項目を掘り当て、設定を変える必要もなければ、 意味もなくPCのファンがうるさく回ることもないなど、Windowsを使うと気がつくことが増えているのは個人的な悩みではある。
資産を作れる
自分好みのGentooというのは、基本的に様々なパッケージの設定ファイルの集合体である。 そしてGentooでは基本的にピュアな状態のパッケージを用いることになるので、どんなディストリビューションを使うことになったとしても、その設定ファイルは役に立つのだ。
一度自分好みの環境を作ってしまえば、Gentooを別のマシンにインストールするときも設定ファイルをコピーしつつ、コンパイルを放置すればいいし、Raspberry Piなんかを設定するときも容易に自分の色に染めることができる。
その他
- Linuxのシステムをわかった気になれる
- 英語力がつく
- 自己満足に浸れる
問題
デバイス周りが(慣れるまで)地獄
Gentooを使う上で最も大変なことは、デバイス周りの設定である。 デスクトップPCなどの一般的なシステム構成ならば大きな問題はないが、Laptopでは組み込まれたデバイスを有効化するためにKernelオプションを弄り倒す必要があるかもしれない。
例えば、Wi-Fiアダプタとしてよく使われるIntelのチップでは、モジュールを用意した上でKernelにそれを読み込むように記述する必要があったり、タッチパッドがどうやっても動かず、 最終的に別の会社のLaptopの情報をもとにKenelの設定項目を見つけ出したこともあった。
これらの設定は最初の一回だけ必要なので、インストール中の苦悩になると思うが、これで挫折する人も多いのではないかと思う。
何回かやっていくと、lspci
やlsusb
,lshw
,dmesg
と仲良くなって、なんとなくできるようになった気がするので、慣れるまでが非常に高いハードルなのではないか。
英語力が必要
冒頭に述べたように、Gentooに関する日本語の記事というのは圧倒的に少ない。 辛うじていくつかのGentoo Wikiのページが日本語化されているだけで、多くの情報が英語のWikiやthreadにあると思う。
したがって、最低限の英語の読解力か少なくともGoogle翻訳を使えば意味がわかる程度が必要となる。
エラー時が絶望
脳死状態でemegre -UDN... @world
(更新コマンド)をやっていると、エラーで大変なことになることがあった。
例えばpatch
コマンドで使用するlibattrというライブラリが壊れてしまい*3、パッチ当てるパッケージがインストールできなくなったこともあった。
この際は、治そうとしてcp
やmv
すら使えなくなりながらも、USBブートしたLinuxでライブラリのrpmパッケージからsoファイルを抜き出して、上書きするといったアクロバティックな対処法をしたような気もする。
こんな感じで依存関係がねじれたり、システムが動かなくなることが起きてしまうと、いっそクリーンインストールした方が楽なんじゃないかとも思うことがある。
パッケージをインストールする段階で、unmaskといったような警告を解除する必要があったりと、ある程度注意を払っておけばこのようなことにはならないと思うが、なってしまう可能性があるし、 もしメインPCとして使っているのであれば、休日返上して一日がかりで直さなければ行けないこともあるのが何よりも恐ろしい。
まとめ
つらつらと自分なりのGentooへの印象を書いたわけではあるが、自分としては上に挙げたような問題もすべて勉強だと思って受け入れているし、自分だけの何かを作ることがとても楽しく感じているからGentooを使っているのだと思う。そしてこうやって見ると、どうやっても一部の変態さんにしか受けないディストリビューションな気もする。Gentooの楽しさはカスタムにあると思っているので、ちょっとだけお試しするのも違うと思うし、これは人口が増えないのもしょうがないのかな。