ゆるふわなファームウェアでLinux環境に入ってみる
前回、前々回、前々前回とAT-X510-28GTXの基本的な設定を終わらせてみたが、その過程でTwitterでつよつよエンジニアたちがチラ見せしてくれるヒントと、Allied Telesisのマニュアルを読んでいじくりまわしていく中で気づいたことを忘れる前に書き留めておきたい。
AT-X510-28GTX は組み込みLinuxが走っていてCUIにログインすると/bin/startshellという、スイッチ独自のコマンド体系のシェルに入るようになっている。”username”コマンドで作成したユーザーもLinuxユーザーとして作成されている。ここで、/bin/startshellの代わりに、Linuxでおなじみの/bin/shをログインシェルに指定できれば、Linuxのコマンドが使える環境に入れていろいろ遊べるはずだ。
じつは、 x510-5.4.4-3.10.rel を使っている場合、passwdファイルの中でログインシェルを変更するだけで/bin/shに入ることができる。”system boot”コマンドでファームウェアに x510-5.4.4-3.10.rel を指定して再起動しておく。
SW01#delete flash:/x510-5.4.5-1.2a.rel
Delete flash:/x510-5.4.5-1.2a.rel? (y/n)[n]:y
Deleting...
Successful operation
SW01#
SW01#copy usb:/x510-5.4.4-3.10.rel flash:/x510-5.4.4-3.10.rel
Copying...
Successful operation
SW01#
SW01#configure terminal
SW01(config)#
SW01(config)#boot system x510-5.4.4-3.10.rel
SW01(config)#
SW01(config)#exit
SW01#
SW01#show boot
Boot configuration
--------------------------------------------------------------------------------
Current software : x510-5.4.9-0.1.re
Current boot image : flash:/x510-5.4.4-3.10.rel (file exists)
Backup boot image : Not set
Default boot config: flash:/default.cfg
Current boot config: flash:/default.cfg (file exists)
Backup boot config: Not set
Autoboot status : disabled
SW01#
SW01#reboot
reboot system? (y/n): y
flash:/.configs/ 配下にちょろっと/etc/からリンクされた設定ファイルがある。”dir all recursive”コマンドで隠しディレクトリを表示しディレクトリを再帰的に表示するとこんな感じ。
SW10#dir all recursive
.
0 drwx Jan 31 2019 01:35:31 .home/
20 -rw- Nov 28 2015 06:12:24 .release
24319922 -rw- Nov 17 2015 09:39:54 x510-5.4.4-3.10.rel
315 drwx Jul 6 2015 07:25:52 ../
0 drwx Jan 1 1970 02:38:14 ./
709 -rw- Jan 1 1970 02:38:14 default.cfg
0 drwx Jan 1 1970 00:16:30 .configs/
./.home
0 drwx Jan 31 2019 01:35:31 ./
0 drwx Jan 1 1970 02:38:14 ../
./.configs
0 drwx Jan 31 2019 01:35:31 authd/
0 drwx Jan 31 2019 01:35:31 ssh/
94 -rw- Jan 31 2019 01:34:39 atmf.conf
161 -rw- Jan 31 2019 01:34:31 stk.conf
0 drwx Jan 31 2019 01:34:22 package-system/
31 -rw- Jan 31 2019 01:34:18 upstart.conf
336 -rw- Nov 15 2013 03:55:09 .swfeature.lic
0 drwx Jan 1 1970 02:38:14 ../
0 drwx Jan 1 1970 00:16:30 ./
249 -rw- Jan 1 1970 00:16:30 passwd
170 -rw- Jan 1 1970 00:16:30 shadow
0 -rw- Jan 1 1970 00:01:30 atmf-links.conf
0 -rw- Jan 1 1970 00:01:23 issue.net
0 drwx Jan 1 1970 00:01:21 snmp/
161 -rw- Jan 1 1970 00:01:15 group
0 -rw- Jan 1 1970 00:00:06 localtime
./.configs/authd
0 drwx Jan 31 2019 01:35:31 ./
0 drwx Jan 1 1970 00:16:30 ../
28 -rw- Jan 1 1970 00:01:19 web_server.conf
./.configs/ssh
0 drwx Jan 31 2019 01:35:31 ./
0 -rw- Jan 31 2019 01:35:31 ssh_known_hosts
0 drwx Jan 1 1970 00:16:30 ../
./.configs/package-system
0 drwx Jan 31 2019 01:34:22 ./
0 drwx Jan 1 1970 00:16:30 ../
./.configs/snmp
0 drwx Jan 1 1970 00:16:30 ../
0 drwx Jan 1 1970 00:01:21 ./
856 -rw- Jan 1 1970 00:01:21 snmpd.conf
SW10#
passwdファイルがあるので、これの中身を確認してみるとこんな感じ。
SW01#show file passwd
root:x:0:0:root:/:/bin/false
daemon:x:1:1:daemon:/usr/sbin:/bin/false
nobody:x:99:99:nobody:/home:/bin/false
sshd:x:103:99:Operator:/var:/bin/false
httpd:x:104:99:Operator:/var:/bin/false
manager:x:500:10:Administrative User:/flash:/sbin/startshell
user01:x:501:10:Administrative User:/flash:/sbin/startshell
初めからあるmanagerとこの前作ったuser01のログインシェルが/sbin/startshellになっていて、その他は/bin/falseになっている。managerと、user01と、rootのログインシェルと/bin/shに変えてしまう。rootも変えておくと後で/bin/shに入った時、sudoコマンドでsuしてroot権限のシェルに入ることができるのでお行儀の悪い横着ができる。”edit”コマンドでpasswdファイルを編集しちゃう。編集の後、Ctrl+Kを押した後Xを押すとセーブして終了、Ctrl+Cでセーブせずに終了だ。Ctrl+Kを押した後Hを押すとヘルプが見れる。
セーブして終了した後に、いったん抜けて再度ログインすると、ログインシェルが変更されてLinuxの世界へ入れる。sudoコマンドでsuしちゃうと、ルートになれる。さらに、/sbin/shartshellを起動すると、スイッチの世界へ入ることもできる。Linuxの世界とスイッチの世界をいったり来たりできて便利だ。
SW01#edit flash:/.configs/passwd
root:x:0:0:root:/:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/false
nobody:x:99:99:nobody:/home:/bin/false
sshd:x:103:99:Operator:/var:/bin/false
httpd:x:104:99:Operator:/var:/bin/false
manager:x:500:10:Administrative User:/flash:/bin/sh
user01:x:501:10:Administrative User:/flash:/bin/sh
** Joe's Own Editor v3.7 ** (iso-8859-1) ** Copyright (C) 2008 **
SW01#
SW01#exit
SW01 login: user01
Password:
[user01@SW01 /flash]$
[user01@SW01 /flash]$ sudo su -
[root@SW01 /]#
[root@SW01 /]# /sbin/startshell
AlliedWare Plus (TM) 5.4.4 07/06/15 07:25:51
L3SW01>
L3SW01>exit
[root@SW01 /]#
[root@SW01 /]#
せっかくなので色々コマンドを撃ってみる
せっかくrootになれたのだから、中がどうなってるのか気になる。ファイルシステムどうなってんだろう。
[root@SW01 flash]# df
Filesystem Size Used Available Use% Mounted on
/dev/root 21.0M 21.0M 0 100% /
devtmpfs 231.3M 0 231.3M 0% /dev
none 241.6M 7.3M 234.4M 3% /tmp
none 10.0M 108.0K 9.9M 1% /tmp/var/log
net 4.0K 0 4.0K 0% /net
mnt 4.0K 0 4.0K 0% /mnt
/tmp/usb_device 968.4M 52.5M 915.9M 5% /mnt/usb
/dev/mtdblock0 63.0M 50.5M 12.5M 80% /flash
/dev/mtdblock4 499.0K 32.0K 442.0K 7% /nvs
/dev/loop0 10.1M 10.1M 0 100% /opt/1
192.168.255.1:/flash 63.0M 50.4M 12.6M 80% /net/192.168.255.1/flash
192.168.255.1:/nvs 512.0K 0 448.0K 0% /net/192.168.255.1/nvs
[root@SW01 flash]#
[root@SW01 flash]# cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount pt> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
net /net tmpfs rw,relatime,size=1k 0 0
mnt /mnt tmpfs rw,relatime,size=1k 0 0
[root@SW01 flash]#
[root@SW01 flash]# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=236808k,nr_inodes=59202,mode=755)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
none on /tmp type tmpfs (rw,relatime)
none on /tmp/var/log type tmpfs (rw,relatime,size=10240k)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620)
net on /net type tmpfs (rw,relatime,size=4k)
mnt on /mnt type tmpfs (rw,relatime,size=4k)
/tmp/usb_device on /mnt/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
/dev/mtdblock0 on /flash type jffs2 (rw,relatime)
/dev/mtdblock4 on /nvs type ext2 (rw,sync,relatime)
/dev/loop0 on /opt/1 type squashfs (ro,relatime)
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
192.168.255.1:/flash on /net/192.168.255.1/flash type nfs (rw,relatime,vers=3,rsize=65536,wsize=65536,namlen=255,acdirmin=0,soft,proto=tcp,port=2049,timeo=30,retrans=3,sec=sys,local_lock=none,addr=192.168.255.1)
192.168.255.1:/nvs on /net/192.168.255.1/nvs type nfs (rw,relatime,vers=3,rsize=65536,wsize=65536,namlen=255,acdirmin=0,soft,proto=tcp,port=2049,timeo=30,retrans=3,sec=sys,local_lock=none,addr=192.168.255.1)
/ ディレクトリのほとんどはsquashfsでマウントされてるので書き換えができない。/dev/mtdblock0がユーザーのホームディレクトリになっている/flashにマウントされていて、ログなんかが入っている/nvsは/dev/mtdblock4がマウントされている。さらに、flashとnvsはnfsとしてもマウントされている。複数機でスタックを組んだ時にマスターのflashとnvsをメンバー間で共有する為と思われる。思っているだけで確かめたわけではない。
ハードウェアをコントロールする
Twitterで/dev/nst0(@_1_k)さんのツイートにて /sys/class/hwmon/hwmon0/device/ 配下のファイルに書き込むことでいろいろコントロールできるとの情報を目にした。実際にディレクトリを覗いてみる。
[root@SW01 /]# cd /sys/class/hwmon/hwmon0/device/
[root@SW01 0-002e]# ls
boardindex fan2_min in0_alarm in2_input in4_max pwm1_freq pwm3_auto_point1_pwm temp1_crit temp2_auto_point2_temp temp3_auto_point2_temp vrm
cpu0_vid fan3_alarm in0_input in2_max in4_min pwm2 pwm3_auto_point2_pwm temp1_crit_hyst temp2_crit temp3_crit
data_valid fan3_input in0_max in2_min modalias pwm2_auto_channels_temp pwm3_enable temp1_fault temp2_crit_hyst temp3_crit_hyst
driver@ fan3_min in0_min in3_alarm name pwm2_auto_point1_pwm pwm3_freq temp1_input temp2_input temp3_fault
fan1_alarm fan4_alarm in1_alarm in3_input pwm1 pwm2_auto_point2_pwm pwm_use_point2_pwm_at_crit temp1_max temp2_max temp3_input
fan1_input fan4_input in1_input in3_max pwm1_auto_channels_temp pwm2_enable subsystem@ temp1_min temp2_min temp3_max
fan1_min fan4_min in1_max in3_min pwm1_auto_point1_pwm pwm2_freq temp1_alarm temp1_offset temp2_offset temp3_min
fan2_alarm fan_control in1_min in4_alarm pwm1_auto_point2_pwm pwm3 temp1_auto_point1_temp temp2_alarm temp3_alarm temp3_offset
fan2_input hwmon/ in2_alarm in4_input pwm1_enable pwm3_auto_channels_temp temp1_auto_point2_temp temp2_auto_point1_temp temp3_auto_point1_temp uevent
[root@L3SW1 0-002e]#
[root@L3SW1 0-002e]# echo 128 > pwm1_auto_point2_pwm
[root@L3SW1 0-002e]# echo 64 > pwm1_auto_point2_pwm
これらのファイルの値を変更することで、ファンの回転数のアラート閾値を変更したり、今現在のファンの回転数を変更したりできる。前述の通り squashfs でマウントされているためこれらのファイルへの変更は保存することができないので、echoで値をリダイレクトして書き込む。即時反映されるのでファンの音を聞きながら許容範囲内に収めるように節したりできた。ファンの速度は2段階に分けられているみたいなので、低温時の回転数、高温時の回転数、それぞれの閾値などいろいろいじくって静音化しつつ本体が壊れない温度に冷却できるパラメーターを探ってみるのもいいかもしれない。検証時には4pinの最初についてたファンで検証したが、前々前回の記事の通り今は3pinの静音ファンに置換しているので、ファンの回転数の変更は効かず常にフル回転となっている。その場合でもデフォルトではファンの回転数が3000回転以下になったらアラートが上がってしまうがでっかいゆっくり回るファンに置換して風量を確保しつつ静音化する場合など、閾値を下げて置くのに使えるかもしれない。
ここの値は再起動するたびに元に戻ってしまうので、シェルスクリプトに書いてflashに保存しておいて、スイッチ側の世界のtriggerコマンドで起動時に自動実行するように設定することで設定値を保持できる。
passwdファイルのログインシェルを書き換えることによるLinux環境への侵入は x510-5.4.9-0.1.rel ではできなくなっていた。passwdファイルの記述にかかわらず/sbin/startshellが上がってきてしまう。 x510-5.4.4-3.10.rel に戻してから行う必要があるが、system bootコマンドで切り替えて再起動すればいつでも切り替えられる。 busyboxが入っているのでviやtarなど基本的なコマンドは使用でき、triggerコマンドで起動するためのシェルスクリプトの開発などにとっても便利だ。次回はいよいよスタックのあれこれについて書いてみたいと思う。