20190909のLinuxに関する記事は7件です。

中華レトロゲーム機を解析してみる

概要

一部の方面で話題になっている,中華レトロゲーム機を購入したので解析をしてみた.物忘れの激しいワタシ向けのメモのようなものである.

解析のゴールを何にするのかが悩ましいところであるが,中華レトロゲーム機向けのアプリケーションの開発環境の構築方法を示せればいいかなと思う.

そうすれば大勢の発想豊かなどなたかが,なにかいいものを作ってくれるのではないかと.

イメージファイル

入手

電源を入れると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.bat
dd 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=4096

uBoot.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アプリケーションとして動作していることがわかった.

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 pydio

Pydio設定

インストールが完了したら、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がでていますが、後から設定出来るため
"click here to continue to Pydio."をクリックします。

次の画面で"日本語"を選択し、"Start Wizard!"をクリックすると各種設定ができます。

"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などの感覚でいじっていけば何となくわかります。デザインもかっこいいし使いやすいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

grepの検索から特定のファイルやディレクトリを除外する

はじめに

grepを使って検索をかけるときにlogファイルなど膨大に検索にかかってしまうことがあったのでディレクトリやファイルだけ除外できないかと調べました。

実行

オプションにありました。

・ファイルを除外するとき

grep -rn "検索したいテキスト" --exclude 除外したいファイル

・ディレクトリを除外するとき

grep -rn "検索したいテキスト" --exclude-dir 除外したいディレクトリ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UbuntuでMacbookのiSightカメラを利用可能にする

YOLOv3とか使ってみてリアルタイムのobject detectionをしようと思ったら、
Macの内蔵のiSightカメラがなんか使えなかったので自分用メモとして残しておく。

環境

  • MacBook Pro (Retina, 15-inch, Mid 2015)
  • Ubuntu 18.04.3 LTS

やったこと

基本的には以下のコマンドをコンソールに打ち込んだだけ
とりあえず管理者権限へ切り替える

$ sudo su

gitのclone

$ git clone https://github.com/patjak/bcwc_pcie.git

cdする

$ cd bcwc_pcie/firmware

makeしてインストール

$ 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

『crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できません』の解決方法

ネット上の情報で解決できなかったので、同じ境遇の人のためにここに残しておきます。

$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

遭遇したエラー

crond startcrond statusすると、crond: can't lock /var/run/crond.pid, otherpid may be 1234: リソースが一時的に利用できませんと表示されてめちゃくちゃムカつく。

ネット上の情報

このエラーは珍しくもない様で、検索するとたくさん出てくる。しかし、検索して出てくる解決方法はほぼ全て以下の方法。

  1. rm /var/run/crond.pidで削除。
  2. ps ax | grep crondを実行して出てくるcrondのプロセスを全てkillする。

  3. 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時間もそれは続いた。

解決方法

  1. とりあえずすでにあるプロセスとPIDファイルは消す。
  2. systemctl start crondする。

ポイントはcrond startcrond statusをしないこと。crond startcrond statusをするとリソースが一時的に利用できませんになるという単純な話だった。

これでも解決しなかったら

プロセスのリミットが原因の場合、/etc/security/limits.conf

root    -   nproc   unlimited

を追加したら解決した、みたいな記事を見かけた。
僕はこの方法で解決しなかったがもしかしたらこれで解決するかも。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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-keep

AWSEC2の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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VirtualBox + Ubuntuでのパーテーション拡張方法(CUI)

概要

やってること事態はQiitaにも同じような記事が多数あったがUbuntu+CUIの記事が見つからず、苦労したため手順を残す。
皆さんの参考になれば幸いです。
また注意事項としては、手順を間違えるとゲストマシンが起動不能になることもあるので、クローンを取得してから実施すると安心です。
※本記事通り実施しても破損する可能性がありますのでそこは自己責任でお願いいたします。

環境

  • ホストマシン : Windows10
  • Virtual Box : 6.0
  • ゲストマシン : Ubuntu 18.04
    • ストレージはvdiで作成済み

ホストマシンでの作業

該当ゲストマシンをシャットダウン

もちろん、ゲスト内からshutdownコマンドでシステムを終了してもOK

仮想HDDの拡張

該当の仮想HDDがどこに保存されているかを確認。
その後、VBのマネージャーから該当仮想マシンの設定画面を開くと画像のような画面が見える
無題.jpg
パスはコピーできるので、画像のように右クリックでコピーしておく

その後、コマンドプロンプトで下記コマンドを実施

"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

これで容量が増えていれば成功です!
お疲れさまでした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む