2019-06-13 2:50 by 仁伯爵

ゆるふわなファームウェアで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
shikigami01: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コマンドで起動するためのシェルスクリプトの開発などにとっても便利だ。次回はいよいよスタックのあれこれについて書いてみたいと思う。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*


*

投げ銭はこちらへ
bitcoin : 1AFU37YroGt8ohmFz8nG1N2ockL56Z4hfQ

ADA Coin: DdzFFzCqrhskq33AqGL8XkJZ3bb1hpxJYTd2UrJFKVpXphWG8d1RuhQrKymmKU1zzjvGi7oU69PaJ7nXECRG4Kpvg27Pghf3hpRNhRMy
2019年6月
« 12月    
 12
3456789
10111213141516
17181920212223
24252627282930
カテゴリー