- 投稿日:2019-09-09T17:51:02+09:00
中華レトロゲーム機を解析してみる
概要
一部の方面で話題になっている,中華レトロゲーム機を購入したので解析をしてみた.物忘れの激しいワタシ向けのメモのようなものである.
解析のゴールを何にするのかが悩ましいところであるが,中華レトロゲーム機向けのアプリケーションの開発環境の構築方法を示せればいいかなと思う.
そうすれば大勢の発想豊かなどなたかが,なにかいいものを作ってくれるのではないかと.
イメージファイル
入手
電源を入れるとRetroFWの画面が表示された.これをキーワードにググるとRetroFWがすぐに見つかる.
リリースファイルのRetroFW_v1.2.zipをダウンロードし,中身を見てみる.
配布物の中身
zipファイルを展開すると,RetroFW.imgとバッチファイルとdd.exe,サブフォルダに各種uBoot.binとuImage.binが現れる.
バッチファイルから見えてくること
バッチファイルの中を見ると,dd.exeを使ってRetroFW.imgの中の特定の位置にuBoot.binとuImage.binを書き込む処理が書かれていることがわかる.例えばRetroGame_v1.0_S_B.batは以下のようになっている.
RetroGame_v1.0_S_B.batdd if=kernel/RetroGame_v1.0_S_B.uBoot.bin of=RetroFW.img conv=notrunc bs=512 seek=1 && dd if=kernel/RetroGame_v1.0_S_B.uImage.bin of=RetroFW.img conv=notrunc bs=1024 seek=4096uBoot.binはファイルの先頭から512byteオフセットした位置から,uImage.binはファイルの先頭から4Mbyteオフセットした位置から書かれることがわかる.
U-Bootは電源が入ってすぐの初期の段階で動作を開始し,ハードウエアの初期化を行った後にOSの起動を行う,いわゆるブートローダーである.
これがファイルの先頭から512byteオフセットした位置に書かれるのだから,この中華レトロゲーム機で採用しているチップはmicroSDの先頭から512byteオフセットした位置(仮にLBA 1としておく)からをRAMに読み出してジャンプする仕組みを備えていることが想像できる.
更にこのU-BootはmicroSDの先頭から4Mbyteオフセットした位置に置かれているuImage.binをRAMに読み出してジャンプするように書かれていると想像できる.
イメージファイルから見えてくること
RetroFW.imgを見ると,最初の512byteがMBRであるように見える.
パーティションテーブルのわかりやすい部分だけを抜き出して,表にすると以下のようになる.
パーティションNo. 先頭セクタ(LBA) セクタ数 パーティション種類 #1 0x0000_4000 0x0004_0000 Linux #2 0x0004_4000 0x0008_0000 Linux swap #3 0x000c_4000 0x0013_c000 FAT32 #4 - - 空き 上記に従いRetroFW.imgをバイナリエディタで見てみると,確かに第1パーティション(オフセット0x0080_0000から)がrootfs,第2パーティション(オフセット0x0800_0000から)がswapに見える.
しかし第3パーティション(オフセット0x1800_0000から)は,しばらくの間0で埋められている.こうなっていると,恐らくLinuxからマウントしようとすると失敗するはずで,失敗した場合の動作があらかじめ仕込まれていると考えられる.
具体的には,FAT32でマウントを失敗したらmkfsする,という動作である.もう少し気の利いた設計がしてあるなら,FAT32領域をmicroSDの末尾まで拡張してからmkfsしてくれる事も考えられる(raspbianなんかはそうだから).これは実際に動きを確認すればよいだろう.
MBRのオフセット0からのローダー部分には実行コードが配置されることになっており実際に何かかかれているが,このチップでもそうなのかは判断しづらい.
ひとまず先頭の4byte,
FA B8 00 10
を逆アセンブルしてみると...00000000 1000b8fa b loc_fffee000とのことで,相対ジャンプ命令でしかも飛び先はマイナス方向のようである.これは実行されないような気がしてならない.これ以上突っ込んで調べるのはやめて,ランダム値を書き込んでみてどうなるか,実際に動きを確認すればよいだろう.
Linuxを使ってもっと調べる
ここまでバイナリエディタで調べたことであるが,Linux機を使えばもっと簡単に調べられる事に気づいた.
$ fdisk -l ./RetroFW.img Disk ./RetroFW.img: 1 GiB, 1073741824 bytes, 2097152 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xbb005712 Device Boot Start End Sectors Size Id Type ./RetroFW.img1 16384 278527 262144 128M 83 Linux ./RetroFW.img2 278528 802815 524288 256M 82 Linux swap / Solaris ./RetroFW.img3 802816 2097151 1294336 632M c W95 FAT32 (LBA)調べたとおりである.せっかくなのでもう少し踏み込む.
$ sudo mount -t ext4 -o ro,loop,offset=8388608 RetroFW.img /mnt $ file /mnt/bin/busybox /mnt/bin/busybox: setuid ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped $ readelf -a /mnt/bin/busybox ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: MIPS R3000 Version: 0x1 Entry point address: 0x402fb0 Start of program headers: 52 (bytes into file) Start of section headers: 800132 (bytes into file) Flags: 0x50001007, noreorder, pic, cpic, o32, mips32 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 9 Size of section headers: 40 (bytes) Number of section headers: 26 Section header string table index: 25 : Attribute Section: gnu File Attributes Tag_GNU_MIPS_ABI_FP: Hard float (double precision)MIPS32のバイナリで,FPU搭載のチップを使っているようである.
実際に購入した中華レトロゲーム機の製品名でググってみるとJZ4760というチップを使っている,という情報がありIngenic Semiconductor - Wikipediaを見るとMIPS32 rev1でFPUありの情報が得られる.
まとめ
購入した中華レトロゲーム機ではOSとしてLinuxが動作しており,エミュレータがLinuxアプリケーションとして動作していることがわかった.
参考文献
- 投稿日:2019-09-09T16:12:55+09:00
Pydioで自分専用オンラインストレージを構築(CentOS7)
Pydioはオープンソースの比較的軽量なストレージサーバです。
似たようなツールにownCloudというものもありますが、権限設定などPydioのほうが細かくできるイメージです。マイナーなツールかもしれないですが、自分専用のオンラインストレージが構築できて面白いと思います。PHP製です。
参考
・Install Pydio7 on CentOS7
・Pydio公式前提
yum updateなど初期設定済み
firewalld無効化
SELINUX無効化
とりあえずMariaDBでやります。Pydioインストール
※rootでの作業とします。
必要なパッケージインストール yum install epel-release mysql php-mysql Pydio , MySQL RPMを取得 rpm -Uvh http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -Uvh http://dl.ajaxplorer.info/repos/pydio-release-1-1.noarch.rpm PydioとMariaDBをインストール yum install mysql-server pydioPydio設定
インストールが完了したら、Apacheの設定をします。
cp /etc/httpd/conf.d/pydio.conf /etc/httpd/conf.d/pydio.conf.org vi /etc/httpd/conf.d/pydio.conf ※以下記載。 Alias /pydio /usr/share/pydio Alias /pydio_public /var/lib/pydio/public <Directory /usr/share/pydio> Options FollowSymlinks AllowOverride none Require all granted </Directory>Pydioで保管するファイルなどはデフォルトで、/var/lib/pydio/dataに保管されます。
これを変更したければ、/etc/pydio/bootstrap_context.phpに記載されている
以下の行を修正し、データフォルダを移動してください。define("AJXP_DATA_PATH", "/var/lib/pydio");設定を読みこむためサービス再起動。
systemctl restart httpd systemctl enable httpd次にMariaDBを構成します。
ブラウザを使用してにアクセスします。起動 systemctl start mysql systemctl enable mysql 初期設定 mysql_secure_installation ※ルートパスワードを設定するように求められたら、y+ENTERを押します。 Pydioユーザ、データベースの作成 mysql -u root -p mysql> create database pydio; mysql> create user pydio@localhost identified by 'Pydioユーザのパスワード'; mysql> grant all on pydio.* to pydio@localhost; mysql> FLUSH PRIVILEGES; mysql> exit;
http://サーバIP/pydio
SSL設定などしていないためWarningがでていますが、後から設定出来るため
次の画面で"日本語"を選択し、"Start Wizard!"をクリックすると各種設定ができます。
"click here to continue to Pydio."をクリックします。
"Admin access"をクリックし、管理者ユーザ名、パスワードを入力します。
"Global options"では文字コードや言語、メール設定もできます。
"Configurations storage"の"STORAGE TYPE"よりDatabaseを選択し、"USER"、"PASSWORD"には先程設定したPydioユーザのものを入力しましょう。
"Add Some Users"より管理ユーザ以外のユーザを作成できます。
そうしたら下部の"Install Pydio Now"をクリックしましょう!
.htaccessファイルの内容が表示されることがあるので、そうしたらコピーして/usr/share/pydio/.htaccessに貼り付けてから、再度ブラウザで表示させましょう。 このようなトップ画面が表示されます。
ログイン後の画面ですが、WORKSPACEを作成し、WORKSPACEごとにユーザを追加してファイルを共有することもできれば、自分だけ閲覧可能な専用WORKSPACEを作ることもできます。
My Filesをクリックし画像をアップロードしてみましょう。
右上"新規ディレクトリ作成"で"pictures"というディレクトリを作成します。
picturesと入力。
pictuiresディレクトリが作成されました。
右上に"アップロード"というボタンもありますが、この時点でドラッグ&ドロップすれば
画像をアップロードできます。
他にも機能はありますが、そう難しくないのでDropBoxなどの感覚でいじっていけば何となくわかります。デザインもかっこいいし使いやすいです。
- 投稿日:2019-09-09T13:37:13+09:00
grepの検索から特定のファイルやディレクトリを除外する
- 投稿日:2019-09-09T10:36:21+09:00
UbuntuでMacbookのiSightカメラを利用可能にする
YOLOv3とか使ってみてリアルタイムのobject detectionをしようと思ったら、
Macの内蔵のiSightカメラがなんか使えなかったので自分用メモとして残しておく。環境
- MacBook Pro (Retina, 15-inch, Mid 2015)
- Ubuntu 18.04.3 LTS
やったこと
基本的には以下のコマンドをコンソールに打ち込んだだけ
とりあえず管理者権限へ切り替える$ sudo sugitのclone
$ git clone https://github.com/patjak/bcwc_pcie.gitcdする
$ cd bcwc_pcie/firmwaremakeしてインストール
$ sudo make $ sudo make install上の階層でもう1回makeしてインストール
$ cd .. $ sudo make $ sudo make installあとはカーネルモジュールのロードとか
$ sudo depmod $ sudo modprobe -r bdc_pci $ sudo modprobe facetimehdこれでLinuxからでもiSightカメラが利用可能になった。
v4l-utilsをインストールして確認してみる。$ v4l2-ctl --list-devices Apple Facetime HD (PCI:0000:04:00.0): /dev/video0
- 投稿日:2019-09-09T09:16:33+09:00
『crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません』の解決方法
ネット上の情報で解決できなかったので、同じ境遇の人のためにここに残しておきます。
$ cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)遭遇したエラー
crond start
やcrond status
すると、crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません
と表示されてめちゃくちゃムカつく。ネット上の情報
このエラーは珍しくもない様で、検索するとたくさん出てくる。しかし、検索して出てくる解決方法はほぼ全て以下の方法。
rm /var/run/crond.pid
で削除。
ps ax | grep crond
を実行して出てくるcrondのプロセスを全てkill
する。
crond start
で起動。実際、これでほとんどの人は解決している様なので試してない人は是非試してみてほしい。けど、僕の場合はどんな順番でPIDを削除しcrondを起動しようがずっと
crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できませんと表示され続けた。3時間もそれは続いた。
解決方法
- とりあえずすでにあるプロセスとPIDファイルは消す。
systemctl start crond
する。ポイントは
crond start
やcrond status
をしないこと。crond start
やcrond status
をするとリソースが一時的に利用できません
になるという単純な話だった。これでも解決しなかったら
プロセスのリミットが原因の場合、
/etc/security/limits.conf
にroot - nproc unlimitedを追加したら解決した、みたいな記事を見かけた。
僕はこの方法で解決しなかったがもしかしたらこれで解決するかも。
- 投稿日:2019-09-09T03:33:27+09:00
stressコマンドでメモリへの負荷をかける
stressコマンドインストール
curl -OL http://ftp.riken.jp/Linux/dag/redhat/el7/en/x86_64/rpmforge/RPMS/stress-1.0.2-1.el7.rf.x86_64.rpm rpm -ivh stress-1.0.2-1.el7.rf.x86_64.rpmメモリへ負荷をかける
--vm-keep
はメモリを解放せずにkeep。
オプションなしだと、いちいち解放するっぽい?stress --vm 3 --vm-bytes 256M --vm-keepAWSEC2の1GBインスタンス
上記コマンドだと、3つのプロセスが256MBを確保する。
4つ(物理メモリ以上)起動しようとしたら怒られた
stress: info: [8065] dispatching hogs: 0 cpu, 0 io, 4 vm, 0 hdd stress: FAIL: [8065] (420) <-- worker 8068 got signal 9 stress: WARN: [8065] (422) now reaping child worker processes stress: FAIL: [8065] (456) failed run completed in 2s
- 投稿日:2019-09-09T01:24:29+09:00
VirtualBox + Ubuntuでのパーテーション拡張方法(CUI)
概要
やってること事態はQiitaにも同じような記事が多数あったがUbuntu+CUIの記事が見つからず、苦労したため手順を残す。
皆さんの参考になれば幸いです。
また注意事項としては、手順を間違えるとゲストマシンが起動不能になることもあるので、クローンを取得してから実施すると安心です。
※本記事通り実施しても破損する可能性がありますのでそこは自己責任でお願いいたします。環境
- ホストマシン : Windows10
- Virtual Box : 6.0
- ゲストマシン : Ubuntu 18.04
- ストレージはvdiで作成済み
ホストマシンでの作業
該当ゲストマシンをシャットダウン
もちろん、ゲスト内からshutdownコマンドでシステムを終了してもOK
仮想HDDの拡張
該当の仮想HDDがどこに保存されているかを確認。
その後、VBのマネージャーから該当仮想マシンの設定画面を開くと画像のような画面が見える
パスはコピーできるので、画像のように右クリックでコピーしておくその後、コマンドプロンプトで下記コマンドを実施
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd "先程コピーしたパズ" --resize 20480文字列で打ち込む必要があるので"もそのまま打ち込むこと。
VBboxManage.exeはのパスはデフォルトの場所です。変更してる場合は合わせて変更してください。
resizeの容量はMBで指定できます。
1GB=1024と記載してください。上記の例では20GBになります。
その後、ゲストマシンを起動。ゲストマシンでの作業
# 現在のファイルシステムを確認 df -h # partedを起動 sudo parted # 増やしたいパーティションの番号と終端アドレス(容量)を確認 (parted) p free # 確認したパーティションの番号でリサイズを開始(今回は仮に2とする) (parted) resize 2 Warning: Partition /dev/sda1 is being used. Are you sure you want to continue? Yes/No? Yes # 最大限拡張するなら先程確認した終端アドレスを入力 End? [10.0GB]? 20GB # 確認 (parted) p free # partedを終了 (parted) q # fstabを変更(今回のファイルシステムは仮にsda2とする) sudo resize2fs /dev/sda2 # 念の為に再起動 sudo reboot # 再度ログインしたあと、ファイルシステムを確認 df -hこれで容量が増えていれば成功です!
お疲れさまでした。