はじめに
ふとしたきっかけでシンセのファームウェアのアップデータをダウンロードしたので、その時のメモ。
KRONOS システム・バージョン2.1.1
いまどきのシンセサイザ(今回はKORG KRONOS)はLinuxべったりなシステムで
作られていると感じさせられたことをつらつらと書いています。
ファイル内容と役割
ダウンロードしたzipファイルを解凍すると以下の様な構成になっていました。
.
├── [-rw-r--r--] DisplayUpdaterMessage
├── [-rw-r--r--] KRONOS_Update_2_1_1.csum
├── [-rw-r--r--] KRONOS_Update_2_1_1.tar.gz
├── [drwxr-xr-x] Manuals
│ ├── [drwxr-xr-x] English
│ │ ├── [-rw-r--r--] KRONOS_2_1_New_Features_E1.pdf
│ │ ├── [-rw-r--r--] KRONOS_ExtSetups_E1.pdf
│ │ ├── [-rw-r--r--] KRONOS_Op_Guide_E6.pdf
│ │ ├── [-rw-r--r--] KRONOS_Param_Guide_E6.pdf
│ │ ├── [-rw-r--r--] KRONOS_Quick_Start_E3.pdf
│ │ ├── [-rw-r--r--] KRONOS_Update_and_Restore_E2.pdf
│ │ ├── [-rw-r--r--] KRONOS_VNL_EFGSJ2.pdf
│ │ └── [-rw-r--r--] KRONOS_VNL_PRELOAD_V2_EFGS1.pdf
│ ├── [drwxr-xr-x] French
│ │ ├── [-rw-r--r--] KRONOS_2_1_New_Features_F1.pdf
│ │ ├── [-rw-r--r--] KRONOS_Op_Guide_F6.pdf
│ │ ├── [-rw-r--r--] KRONOS_Quick_Start_F3.pdf
│ │ ├── [-rw-r--r--] KRONOS_Update_and_Restore_F2.pdf
│ │ ├── [-rw-r--r--] KRONOS_VNL_EFGSJ2.pdf
│ │ └── [-rw-r--r--] KRONOS_VNL_PRELOAD_V2_EFGS1.pdf
│ ├── [drwxr-xr-x] German
│ │ ├── [-rw-r--r--] KRONOS_2_1_New_Features_G1.pdf
│ │ ├── [-rw-r--r--] KRONOS_Op_Guide_G6.pdf
│ │ ├── [-rw-r--r--] KRONOS_Quick_Start_G3.pdf
│ │ ├── [-rw-r--r--] KRONOS_Update_and_Restore_G2.pdf
│ │ ├── [-rw-r--r--] KRONOS_VNL_EFGSJ2.pdf
│ │ └── [-rw-r--r--] KRONOS_VNL_PRELOAD_V2_EFGS1.pdf
│ ├── [drwxr-xr-x] Japanese
│ │ ├── [-rw-r--r--] KRONOS_2_1_New_Features_J1.pdf
│ │ ├── [-rw-r--r--] KRONOS_ExtSetups_J1.pdf
│ │ ├── [-rw-r--r--] KRONOS_Op_Guide_J.pdf
│ │ ├── [-rw-r--r--] KRONOS_Param_Guide_J.pdf
│ │ ├── [-rw-r--r--] KRONOS_Quick_Start_J.pdf
│ │ ├── [-rw-r--r--] KRONOS_Update_and_Restore_J2.pdf
│ │ ├── [-rw-r--r--] KRONOS_VNL_EFGSJ2.pdf
│ │ └── [-rw-r--r--] KRONOS_VNL_PRELOAD_V2_EFGSJ1.pdf
│ └── [drwxr-xr-x] Spanish
│ ├── [-rw-r--r--] KRONOS_2_1_New_Features_S.pdf
│ ├── [-rw-r--r--] KRONOS_Quick_Start_S3.pdf
│ ├── [-rw-r--r--] KRONOS_VNL_EFGSJ2.pdf
│ └── [-rw-r--r--] KRONOS_VNL_PRELOAD_V2_EFGS1.pdf
├── [-rw-r--r--] bc
├── [-rw-r--r--] install.info
├── [-rw-r--r--] md5sum
├── [drwxr-xr-x] mnt
├── [-rw-r--r--] posttar.sh
└── [-rw-r--r--] pretar.sh
7 directories, 40 files
Manuals以下は説明書PDFなのでそれ以外を眺めます。
bcとmd5sum
名前と実行形式ファイルあることからLinuxのコマンドそのものと思われます。
DisplayUpdaterMessage
これはKORGオリジナルのコマンド。名前からファームウェアアップデート時に使うと思われます。
install.info
VERSION=2.1.1
SOURCE=KRONOS_Update_2_1_1.tar.gz
PRETARSCRIPT=pretar.sh
POSTTARSCRIPT=posttar.sh
SIGNATURE=08161729754c9e24eddf91aecdf4e714995c3636
所謂iniファイル等で見るkey=value形式で、それぞれの情報を持っています。
特に
SOURCE
はファームウェアアップデート時に解凍するtarball
PRETARSCRIPT
はPre Target Scriptの略と思われます。おそらくファームウェアアップデート前?に実行させたいスクリプト
POSTTARSCRIPT
はPRETARSCRIPT
と同様PreがPostになっただけでファームウェアアップデート後?に実行させたいスクリプト
をそれぞれ指定しています。
SIGNATURE
はどこで使用しているか不明。
pretar.sh
#!/bin/sh
rm -fr /mnt/updaterSource/mnt/lib/modules/2.6.32.11-korg/kernel/sound
echo "Verifying install media..." > /tmp/installer_status
/mnt/updaterSource/DisplayUpdaterMessage "Verifying install media..."
checksum=`/mnt/updaterSource/md5sum /mnt/updaterSource/KRONOS_Update_2_1_1.tar.gz | awk '{ print $1; }'`
if [ "3ef19d31a7c7467123ac22cb1efe12dc" != "$checksum" ]; then
kill -9 $(/sbin/pidof UpdateOS)
/mnt/updaterSource/DisplayUpdaterMessage "Checksum Error! Update failed, please restart the system."
fi
checksum=`/mnt/updaterSource/md5sum /mnt/updaterSource/DisplayUpdaterMessage | awk '{ print $1; }'`
if [ "18f79a009cef9054a71377bb863b0647" != "$checksum" ]; then
kill -9 $(/sbin/pidof UpdateOS)
/mnt/updaterSource/DisplayUpdaterMessage "Checksum Error! Update failed, please restart the system."
fi
checksum=`/mnt/updaterSource/md5sum /mnt/updaterSource/bc | awk '{ print $1; }'`
if [ "cb9b8612bfb57c7fad4484b341090d1f" != "$checksum" ]; then
kill -9 $(/sbin/pidof UpdateOS)
/mnt/updaterSource/DisplayUpdaterMessage "Checksum Error! Update failed, please restart the system."
fi
/mnt/updaterSource/DisplayUpdaterMessage "SetTextPalette"
# make sure that the mnt/ folder exists
if [ ! -e /mnt/updaterSource/mnt ]; then
mkdir /mnt/updaterSource/mnt
fi
kill $(/sbin/pidof vsftpd)
kill $(/sbin/pidof avahi-daemon)
kill $(/sbin/pidof messagebus)
kill $(/sbin/pidof ifplugd)
sleep 2
kill -9 $(/sbin/pidof vsftpd)
kill -9 $(/sbin/pidof avahi-daemon)
kill -9 $(/sbin/pidof messagebus)
kill -9 $(/sbin/pidof ifplugd)
sleep 2
curDate=`date +%s`
if [ $curDate -lt 1386066775 ]; then
date --set=@1386066775
fi
堂々とシェルスクリプトが出現します。いまどきのシンセサイザはシェルスクリプトくらい余裕で動くらしいです。
rm -fr /mnt/updaterSource/mnt/lib/modules/2.6.32.11-korg/kernel/sound
一旦ファイルorディレクトリを削除。ちなみに現段階ではmnt以下は空ですが
KRONOS_Update_2_1_1.tar.gzを解凍するとmnt以下に大量にファイルが作られます。(後半で記述)
//ただしmnt/lib/modules/2.6.32.11-korg/kernel
は解凍すると作られますが、
//mnt/lib/modules/2.6.32.11-korg/kernel/sound
というファイルorディレクトリは作られませんでした。
echo "Verifying install media..." > /tmp/installer_status
/tmp以下にログを吐く。アップデート失敗時に後でどのフェーズまで進んでコケたかの調査用とかそのあたりと思われます。
シンセサイザの世界でも"便利な/tmpログ"は定石のようです。
/mnt/updaterSource/DisplayUpdaterMessage "Verifying install media..."
ファームウェアアップデート時にはUSBメモリの直下にKRONOS_Update_2_1_1.zipを解凍したファイル郡を置くことや
/mnt/updaterSource/DisplayUpdaterMessage
とシェルスクリプト内で記述されていることから
ファームウェアアップデート時にKRONOSはUSBメモリを/mnt/updaterSource
としてマウントしていると思われます。
(orシンボリックリンクを貼っている、とかかもしれません。)
//この場合mntはmountの略とかでしょうか。
DisplayUpdaterMessage
コマンドに引数として"Verifying install media..."
を与えると
その引数に応じたメッセージや画像などがKRONOSの画面に出力されると思われます。
checksum=`/mnt/updaterSource/md5sum /mnt/updaterSource/KRONOS_Update_2_1_1.tar.gz | awk '{ print $1; }'`
KRONOS_Update_2_1_1.tar.gzのチェックサムを取得。
コマンドの結果の一つ目のフィールドをawkで切り出すのは、これまたシンセサイザの世界でも定石のようです。
その後つらつらとif文でチェックサムの確認をして値が異なっていれば無慈悲にkill -9
で終了します。
if [ ! -e /mnt/updaterSource/mnt ]; then
mkdir /mnt/updaterSource/mnt
fi
USBメモリにmntがなければ作ります。
kill $(/sbin/pidof vsftpd)
kill $(/sbin/pidof avahi-daemon)
kill $(/sbin/pidof messagebus)
kill $(/sbin/pidof ifplugd)
sleep 2
kill -9 $(/sbin/pidof vsftpd)
kill -9 $(/sbin/pidof avahi-daemon)
kill -9 $(/sbin/pidof messagebus)
kill -9 $(/sbin/pidof ifplugd)
sleep 2
ひたすらデーモンをkill。途中sleep 2
しているあたりは
デーモンが終了するのに時間がかかるので、確実に終了するまで待つとかそんな感じの意図でsleep
しているのでしょうか。
"必殺なんかようわからんけどsleep
入れたら動きました!"定石。あるある。
curDate=`date +%s`
if [ $curDate -lt 1386066775 ]; then
date --set=@1386066775
fi
現在のunixtimeを取得して1386066775(2013/12/03 19:32:55)より現在時間の方が小さかったら1386066775をセット。
KRONOS システム・バージョン2.1.1のリリース日がちょうど2013/12/03でなので
KRONOSの時計が正常に機能していれば、ほぼほぼこのif文通ることはないはず…なのですが何なのでしょうか。
//開発中の時はifの中に入るが今となっては唯の残骸and/or
//バージョン2.1.1は現在時刻が2013/12/03 19:32:55以降であることを前提としたロジックがあるとかでしょうか。
posttar.sh
#!/bin/sh
chown 500.500 mnt/korg/rw/HD
chmod 555 mnt/korg/ftp
if [ ! -e /korg/rw/Startup/KronosNet.conf ]; then
echo "kronos
kronos
" > /korg/rw/Startup/KronosNet.conf
fi
if [ -d /korg/rw2/HD ]; then
chown 500.500 /korg/rw2/HD
chmod 775 /korg/rw2/HD
fi
if [ -d /korg/rw2/HD/FACTORY ]; then
chown -R 500.500 /korg/rw2/HD/FACTORY
fi
if [ -d /korg/rw2/HD/Korg\ Options ]; then
chown -R 500.500 /korg/rw2/HD/Korg\ Options
fi
numberOfFilesToVerify=0
while read line
do
let "numberOfFilesToVerify = numberOfFilesToVerify + 1"
done < KRONOS_Update_2_1_1.csum
echo "number of files to verify is $numberOfFilesToVerify" >> /tmp/updater_error
fpProgressBarIncrementPerFile=$(echo "scale=4; 100.0 / $numberOfFilesToVerify" | /mnt/updaterSource/bc -q 2>/dev/null)
/mnt/updaterSource/DisplayUpdaterMessage "Verifying Installed Files..."
/mnt/updaterSource/DisplayUpdaterMessage "SetDefaultPalette"
echo "set 0" > /proc/OmapNKS4ProgressBar
fpProgress=0.0
progress=0
checksumErrorFound=0
while read line
do
fileName=`echo "$line" | awk '{ print $1 }'`
refchecksum=`echo "$line" | awk '{ print $2 }'`
checksum=`/mnt/updaterSource/md5sum $fileName | awk '{ print $1 }'`
if [ "$checksum" != "$refchecksum" ]; then
echo "Checksum failure for $fileName" >> /tmp/updater_error
let "checksumErrorFound = checksumErrorFound + 1"
fi
fpProgress=$(echo "scale=4; $fpProgress + $fpProgressBarIncrementPerFile" | /mnt/updaterSource/bc -q 2>/dev/null)
newProgress=$(echo "($fpProgress+0.5)/1" | /mnt/updaterSource/bc -q 2>/dev/null)
if [ $progress != $newProgress ]; then
progress=$newProgress
echo "set $progress" > /proc/OmapNKS4ProgressBar
echo "updated progress bar with $progress" >> /tmp/updater_error
fi
done < KRONOS_Update_2_1_1.csum
if [ $checksumErrorFound -ne 0 ]; then
kill -9 $(/sbin/pidof UpdateOS)
/mnt/updaterSource/DisplayUpdaterMessage "Checksum Error! Update failed, recovery may require format and full install."
echo "$checksumErrorFound installed files had checksum errors" >> /tmp/updater_error
exit 1
else
echo "No checksum errors found" >> /tmp/updater_error
fi
/mnt/updaterSource/DisplayUpdaterMessage "Finishing Installation..."
/mnt/updaterSource/DisplayUpdaterMessage "SetDefaultPalette"
echo "set 0" > /proc/OmapNKS4ProgressBar
sync
progress=6
for seconds in {1..15}; do
echo "set $progress" > /proc/OmapNKS4ProgressBar
sleep 1
let "progress = progress + 6"
done
echo "set 100" > /proc/OmapNKS4ProgressBar
/mnt/updaterSource/DisplayUpdaterMessage "SetTextPalette"
そこそこ長いです。
chown 500.500 mnt/korg/rw/HD
chmod 555 mnt/korg/ftp
オーナとパーミッション変更。
if [ ! -e /korg/rw/Startup/KronosNet.conf ]; then
echo "kronos
kronos
" > /korg/rw/Startup/KronosNet.conf
fi
if [ -d /korg/rw2/HD ]; then
chown 500.500 /korg/rw2/HD
chmod 775 /korg/rw2/HD
fi
if [ -d /korg/rw2/HD/FACTORY ]; then
chown -R 500.500 /korg/rw2/HD/FACTORY
fi
if [ -d /korg/rw2/HD/Korg\ Options ]; then
chown -R 500.500 /korg/rw2/HD/Korg\ Options
fi
ファイルorディレクトリの存在確認と存在しなかった/した時の処理。
numberOfFilesToVerify=0
while read line
do
let "numberOfFilesToVerify = numberOfFilesToVerify + 1"
done < KRONOS_Update_2_1_1.csum
echo "number of files to verify is $numberOfFilesToVerify" >> /tmp/updater_error
KRONOS_Update_2_1_1.csum
の行数をカウント。
ファイルの行数カウントにwc -l
は不都合だったのでしょうか。
fpProgressBarIncrementPerFile=$(echo "scale=4; 100.0 / $numberOfFilesToVerify" | /mnt/updaterSource/bc -q 2>/dev/null)
$numberOfFilesToVerify
がファイル行数なので、一行処理すると何%進めるかをfpProgressBarIncrementPerFile
変数にセット。
$numberOfFilesToVerify
が仮に1000とかなら 100/1000 = 0.1 なのでそんな感じだと思われます。
標準エラー出力は/dev/null
にポイーして"臭いものには蓋"定石でしょうか。
echo "set 0" > /proc/OmapNKS4ProgressBar
fpProgress=0.0
progress=0
checksumErrorFound=0
while read line
do
fileName=`echo "$line" | awk '{ print $1 }'`
refchecksum=`echo "$line" | awk '{ print $2 }'`
checksum=`/mnt/updaterSource/md5sum $fileName | awk '{ print $1 }'`
if [ "$checksum" != "$refchecksum" ]; then
echo "Checksum failure for $fileName" >> /tmp/updater_error
let "checksumErrorFound = checksumErrorFound + 1"
fi
fpProgress=$(echo "scale=4; $fpProgress + $fpProgressBarIncrementPerFile" | /mnt/updaterSource/bc -q 2>/dev/null)
newProgress=$(echo "($fpProgress+0.5)/1" | /mnt/updaterSource/bc -q 2>/dev/null)
if [ $progress != $newProgress ]; then
progress=$newProgress
echo "set $progress" > /proc/OmapNKS4ProgressBar
echo "updated progress bar with $progress" >> /tmp/updater_error
fi
done < KRONOS_Update_2_1_1.csum
KRONOS_Update_2_1_1.csum
を一行ずつ読み込んで処理します。
/proc/OmapNKS4ProgressBar
は/proc
と付いているので仮想的なファイル・システムになっていて
そこにset "値"
をリダイレクトするとKRONOSの画面のプログレスバーが値に応じて伸びていくと思われます。
if [ $checksumErrorFound -ne 0 ]; then
kill -9 $(/sbin/pidof UpdateOS)
/mnt/updaterSource/DisplayUpdaterMessage "Checksum Error! Update failed, recovery may require format and full install."
echo "$checksumErrorFound installed files had checksum errors" >> /tmp/updater_error
exit 1
else
echo "No checksum errors found" >> /tmp/updater_error
fi
$checksumErrorFound
がひとつ以上あった場合エラーメッセージ出力とその旨を/tmpログに落とす、なければ/tmpにログ落とす。
/mnt/updaterSource/DisplayUpdaterMessage "Finishing Installation..."
/mnt/updaterSource/DisplayUpdaterMessage "SetDefaultPalette"
echo "set 0" > /proc/OmapNKS4ProgressBar
sync
progress=6
for seconds in {1..15}; do
echo "set $progress" > /proc/OmapNKS4ProgressBar
sleep 1
let "progress = progress + 6"
done
echo "set 100" > /proc/OmapNKS4ProgressBar
/mnt/updaterSource/DisplayUpdaterMessage "SetTextPalette"
このフェーズが終了すればユーザによってKRONOSの電源がOFFにされるので
sync
コマンドでディスク・キャッシュの内容をディスクに書き込みます。
ディスクに書き込むのに15秒もあれば十分というところで、そのようなfor文になっていると思われます。
KRONOS_Update_2_1_1.tar.gz の内容
こちらのtarballはファームウェアアップデートの任意のタイミングで解凍されmnt
以下に展開されます。(おそらく)
解凍先を特に指定していなければUSBメモリ上に解凍され、KRONOS本体からはUSBメモリが/mnt/updaterSource
として見えるので
KRONOS_Update_2_1_1.tar.gzを解凍して出来たmnt
は/mnt/updaterSource/mnt
として見えるはずです。(ややこしい)
mnt/
├── [drwxr-xr-x] bin
│ ├── [-rw-r--r--] ShowReauthScreen
│ ├── [-rw-r--r--] dbus-daemon
│ ├── [-rw-r--r--] egrep
│ ├── [-rw-r--r--] fanctrld
│ ├── [-rw-r--r--] ln
│ ├── [-rw-r--r--] md5sum
│ ├── [-rw-r--r--] ps
│ └── [-rw-r--r--] udevinfo
├── [drwxr-xr-x] boot
│ ├── [-rw-r--r--] bzImage
│ └── [drwxr-xr-x] grub
│ ├── [-rw-r--r--] grub.conf
│ └── [-rw-r--r--] menu.lst
├── [drwxr-xr-x] dev
│ └── [drwxr-xr-x] mapper
│ └── [-rw-r--r--] control
├── [drwxr-xr-x] etc
│ ├── [-rw-r--r--] OA.rc
│ ├── [-rw-r--r--] OA.si
│ ├── [drwxr-xr-x] avahi
│ │ ├── [-rw-r--r--] avahi-autoipd.action
│ │ ├── [-rw-r--r--] avahi-daemon.conf
│ │ ├── [drwxr-xr-x] etc
│ │ │ └── [-rw-r--r--] localtime
│ │ ├── [-rw-r--r--] hosts
│ │ └── [drwxr-xr-x] services
│ │ ├── [-rw-r--r--] ftp.service
│ │ └── [-rw-r--r--] ssh.service
│ ├── [drwxr-xr-x] dbus-1
│ │ ├── [-rw-r--r--] session.conf
│ │ ├── [drwxr-xr-x] session.d
│ │ ├── [-rw-r--r--] system.conf
│ │ └── [drwxr-xr-x] system.d
│ │ ├── [-rw-r--r--] ConsoleKit.conf
│ │ ├── [-rw-r--r--] NetworkManager.conf
│ │ ├── [-rw-r--r--] avahi-dbus.conf
│ │ ├── [-rw-r--r--] bluetooth.conf
│ │ ├── [-rw-r--r--] cups.conf
│ │ ├── [-rw-r--r--] hal.conf
│ │ ├── [-rw-r--r--] newprinternotification.conf
│ │ ├── [-rw-r--r--] nm-applet.conf
│ │ ├── [-rw-r--r--] nm-dhcp-client.conf
│ │ ├── [-rw-r--r--] nm-openvpn-service.conf
│ │ ├── [-rw-r--r--] nm-vpnc-service.conf
│ │ ├── [-rw-r--r--] setroubleshootd.conf
│ │ ├── [-rw-r--r--] wpa_supplicant.conf
│ │ └── [-rw-r--r--] yum-updatesd.conf
│ ├── [-rw-r--r--] group
│ ├── [-rw-r--r--] gshadow
│ ├── [drwxr-xr-x] init.d
│ │ ├── [-rw-r--r--] avahi-daemon
│ │ ├── [-rw-r--r--] functions
│ │ └── [-rw-r--r--] messagebus
│ ├── [-rw-r--r--] modprobe.conf
│ ├── [-rw-r--r--] nsswitch.conf
│ ├── [drwxr-xr-x] pam.d
│ │ ├── [-rw-r--r--] atd
│ │ ├── [-rw-r--r--] authconfig
│ │ ├── [-rw-r--r--] authconfig-gtk
│ │ ├── [-rw-r--r--] authconfig-tui
│ │ ├── [-rw-r--r--] chfn
│ │ ├── [-rw-r--r--] chsh
│ │ ├── [-rw-r--r--] config-util
│ │ ├── [-rw-r--r--] cpufreq-selector
│ │ ├── [-rw-r--r--] crond
│ │ ├── [-rw-r--r--] cups
│ │ ├── [-rw-r--r--] cvs
│ │ ├── [-rw-r--r--] dateconfig
│ │ ├── [-rw-r--r--] eject
│ │ ├── [-rw-r--r--] gdm
│ │ ├── [-rw-r--r--] gdm-autologin
│ │ ├── [-rw-r--r--] gdmsetup
│ │ ├── [-rw-r--r--] gnome-screensaver
│ │ ├── [-rw-r--r--] gnome-system-log
│ │ ├── [-rw-r--r--] halt
│ │ ├── [-rw-r--r--] kbdrate
│ │ ├── [-rw-r--r--] kcheckpass
│ │ ├── [-rw-r--r--] kdm
│ │ ├── [-rw-r--r--] kdm-np
│ │ ├── [-rw-r--r--] kppp
│ │ ├── [-rw-r--r--] kscreensaver
│ │ ├── [-rw-r--r--] login
│ │ ├── [-rw-r--r--] neat
│ │ ├── [-rw-r--r--] newrole
│ │ ├── [-rw-r--r--] other
│ │ ├── [-rw-r--r--] passwd
│ │ ├── [-rw-r--r--] pirut
│ │ ├── [-rw-r--r--] pm-hibernate
│ │ ├── [-rw-r--r--] pm-powersave
│ │ ├── [-rw-r--r--] pm-suspend
│ │ ├── [-rw-r--r--] pm-suspend-hybrid
│ │ ├── [-rw-r--r--] polkit
│ │ ├── [-rw-r--r--] poweroff
│ │ ├── [-rw-r--r--] ppp
│ │ ├── [-rw-r--r--] pup
│ │ ├── [-rw-r--r--] reboot
│ │ ├── [-rw-r--r--] remote
│ │ ├── [-rw-r--r--] run_init
│ │ ├── [-rw-r--r--] runuser
│ │ ├── [-rw-r--r--] runuser-l
│ │ ├── [-rw-r--r--] screen
│ │ ├── [-rw-r--r--] selinux-polgengui
│ │ ├── [-rw-r--r--] serviceconf
│ │ ├── [-rw-r--r--] setup
│ │ ├── [-rw-r--r--] smtp.sendmail
│ │ ├── [-rw-r--r--] sshd
│ │ ├── [-rw-r--r--] su
│ │ ├── [-rw-r--r--] su-l
│ │ ├── [-rw-r--r--] sudo
│ │ ├── [-rw-r--r--] sudo-i
│ │ ├── [-rw-r--r--] system-auth
│ │ ├── [-rw-r--r--] system-auth-ac
│ │ ├── [-rw-r--r--] system-cdinstall-helper
│ │ ├── [-rw-r--r--] system-config-authentication
│ │ ├── [-rw-r--r--] system-config-date
│ │ ├── [-rw-r--r--] system-config-display
│ │ ├── [-rw-r--r--] system-config-firewall
│ │ ├── [-rw-r--r--] system-config-keyboard
│ │ ├── [-rw-r--r--] system-config-language
│ │ ├── [-rw-r--r--] system-config-network
│ │ ├── [-rw-r--r--] system-config-network-cmd
│ │ ├── [-rw-r--r--] system-config-printer
│ │ ├── [-rw-r--r--] system-config-securitylevel
│ │ ├── [-rw-r--r--] system-config-selinux
│ │ ├── [-rw-r--r--] system-config-services
│ │ ├── [-rw-r--r--] system-config-soundcard
│ │ ├── [-rw-r--r--] system-config-time
│ │ ├── [-rw-r--r--] system-config-users
│ │ ├── [-rw-r--r--] system-install-packages
│ │ ├── [-rw-r--r--] vsftpd
│ │ ├── [-rw-r--r--] xdm
│ │ └── [-rw-r--r--] xserver
│ ├── [-rw-r--r--] passwd
│ ├── [drwxr-xr-x] rc.d
│ │ └── [drwxr-xr-x] init.d
│ │ ├── [-rw-r--r--] avahi-daemon
│ │ ├── [-rw-r--r--] functions
│ │ └── [-rw-r--r--] messagebus
│ ├── [-rw-r--r--] services
│ ├── [-rw-r--r--] shadow
│ ├── [drwxr-xr-x] sysconfig
│ │ ├── [-rw-r--r--] network
│ │ └── [drwxr-xr-x] network-scripts
│ │ ├── [-rw-r--r--] ifcfg-eth0
│ │ ├── [-rw-r--r--] ifcfg-eth1
│ │ ├── [-rw-r--r--] ifcfg-eth2
│ │ ├── [-rw-r--r--] network-functions
│ │ └── [-rw-r--r--] network-functions.lite
│ ├── [drwxr-xr-x] vsftpd
│ │ └── [-rw-r--r--] ftpusers
│ └── [-rw-r--r--] vsftpd.conf
├── [drwxr-xr-x] korg
│ ├── [-rw-r--r--] VersionInfo
│ ├── [drwxr-xr-x] ftp
│ │ ├── [drwxr-xr-x] SSD1
│ │ └── [drwxr-xr-x] SSD2
│ ├── [drwxr-xr-x] ro
│ │ ├── [-rw-r--r--] Eva.img
│ │ └── [-rw-r--r--] Mod.img
│ ├── [drwxr-xr-x] rw
│ │ ├── [drwxr-xr-x] PRELOAD
│ │ │ └── [drwxr-xr-x] PianoTypes
│ │ │ ├── [-rw-r--r--] PianoType00
│ │ │ ├── [-rw-r--r--] PianoType01
│ │ │ ├── [-rw-r--r--] PianoType02
│ │ │ ├── [-rw-r--r--] PianoType03
│ │ │ ├── [-rw-r--r--] PianoType04
│ │ │ ├── [-rw-r--r--] PianoType05
│ │ │ ├── [-rw-r--r--] PianoType06
│ │ │ ├── [-rw-r--r--] PianoType07
│ │ │ ├── [-rw-r--r--] PianoType08
│ │ │ ├── [-rw-r--r--] PianoType09
│ │ │ ├── [-rw-r--r--] PianoType10
│ │ │ ├── [-rw-r--r--] PianoType11
│ │ │ ├── [-rw-r--r--] PianoType12
│ │ │ ├── [-rw-r--r--] PianoType13
│ │ │ ├── [-rw-r--r--] PianoType14
│ │ │ ├── [-rw-r--r--] PianoType15
│ │ │ ├── [-rw-r--r--] PianoType16
│ │ │ ├── [-rw-r--r--] PianoType17
│ │ │ ├── [-rw-r--r--] PianoType18
│ │ │ ├── [-rw-r--r--] PianoType19
│ │ │ ├── [-rw-r--r--] PianoType20
│ │ │ ├── [-rw-r--r--] PianoType21
│ │ │ ├── [-rw-r--r--] PianoType22
│ │ │ ├── [-rw-r--r--] PianoType23
│ │ │ ├── [-rw-r--r--] PianoType24
│ │ │ ├── [-rw-r--r--] PianoType25
│ │ │ ├── [-rw-r--r--] PianoType26
│ │ │ ├── [-rw-r--r--] PianoType27
│ │ │ ├── [-rw-r--r--] PianoType28
│ │ │ ├── [-rw-r--r--] PianoType29
│ │ │ ├── [-rw-r--r--] PianoType30
│ │ │ ├── [-rw-r--r--] PianoType31
│ │ │ ├── [-rw-r--r--] PianoType32
│ │ │ ├── [-rw-r--r--] PianoType33
│ │ │ ├── [-rw-r--r--] PianoType34
│ │ │ ├── [-rw-r--r--] PianoType35
│ │ │ ├── [-rw-r--r--] PianoType36
│ │ │ ├── [-rw-r--r--] PianoType37
│ │ │ ├── [-rw-r--r--] PianoType38
│ │ │ ├── [-rw-r--r--] PianoType39
│ │ │ ├── [-rw-r--r--] PianoType40
│ │ │ ├── [-rw-r--r--] PianoType41
│ │ │ ├── [-rw-r--r--] PianoType42
│ │ │ ├── [-rw-r--r--] PianoType43
│ │ │ ├── [-rw-r--r--] PianoType44
│ │ │ ├── [-rw-r--r--] PianoType45
│ │ │ ├── [-rw-r--r--] PianoType46
│ │ │ ├── [-rw-r--r--] PianoType47
│ │ │ ├── [-rw-r--r--] PianoTypeInfo00
│ │ │ ├── [-rw-r--r--] PianoTypeInfo01
│ │ │ ├── [-rw-r--r--] PianoTypeInfo02
│ │ │ ├── [-rw-r--r--] PianoTypeInfo03
│ │ │ ├── [-rw-r--r--] PianoTypeInfo04
│ │ │ ├── [-rw-r--r--] PianoTypeInfo05
│ │ │ ├── [-rw-r--r--] PianoTypeInfo06
│ │ │ ├── [-rw-r--r--] PianoTypeInfo07
│ │ │ ├── [-rw-r--r--] PianoTypeInfo08
│ │ │ ├── [-rw-r--r--] PianoTypeInfo09
│ │ │ ├── [-rw-r--r--] PianoTypeInfo10
│ │ │ ├── [-rw-r--r--] PianoTypeInfo11
│ │ │ ├── [-rw-r--r--] PianoTypeInfo12
│ │ │ ├── [-rw-r--r--] PianoTypeInfo13
│ │ │ ├── [-rw-r--r--] PianoTypeInfo14
│ │ │ ├── [-rw-r--r--] PianoTypeInfo15
│ │ │ ├── [-rw-r--r--] PianoTypeInfo16
│ │ │ ├── [-rw-r--r--] PianoTypeInfo17
│ │ │ ├── [-rw-r--r--] PianoTypeInfo18
│ │ │ ├── [-rw-r--r--] PianoTypeInfo19
│ │ │ ├── [-rw-r--r--] PianoTypeInfo20
│ │ │ ├── [-rw-r--r--] PianoTypeInfo21
│ │ │ ├── [-rw-r--r--] PianoTypeInfo22
│ │ │ ├── [-rw-r--r--] PianoTypeInfo23
│ │ │ ├── [-rw-r--r--] PianoTypeInfo24
│ │ │ ├── [-rw-r--r--] PianoTypeInfo25
│ │ │ ├── [-rw-r--r--] PianoTypeInfo26
│ │ │ ├── [-rw-r--r--] PianoTypeInfo27
│ │ │ ├── [-rw-r--r--] PianoTypeInfo28
│ │ │ ├── [-rw-r--r--] PianoTypeInfo29
│ │ │ ├── [-rw-r--r--] PianoTypeInfo30
│ │ │ ├── [-rw-r--r--] PianoTypeInfo31
│ │ │ ├── [-rw-r--r--] PianoTypeInfo32
│ │ │ ├── [-rw-r--r--] PianoTypeInfo33
│ │ │ ├── [-rw-r--r--] PianoTypeInfo34
│ │ │ ├── [-rw-r--r--] PianoTypeInfo35
│ │ │ ├── [-rw-r--r--] PianoTypeInfo36
│ │ │ ├── [-rw-r--r--] PianoTypeInfo37
│ │ │ ├── [-rw-r--r--] PianoTypeInfo38
│ │ │ ├── [-rw-r--r--] PianoTypeInfo39
│ │ │ ├── [-rw-r--r--] PianoTypeInfo40
│ │ │ ├── [-rw-r--r--] PianoTypeInfo41
│ │ │ ├── [-rw-r--r--] PianoTypeInfo42
│ │ │ ├── [-rw-r--r--] PianoTypeInfo43
│ │ │ ├── [-rw-r--r--] PianoTypeInfo44
│ │ │ ├── [-rw-r--r--] PianoTypeInfo45
│ │ │ ├── [-rw-r--r--] PianoTypeInfo46
│ │ │ ├── [-rw-r--r--] PianoTypeInfo47
│ │ │ └── [-rw-r--r--] PianoTypeNames
│ │ ├── [drwxr-xr-x] Startup
│ │ │ └── [-rw-r--r--] KronosNet.conf
│ │ └── [drwxr-xr-x] var
│ │ ├── [drwxr-xr-x] lib
│ │ ├── [drwxr-xr-x] lock
│ │ │ └── [drwxr-xr-x] subsys
│ │ └── [drwxr-xr-x] run
│ │ ├── [drwxr-xr-x] avahi-daemon
│ │ └── [drwxr-xr-x] dbus
│ └── [drwxr-xr-x] rw2
├── [drwxr-xr-x] lib
│ ├── [-rw-r--r--] libavahi-client.so.3
│ ├── [-rw-r--r--] libavahi-common.so.3
│ ├── [-rw-r--r--] libavahi-core.so.5
│ ├── [-rw-r--r--] libcap.so.1
│ ├── [-rw-r--r--] libcrypt.so.1
│ ├── [-rw-r--r--] libdaemon.so.0
│ ├── [-rw-r--r--] libdbus-1.so.3
│ ├── [-rw-r--r--] libexpat.so.1
│ ├── [-rw-r--r--] libglib-2.0.so.0
│ ├── [-rw-r--r--] libgmodule-2.0.so.0
│ ├── [-rw-r--r--] libgobject-2.0.so.0
│ ├── [-rw-r--r--] libnsl.so.1
│ ├── [-rw-r--r--] libnss3.so
│ ├── [-rw-r--r--] libnss_compat.so.2
│ ├── [-rw-r--r--] libnss_db.so.2
│ ├── [-rw-r--r--] libnss_dns.so.2
│ ├── [-rw-r--r--] libnss_files.so.2
│ ├── [-rw-r--r--] libnss_hesiod.so.2
│ ├── [-rw-r--r--] libnss_mdns4.so.2
│ ├── [-rw-r--r--] libnss_mdns4_minimal.so.2
│ ├── [-rw-r--r--] libnss_nis.so.2
│ ├── [-rw-r--r--] libnss_nisplus.so.2
│ ├── [-rw-r--r--] libnss_winbind.so.2
│ ├── [-rw-r--r--] libnss_wins.so.2
│ ├── [-rw-r--r--] libnssckbi.so
│ ├── [-rw-r--r--] libpam.so.0
│ ├── [-rw-r--r--] libpam_misc.so.0
│ ├── [-rw-r--r--] libreadline.so.5
│ ├── [-rw-r--r--] libssp.so.0
│ ├── [-rw-r--r--] libuser.so.1
│ ├── [-rw-r--r--] libutil.so.1
│ ├── [-rw-r--r--] libxml2.so.2
│ ├── [drwxr-xr-x] modules
│ │ └── [drwxr-xr-x] 2.6.32.11-korg
│ │ ├── [drwxr-xr-x] kernel
│ │ │ ├── [drwxr-xr-x] drivers
│ │ │ │ └── [drwxr-xr-x] net
│ │ │ │ └── [drwxr-xr-x] usb
│ │ │ │ ├── [-rw-r--r--] asix.ko
│ │ │ │ ├── [-rw-r--r--] pegasus.ko
│ │ │ │ ├── [-rw-r--r--] smsc7500.ko
│ │ │ │ └── [-rw-r--r--] usbnet.ko
│ │ │ └── [drwxr-xr-x] fs
│ │ │ └── [drwxr-xr-x] fuse
│ │ │ └── [-rw-r--r--] fuse.ko
│ │ ├── [-rw-r--r--] modules.alias
│ │ ├── [-rw-r--r--] modules.dep
│ │ ├── [-rw-r--r--] modules.order
│ │ ├── [-rw-r--r--] modules.symbols
│ │ └── [-rw-r--r--] modules.usbmap
│ └── [drwxr-xr-x] security
│ ├── [-rw-r--r--] pam_access.so
│ ├── [-rw-r--r--] pam_ccreds.so
│ ├── [-rw-r--r--] pam_chroot.so
│ ├── [-rw-r--r--] pam_ck_connector.so
│ ├── [-rw-r--r--] pam_console.so
│ ├── [-rw-r--r--] pam_cracklib.so
│ ├── [-rw-r--r--] pam_debug.so
│ ├── [-rw-r--r--] pam_deny.so
│ ├── [-rw-r--r--] pam_echo.so
│ ├── [-rw-r--r--] pam_env.so
│ ├── [-rw-r--r--] pam_exec.so
│ ├── [-rw-r--r--] pam_faildelay.so
│ ├── [drwxr-xr-x] pam_filter
│ │ └── [-rw-r--r--] upperLOWER
│ ├── [-rw-r--r--] pam_filter.so
│ ├── [-rw-r--r--] pam_ftp.so
│ ├── [-rw-r--r--] pam_gnome_keyring.la
│ ├── [-rw-r--r--] pam_gnome_keyring.so
│ ├── [-rw-r--r--] pam_group.so
│ ├── [-rw-r--r--] pam_issue.so
│ ├── [-rw-r--r--] pam_keyinit.so
│ ├── [drwxr-xr-x] pam_krb5
│ │ └── [-rw-r--r--] pam_krb5_storetmp
│ ├── [-rw-r--r--] pam_krb5.so
│ ├── [-rw-r--r--] pam_krb5afs.so
│ ├── [-rw-r--r--] pam_lastlog.so
│ ├── [-rw-r--r--] pam_ldap.so
│ ├── [-rw-r--r--] pam_limits.so
│ ├── [-rw-r--r--] pam_listfile.so
│ ├── [-rw-r--r--] pam_localuser.so
│ ├── [-rw-r--r--] pam_loginuid.so
│ ├── [-rw-r--r--] pam_mail.so
│ ├── [-rw-r--r--] pam_mkhomedir.so
│ ├── [-rw-r--r--] pam_motd.so
│ ├── [-rw-r--r--] pam_namespace.so
│ ├── [-rw-r--r--] pam_nologin.so
│ ├── [-rw-r--r--] pam_passwdqc.so
│ ├── [-rw-r--r--] pam_permit.so
│ ├── [-rw-r--r--] pam_pkcs11.so
│ ├── [-rw-r--r--] pam_postgresok.so
│ ├── [-rw-r--r--] pam_rhosts.so
│ ├── [-rw-r--r--] pam_rhosts_auth.so
│ ├── [-rw-r--r--] pam_rootok.so
│ ├── [-rw-r--r--] pam_rps.so
│ ├── [-rw-r--r--] pam_securetty.so
│ ├── [-rw-r--r--] pam_selinux.so
│ ├── [-rw-r--r--] pam_selinux_permit.so
│ ├── [-rw-r--r--] pam_shells.so
│ ├── [-rw-r--r--] pam_smb_auth.so
│ ├── [-rw-r--r--] pam_smbpass.so
│ ├── [-rw-r--r--] pam_stress.so
│ ├── [-rw-r--r--] pam_succeed_if.so
│ ├── [-rw-r--r--] pam_tally.so
│ ├── [-rw-r--r--] pam_tally2.so
│ ├── [-rw-r--r--] pam_time.so
│ ├── [-rw-r--r--] pam_timestamp.so
│ ├── [-rw-r--r--] pam_umask.so
│ ├── [-rw-r--r--] pam_unix.so
│ ├── [-rw-r--r--] pam_unix_acct.so
│ ├── [-rw-r--r--] pam_unix_auth.so
│ ├── [-rw-r--r--] pam_unix_passwd.so
│ ├── [-rw-r--r--] pam_unix_session.so
│ ├── [-rw-r--r--] pam_userdb.so
│ ├── [-rw-r--r--] pam_warn.so
│ ├── [-rw-r--r--] pam_wheel.so
│ ├── [-rw-r--r--] pam_winbind.so
│ └── [-rw-r--r--] pam_xauth.so
├── [drwxr-xr-x] sbin
│ ├── [-rw-r--r--] GetPubIdMod.ko
│ ├── [-rw-r--r--] InstallEXs
│ ├── [-rw-r--r--] MIDID
│ ├── [-rw-r--r--] OmapNKS4Module.ko
│ ├── [-rw-r--r--] OmapVideoModule.ko
│ ├── [-rw-r--r--] STGEnabler.ko
│ ├── [-rw-r--r--] STGGmp.ko
│ ├── [-rw-r--r--] USBMidiAccessory.ko
│ ├── [-rw-r--r--] UpdateOS
│ ├── [-rw-r--r--] UpdateRandomSeed.sh
│ ├── [-rw-r--r--] avahi-autoipd
│ ├── [-rw-r--r--] avahi-daemon
│ ├── [-rw-r--r--] consoletype
│ ├── [-rw-r--r--] dhclient
│ ├── [-rw-r--r--] e2label
│ ├── [-rw-r--r--] ifdown.lite
│ ├── [-rw-r--r--] ifplugd
│ ├── [-rw-r--r--] ifplugd.lite
│ ├── [-rw-r--r--] ifplugd.lite.action
│ ├── [-rw-r--r--] ifplugstatus
│ ├── [-rw-r--r--] ifup.lite
│ ├── [-rw-r--r--] loadmod.ko
│ ├── [-rw-r--r--] loadoa
│ ├── [-rw-r--r--] nologin
│ ├── [-rw-r--r--] route
│ └── [-rw-r--r--] vsftpd
└── [drwxr-xr-x] usr
├── [drwxr-xr-x] realtime
│ └── [drwxr-xr-x] modules
│ ├── [-rw-r--r--] rtai_fifos.ko
│ └── [-rw-r--r--] rtai_ndbg.ko
└── [drwxr-xr-x] share
└── [drwxr-xr-x] empty
54 directories, 369 files
mnt
以下は標準的なLinuxのディレクトリ構造をしています。
今回すべてのファイルを見るのは大変なので、気になったところをピックアップします。
mnt/boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=0
hiddenmenu
title Linux (2.6.32.11)-320m STG 8x6
root (hd0,0)
kernel /bzImage root=/dev/sda2 max_loop=16 fbcon=map:0 memmap=384m vga=0x0303 loglevel=0 fastboot Single raid=noautodetect elevator=noop
カーネルは2.6.32.11。2010年頃に登場したもの。
mnt/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
rpm:x:37:37:RPM user:/var/lib/rpm:/sbin/nologin
pulse:x:499:497:PulseAudio daemon:/:/sbin/nologin
polkituser:x:87:87:PolicyKit:/:/sbin/nologin
avahi:x:498:494:avahi-daemon:/var/run/avahi-daemon:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
torrent:x:497:492:BitTorrent Seed/Tracker:/var/spool/bittorrent:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
pocky:x:500:500:pocky:/home/pocky:/bin/bash
stg:x:500:502::/home/stg:/bin/bash
さすがにシャドウパスワード化されています。沢山ユーザがいますがtorrent
ユーザってなんでしょうか。
mnt/korg/ro/Eva.imgとmnt/korg/ro/Mod.img
このへんのイメージファイルもKRONOSの中核部分?でしょうか。
あとがき
- いまどきのシンセサイザはLinuxべったりなシステムというかそのままLinuxでした。
- ファームウェアアップデート用のシェルスクリプトのインデントはタブ文字だったりホワイトスペースだったり…
- チェックサムの確認が「ファイルが損傷してないことを担保する」目的なら良いですが、
改変防止目的ならあまり意味をなしていないように思われます。
(チェックサムの確認処理のところに改変後再計算したチェックサムをねじ込むorそもそもコメントアウトで回避可能) - KRONOSの前衛的な見た目とは裏腹に、昔ながらのシェルスクやawkが動いちゃうあたり萌えますね。
- そういえばTRONってどこに行ってしまったのか。