sshuttle がエラーになる

SSH VPN がお手軽に利用できる sshuttle を久々に使おうとしたら失敗します.いくつかのremotehostを試してもうまくいかない.

Debian sid 環境でのエラー

$ sshuttle -v -r user@remotehost 0/0
Starting sshuttle proxy.
firewall manager: Starting firewall with Python version 3.7.4
firewall manager: ready method name nat.
IPv6 enabled: False
UDP enabled: False
DNS enabled: False
User enabled: False
TCP redirector listening on ('127.0.0.1', 12300).
Starting client with Python version 3.7.4
c : connecting to server...
Host key fingerprint is SHA256:kUoWT4bCu7+HiegN9R5tYqO5nnvpQPobzSk46T8WEwU
+---[ECDSA 256]---+
|   .E...o        |
|    o o= .       |
|     +o +        |
|    oo . .       |
|    oo. S        |
|   *++ o         |
|  *.+=X+o        |
| ..=+X*=.        |
| .o+%B+o         |
+----[SHA256]-----+
Enter passphrase for key '/home/matoken/.ssh/id_ed25519':
Authenticated to nnn.nnn.nnn.nnn ([nnn.nnn.nnn.nnn]:nn).
-c:3: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
Starting server with Python version 3.7.3
 s: latency control setting = True
c : Connected.
 s: auto-nets:False
firewall manager: setting up.
>> iptables -t nat -N sshuttle-12300
>> iptables -t nat -F sshuttle-12300
>> iptables -t nat -I OUTPUT 1 -j sshuttle-12300
>> iptables -t nat -I PREROUTING 1 -j sshuttle-12300
>> iptables -t nat -A sshuttle-12300 -j RETURN --dest 127.0.0.1/32 -p tcp
>> iptables -t nat -A sshuttle-12300 -j REDIRECT --dest 0.0.0.0/0 -p tcp --to-ports 12300 -m ttl ! --ttl 42
firewall manager: undoing changes.
>> iptables -t nat -D OUTPUT -j sshuttle-12300
>> iptables -t nat -D PREROUTING -j sshuttle-12300
>> iptables -t nat -F sshuttle-12300
>> iptables -t nat -X sshuttle-12300
c : fatal: server died with error code 255

最後の行のエラーメッセージで検索すると以下のIssue を見つけました.

参考にして -x remotehostip で使えるようになりました.-x は除外オプションで接続先のip を指定して除外するとOKのようです.

  • NG $ sshuttle -r user@remotehost 0/0

  • OK $ sshuttle -r user@remotehost 0/0 -x remotehostip

VPN 対象のサブネットと同様 -x にも複数のサブネット/ip の指定ができます.

Debian sid 環境
$ dpkg-query -W sshuttle
sshuttle        0.78.5-1
$ hostnamectl|grep -E 'Operating System|Architecture'
  Operating System: Debian GNU/Linux bullseye/sid
	  Architecture: x86-64

Raspbian Buster 環境でのエラー

ちなみに sshuttle を Raspbian Buster で試すとまた違うこんなエラーに.でもやっぱり -x で解決しました.

Raspbian Buster での error message
 :
client: Connected.
packet_write_wait: Connection to 192.168.1.102 port 22: Broken pipe
Traceback (most recent call last):
  File "/usr/bin/sshuttle", line 11, in <module>
	load_entry_point('sshuttle==0.78.5', 'console_scripts', 'sshuttle')()
  File "/usr/lib/python3/dist-packages/sshuttle/cmdline.py", line 82, in main
	opt.sudo_pythonpath)
  File "/usr/lib/python3/dist-packages/sshuttle/client.py", line 787, in main
	seed_hosts, auto_hosts, auto_nets, daemon, to_nameserver)
  File "/usr/lib/python3/dist-packages/sshuttle/client.py", line 547, in _main
	ssnet.runonce(handlers, mux)
  File "/usr/lib/python3/dist-packages/sshuttle/ssnet.py", line 598, in runonce
	h.callback(s)
  File "/usr/lib/python3/dist-packages/sshuttle/ssnet.py", line 488, in callback
	self.flush()
  File "/usr/lib/python3/dist-packages/sshuttle/ssnet.py", line 439, in flush
	wrote = _nb_clean(os.write, self.wsock.fileno(), self.outbuf[0])
  File "/usr/lib/python3/dist-packages/sshuttle/ssnet.py", line 79, in _nb_clean
	return func(*args)
BrokenPipeError: [Errno 32] Broken pipe
Raspbian Buster の環境
$ dpkg-query -W sshuttle
sshuttle        0.78.5-1
$ lsb_release -d
Description:    Raspbian GNU/Linux 10 (buster)
$ uname -m
armv6l
$ cat /proc/device-tree/model ;echo
Raspberry Pi Model B Rev 2

Ubuntu 18.04 LTS 環境(OK)

Ubuntu 18.04 LTS のsshuttle でも試してみましたがこれは -x を付けなくても問題なしでした.sshuttle 0.78.4 〜 0.78.5 の間の修正での影響でしょうか?

error の出なかった環境
$ dpkg-query -W sshuttle
sshuttle        0.78.3-1ubuntu1
$ lsb_release -d
Description:    Ubuntu 18.04.2 LTS
$ uname -m
x86_64

Firefox のマウス,タッチパッド等でのズーム機能を無効にする

精度の悪いタッチパッドを使っていると2本指でスクロールしたつもりが拡大,縮小になってしまうことがあります.スクロールのつもりなので操作量も多く一気に拡大されたり縮小されたり…….

Firefox でこの機能を無効にしてみました.
以下の手順ではポインティングデバイスでのズーム機能は無効化されますが,キーボード・ショートカットでのズームは利用できます.

about:config で設定(GUI)

Firefox のアドレスバーに about:config を入力して開き, zoom.maxPercent, zoom.minPercent をそれぞれ 100 に書き換える.
この手順の場合即時反映される.

20190710 22 21 33 001

設定ファイルで設定

Firefox の対象のプロファイルのあるディクトリに user.js ファイルを作成し起動すると反映される.

プロファイルのあるディレクトリは ~/.mozilla/firefox/profiles.ini を確認する.
以下の例では,~/.mozilla/firefox/4dx27pta.default/ になる.

~/.mozilla/firefox/profiles.ini
[Install4F96D1932A9F858E]
Default=4dx27pta.default

[Profile0]
Name=default
IsRelative=1
Path=4dx27pta.default
Default=1

[General]
StartWithLastProfile=1
Version=2

user.js を以下の内容で作成する.既に存在する場合は追記する.

~/.mozilla/firefox/4dx27pta.default/user.js
user_pref("zoom.maxPercent", 100);
user_pref("zoom.minPercent", 100);

環境

$ dpkg-query -W firefox
firefox 68.0+build3-0ubuntu0.18.04.1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Ubuntu 18.04.2 LTS
      Architecture: arm64

apt-cacher-ng で https リポジトリを直接アクセスするようにする

apt-cacher-ng で各種リポジトリをキャッシュしているのですが,https の場合エラーになってしまいます.

error message
$ sudo apt update
Err:1 https://updates.signal.org/desktop/apt xenial InRelease              Reading from proxy failed - read (115: Operation now in progress) [IP: 192.168.1.102 3142]                                                      Err:2 https://deb.opera.com/opera-stable stable InRelease
  Reading from proxy failed - read (115: Operation now in progress) [IP: 192.168.1.102 3142]
 :
W: Failed to fetch https://deb.opera.com/opera-stable/dists/stable/InRelease  Reading from proxy failed - read (115: Operation now in progress) [IP: 192.168.1.102 3142]
W: Failed to fetch https://updates.signal.org/desktop/apt/dists/xenial/InRelease  Reading from proxy failed - read (115: Operation now in progress) [IP: 192.168.1.102 3142]
W: Some index files failed to download. They have been ignored, or old ones used instead.

Debian wiki に解決方法が載っていました.https の場合はキャッシュせずに直接見に行かせる設定が出来るようです.

HTTPS repositories
apt-cacher-ng will obviously fail to serve HTTPS repositories. There are many solutions upstream but I have found the simplest solution to be to simply tunnel HTTPS connections directly on the proxy, by putting this in /etc/apt-cacher-ng/acng.conf:

PassThroughPattern: .*

This is, as far as I can tell, the only way to avoid doing a special configuration on the clients for HTTPS repositories. The downside is that HTTPS content is not cached.

/etc/apt-cacher-ng/acng.confPassThroughPattern: .* を設定してデーモンを再起動することで直接アクセスしてエラーを出さなくなりました.

以下のページのように source.list を書き換えてhttps であってもキャッシュする方法もあるようですが今回はなしで.

apt-cacher-ng環境
$ dpkg-query -W apt-cacher-ng
apt-cacher-ng   3.1-1build1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Ubuntu 18.04.2 LTS
      Architecture: x86-64
apt実行環境
$ dpkg-query -W apt
apt     1.8.2
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Debian GNU/Linux bullseye/sid
      Architecture: x86-64

Linux でDiscord のchat log をbackup する

先日Discord のtext chat で勉強会をしてみました.ログはいつまで残るのかよくわからないし保存できないかなと探してみると DiscordChatExporter というものを見つけました.

早速DL してみると.exe のようです.GUI版,Cli版があるのでどちらかがWine で動かないかな?と試してみるとmono ライブラリを求められました.てことはmono があれば動くのでは?と試したら動きました.てか,GitHub のWiki ページにWindows, macOS, Linux各種環境での使い方も載っていました.

(Wine とmono どちらでも動くけど,圧倒的にmono のほうが軽かったのでmono で動かしましょう)

導入方法はここに載っています.このページのDebian 9 の例ではmono のリポジトリを追加していますが,Debian sid 環境ではパッケージ版のままで動きました.

Debian sid amd64でのmonoの導入
$ sudo apt install mono-devel

release ページから最新版を入手.今回はCli版の最新の2.14を入手した.

DiscordChatExporter.CLI の入手と展開
$ wget https://github.com/Tyrrrz/DiscordChatExporter/releases/download/2.14/DiscordChatExporter.CLI.zip
$ unzip -l DiscordChatExporter.CLI.zip
$ mkdir DiscordChatExporter.CLI
$ cd DiscordChatExporter.CLI
$ unzip ../DiscordChatExporter.CLI.zip
usage
$ mono ./DiscordChatExporter.Cli.exe
DiscordChatExporter 2.14
Copyright (c) Alexey Golub
ERROR(S):
No verb selected.

  export         Export channel.

  exportdm       Export all direct message channels.

  exportguild    Export all channels within a given guild.

  channels       Get the list of channels in the given guild.

  dm             Get the list of direct message channels.

  guilds         Get the list of accessible guilds.

  help           Display more information on a specific command.

  version        Display version information.

# To get user token:
 1. Open Discord
 2. Press Ctrl+Shift+I to show developer tools
 3. Navigate to the Application tab
 4. Select "Local Storage" > "https://discordapp.com" on the left
 5. Press Ctrl+R to reload
 6. Find "token" at the bottom and copy the value

# To get bot token:
 1. Go to Discord developer portal
 2. Open your application's settings
 3. Navigate to the Bot section on the left
 4. Under Token click Copy

# To get guild ID or guild channel ID:
 1. Open Discord
 2. Open Settings
 3. Go to Appearance section
 4. Enable Developer Mode
 5. Right click on the desired guild or channel and click Copy ID

# To get direct message channel ID:
 1. Open Discord
 2. Open the desired direct message channel
 3. Press Ctrl+Shift+I to show developer tools
 4. Navigate to the Console tab
 5. Type "window.location.href" and press Enter
 6. Copy the first long sequence of numbers inside the URL

次はトークンとチャンネルIDを入手します.手順は以下のページを参考に.

トークンの入手
  • Discord のDesktop版を開いた状態で,「Ctrl+Shift+I」を押しデベロッパーツールを表示する.

  • Application tab に移動する.

  • Ctrl+R を押して再読込を行う

  • 「Storage」の「Local Storage」から「https://discordapp.com」を選択.

  • 「token」を探してその値をコピーする.

※Discord Web版でもChrome系なら同じ手順でOK
(多分この方法はお行儀が悪い方法.なのでbot のtoken を使う手順のほうがいい.でもうまく行かない?)

20190718 20 07 11 2325

次に,チャンネルID を入手します.

チャンネルID の入手
  • Discordアプリのユーザー設定を開く.

  • 「テーマ」タブから詳細設定の「開発者モード」をOn に移動する.

  • 設定画面を閉じて,入手したいチャンネルで右クリックを押し「IDをコピー」で入手する.

※Discord Web版の場合は,該当チャンネルを開いたときのURLの最後の部分.

20190718 20 07 49 1205
20190718 20 07 17 1824

入手したトークンとチャンネルIDで書き出しを試します.
以下の例では,
トークンが,MzU0NTM6MEg5NDAzNjQ2OTU0.XEhoGd.9h5f9dguNp-xSqbIwa8mNL1DU4D`で,チャンネルIDが`999999999999999999 だったときの例です.

$ mono ./DiscordChatExporter.Cli.exe export -t 'MzU0NTM6MEg5NDAzNjQ2OTU0.XEhoGd.9h5f9dguNp-xSqbIwa8mNL1DU4D' -c '999999999999999999'
Exporting channel [999999999999999999]... 23.8 %
                                          44.3 %
                                          64.5 %
                                          90.0 %
                                          100.0 %
                                          Completed ✓

うまく行けば.html ファイルが書き出されます.
ただし,このhtml ファイルには画像が含まれていません.一旦ウェブブラウザで開いて保存すると画像も保存できるのでアーカイブに使うはそうしておいたほうが良さそうです.

環境
$ dpkg-query -W mono-devel wine chromium discord
chromium        76.0.3809.62-1
discord 0.0.9
mono-devel      5.18.0.240+dfsg-3
wine    4.0-2
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Debian GNU/Linux bullseye/sid
      Architecture: x86-64

アカウントを登録せずに仮アカウントでDiscordに参加する方法メモ

追記 2021-03-08)
毎回仮アカウントで参加していると利用されないアカウントが溜まっていってしまうので管理者にわかるようにしておいて後で消してもらうようにしたほうが良さそうです.( DISCORDNAME_1time とか? )

以前は招待URLにアクセスするとDiscordに参加していない場合仮アカウントでチャンネルに参加できたと思うのですが,今試してみるとアカウント登録を求められるようです.招待URLではなくDiscord Web版に先にアクセスすると仮アカウントでの参加が可能なようなのでメモしておきます.

  • Discordをウェブブラウザで開く https://discordapp.com
  • 「Open Discord in your browser」でウェブブラウザ上でDiscordを起動
  • 「Enter a username」で好きな名前を入力
  • reCAPTCHA が要求されるので頑張る
  • 「WELCOME DISCORD, USERNAME」のウィンドウを進むかSkipする
  • EMAIL/PASSWORD 画面を欄外クリックで閉じる
  • 左上の+アイコン(Add a Server)をクリック「Join a server」を選択して次の画面で招待URLを入力してチャンネルに参加

でも普通にアカウント登録するほうが手間が少ないような気がしますね…….

Debian 10 Buster testing をリリース後に apt update するとエラーになる

2019-07-06 に Debian Buster 10 がリリースされました.

Debian 10 Buster testing 環境でリリース後に apt update をするとエラーになってしまいます.

$ sudo apt update
Get:1 http://security.debian.org/debian-security buster/updates InRelease [39.1 kB]
Get:2 http://deb.debian.org/debian buster InRelease [118 kB]
N: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Version' value from '' to '10'
E: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'testing' to 'stable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
Do you want to accept these changes and continue updating from this repository? [y/N]
N: Repository 'http://deb.debian.org/debian buster InRelease' changed its 'Version' value from '' to '10.0'
E: Repository 'http://deb.debian.org/debian buster InRelease' changed its 'Suite' value from 'testing' to 'stable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
Do you want to accept these changes and continue updating from this repository? [y/N]
Reading package lists... Done
E: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease
E: Failed to fetch http://security.debian.org/debian-security/dists/buster/updates/InRelease
E: Some index files failed to download. They have been ignored, or old ones used instead.

--allow-releaseinfo-change を指定してAPT にリリースを情報を確認したことを教えます.

$ sudo apt --allow-releaseinfo-change update

次からはオプション無しで実行してもエラーが出なくなります.

$ sudo apt update
Hit:1 http://deb.debian.org/debian buster InRelease
Hit:2 http://security.debian.org/debian-security buster/updates InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
3 packages can be upgraded. Run 'apt list --upgradable' to see them.

ちなみに stable でなく testing 環境を使い続けたい場合は /etc/apt/sources.list を現在の Debian testing の bullseye に修正すればいいはず.

環境
$ dpkg-query -W apt
apt     1.8.2
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Debian GNU/Linux 10 (buster)
      Architecture: x86-64

physlock で Linux をロックする

Debian で vlock を検索したときに一緒に出てくる physlock というものが気になったので試してみました.

$ apt-cache search vlock
physlock - lightweight Linux console locking tool
vlock - Virtual Console locking program
$ apt show physlock
Package: physlock
Version: 13-1
Priority: optional
Section: utils
Maintainer: Michael Prokop <mika@debian.org>
Installed-Size: 42.0 kB
Depends: libc6 (>= 2.14), libpam0g (>= 0.99.7.1), libsystemd0
Homepage: https://github.com/muennich/physlock
Download-Size: 11.6 kB
APT-Manual-Installed: yes
APT-Sources: http://ftp.jp.debian.org/debian sid/main amd64 Packages
Description: lightweight Linux console locking tool
 physlock is an alternative to vlock, it is equivalent to
 `vlock -an'. It is written because vlock blocks some Linux
 kernel mechanisms like hibernate and suspend and can therefore
 only be used with some limitations. physlock is designed to be
 more lightweight and it does not have a plugin interface.

N: There is 1 additional record. Please use the '-a' switch to see it

vlock だとコンソール全部ロックは出来るけど仮想コンソール全部ロックとかは出来ないのですが,physlock はX の端末で起動してもX も使えなくなるし,console への移動も出来ないです.
-s で sysrq の無効化も出来て,-m でkernel message の抑制も出来ます.(何らかの理由でphyslock を解除できないって場合はsshdが起動していればリモートログインは出来るのでkillすればok)

$ physlock -s -m -p "lock!"

今はX では xscreensaver を使ってるけどこれはスクリーンセーバー起動中でもコンソールに移動して利用できちゃうのでphyslock に切り替えるのも良いかもしれません.

気になるのはスクリーンセーバーでは電源管理して一定以上の時間が経つと画面をスリープするなどをやっているのですが,physlock ではそういった機能がありません.

physlock 起動後にスクリーンセーバーを起動するのも試してみましたがうまく行きませんでした.

60秒後にスクリーンセーバーを起動するようにしておいてphyslockを起動(NG)
$ sleep 60 && xscreensaver-command -activate &
$ physlock
60秒後に画面をスタンバイするようにしておいてphyslockを起動(NG)
$ sleep 60 && xset dpms force standby &
$ physlock

physlock のGitHub を覗くとphyslock 実行前後に任意のコマンドを実行できるというPR がありました.これを使えばどうだろうと試してみました.

環境を整えてsourceを入手してPR のpatch を当ててbuild
$ sudo apt-get build-dep physlock
$ git clone https://github.com/muennich/physlock
$ cd physlock
$ wget https://github.com/muennich/physlock/pull/79.patch
$ patch -p1 < ./79.patch
$ make
$ sudo chown root.root ./physlock
$ sudo chmod u+s ./physlock
$ ./physlock -h
usage: physlock [-dhLlmsbanv] [-p MSG]
-b, -a, -n のオプションが増えている
$ git diff README.md
diff --git a/README.md b/README.md
index bc25ca3..563e734 100644
--- a/README.md
+++ b/README.md
@@ -57,6 +57,9 @@ The following command-line arguments are supported:
     -l       only lock console switching
     -L       only enable console switching
     -m       mute kernel messages on console while physlock is running
+    -b CMD   execute CMD before the password prompt
+    -a CMD   execute CMD after successfully authenticating
+    -n       don't actually authenticate: just execute commands
     -p MSG   Display MSG before the password prompt
     -s       disable sysrq key while physlock is running
     -v       print version information and exit

しかしこれもうまく行きませんでした.画面は書き換えできなくなってるみたいです.

physlock の前にスクリーンセーバーを起動(NG)
$ ./physlock -b 'xscreensaver-command -demo 8'
physlock の前に画面をスリープ(NG)
$ ./physlock -b 'xset dpms force standby'

近いところでコンピュータ自体をサスペンドはOKでした.持ち運びPCなんかではいい感じかもしれません.

physlock の前にサスペンド
$ ./physlock -b 'systemctl suspend'
-b オプションのないパッケージ版でも同じようなことは可能
$ systemctl suspend && physlock

画面のスリープだけでもできれば嬉しいんですがこの辺はトレードオフになるのかな?

<ADD 2019-07-10>
Ubuntu 18.04 LTS ARM64 環境でpackage から導入した physlock では physlock: /dev/console: VT_GETSTATE: Inappropriate ioctl for device というエラーで動きませんでした.

$ physlock
physlock: /dev/console: VT_GETSTATE: Inappropriate ioctl for device
$ dpkg-query -W physlock
physlock        11-1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Ubuntu 18.04.2 LTS
      Architecture: arm64

以下のバグのようです.

commit 4f131cc2c8c05279886464d3093dd56b1331e98d で修正されている(release だと12)ようなので,source から導入してみると動作しました.

$ sudo apt-get build-dep physlock
$ sudo apt install lib
$ git clone https://github.com/muennich/physlock
$ cd physlock
$ make
$ sudo make install
$ /usr/local/bin/physlock -v
physlock v13

</ADD>

環境
$ git log -1
commit d4091fe3396f6c63e42ea165797062f6032779eb (HEAD -> master, tag: v13, origin/master, origin/HEAD)
Author: Bert Münnich <ber.t@posteo.de>
Date:   Mon Jan 28 19:46:20 2019 +0100

    Stable version 13
$ dpkg-query -W physlock xscreensaver xorg x11-xserver-utils git git-hub
git     1:2.20.1-2
git-hub 1.0.1-1
physlock        13-1
x11-xserver-utils       7.7+8
xorg    1:7.7+19
xscreensaver    5.42+dfsg1-1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Ubuntu Eoan Ermine (development branch)
  Architecture: x86-64

ThinkPad T430s の BIOS を USB メモリ経由でアップデートする

以前ジャンクで入手したThinkPad T430s ですが,外部キーボードを使ったり,壊れたX220 の部品を使ったりで現在メインマシンとして利用しています.
今NVIDIA Optimus が利用できないかと試していますが,うまく行っていません.BIOS Update で治ったという事例を見つけたのでUpdate しました.Update イメージはCD に書き込んでそこから起動しないといけませんが,USBメモリでもうまく行ったのでメモを残しておきます.

※失敗するとマシンが動かなくなる可能性があります.

まずはBIOS のversion を確認します.date が2012年とかなので古そう.

現在のBIOS version 確認
$ sudo dmidecode -t bios|grep -E "Version:|Release Date:"
		Version: G7ET60WW (2.02 )
		Release Date: 09/11/2012
$ sudo lshw | grep "\-firmware" -A10|grep -E "version|date"
		  version: G7ET60WW (2.02 )
		  date: 09/11/2012

Lenovo のページでBIOSを確認すると, 26 Jun 2019 の Version 2.75 というものが最新のようです.
Windows用の実行ファイルと,起動CD用のisoファイル,それとそれぞれのリリースレターが用意されています.Linux マシンなのでisoファイルの方を入手します.

ダウンロードしたら,チェックサムを確認します.

webpage より

Checksum Tips

MD5:aa9846fb15114ef18770cc0812188418

SHA1:ace55c1a1fa87f3ca5140ef67d565ff9f863020a

SHA-256:623dc5d0442b3b0e105186901dc403c911717d4f7998223593b93e66afdbcd93

sha256sum で確認
$ sha256sum ~/Downloads/g7uj28us.iso
623dc5d0442b3b0e105186901dc403c911717d4f7998223593b93e66afdbcd93  /home/matoken/Downloads/g7uj28us.iso
isoinfo で少し中を覗く
$ isoinfo -d  -i ./g7uj28us.iso
CD-ROM is in ISO 9660 format
System id:
Volume id: G7ETB5US
Volume set id:
Publisher id:
Data preparer id:
Application id: NERO BURNING ROM
Copyright File id:
Abstract File id:
Bibliographic File id:
Volume set size is: 1
Volume set sequence number is: 1
Logical block size is: 2048
Volume size is: 16566
El Torito VD version 1 found, boot catalog is in sector 20
Joliet with UCS level 3 found
NO Rock Ridge present
Eltorito validation header:
    Hid 1
    Arch 0 (x86)
    ID 'NERO BURNING ROM'
    Key 55 AA
    Eltorito defaultboot header:
        Bootid 88 (bootable)
        Boot media 4 (Hard Disk Emulation)
        Load segment 7C0
        Sys type 6
        Nsect 1
        Bootoff 1B 27
$ isoinfo -l  -i ./g7uj28us.iso

Directory listing of /
d---------   0    0    0            2048 Jun 13 2019 [     21 02]  .
d---------   0    0    0            2048 Jun 13 2019 [     21 02]  ..

この iso ファイルを CD に書き込んで起動すればいいはずですが,メディアが手元にありません.

iso ファイルによってはUSBメモリに書き込むだけで起動USBメディアになるものもあるので試してみましたが起動できませんでした.

どうにかならないかなーと探すと以下の記事を見つけました.

geteltorito というPerl Script でイメージを変換した後,USBメモリに書き込むことで ThinkPad の BIOS Update ができるようです.
この記事中ではScript 開発者のページから入手していますが,Debian では genisoimage pkg に含まれているのでこれを使いました.

geteltorito の含まれている genisoimage pkg の導入
$ apt-file search geteltorito
genisoimage: /usr/bin/geteltorito
genisoimage: /usr/share/doc/genisoimage/README.geteltorito
genisoimage: /usr/share/man/man1/geteltorito.1.gz
$ sudo apt install genisoimage
usage
$ geteltorito

/usr/bin/geteltorito [-hv] [-o outputfilename] cd-image
Script will try to extract an El Torito image from a
bootable CD (or cd-image) given by <cd-image> and write
the data extracted to STDOUT or to a file.
   -h:        This help.
   -v:        Print version of script and exit.
   -o <file>: Write extracted data to file <file> instead of STDOUT.
USBメモリを接続してデバイスをdmesg やfdisk で確認して,wipefs でパーティション情報をクリアしておく
$ sudo dmesg -He|tail
$ sudo fdisk -l /dev/sdb
$ sudo wipefs -a /dev/sdb
geteltorito でイメージ変換しながら USBメモリへの書き込み
$ geteltorito ./g7uj28us.iso | sudo dd of=/dev/sdb bs=1M oflag=dsync status=progress
Booting catalog starts at sector: 20
Manufacturer of CD: NERO BURNING ROM
Image architecture: x86
Boot media type is: harddisk
El Torito image starts at sector 27 and has 65536 sector(s) of 512 Bytes
[sudo] password for matoken:
33218560 bytes (33 MB, 32 MiB) copied, 10 s, 3.2 MB/sImage has been written to stdout ....

9+178 records in
9+178 records out
33554432 bytes (34 MB, 32 MiB) copied, 10.3254 s, 3.2 MB/s

Debian pkg に含まれているScript のversion とsite で配布されているversion は0.5 と0.6 と少し違ったので念の為両方で変換を掛けて比較してみましたが結果は同じでした.

念の為siteで配布されているものでも変換してイメージを比較してみると同じものだった
$ wget http://userpages.uni-koblenz.de/~krienke/ftp/noarch/geteltorito/geteltorito/geteltorito
$ chmod u+x ./geteltorito
$ ./geteltorito -v
Version: 0.6
$ ./geteltorito -o ./g7uj28us.img ./g7uj28us.iso
$ geteltorito -o ./g7uj28us.img-pkg ./g7uj28us.iso
$ diff -s ./g7uj28us.img ./g7uj28us.img-pkg
Files ./g7uj28us.img and ./g7uj28us.img-pkg are identical

ということで,書き込んだUSBメモリで起動してBIOS update はうまく行きました.

Version が上がっているのを確認
$ sudo dmidecode -t bios|grep -E "Version:|Release Date:"
        Version: G7ETB5WW (2.75 )
        Release Date: 06/10/2019

忘れがちだけど結構脆弱性の修正やmicrocode のアップデートも入っていたのでちゃんと当てないといけないですね…….

環境
$ dpkg-query -W genisoimage coreutils util-linux dmidecode lshw
coreutils       8.30-3
dmidecode       3.2-1
genisoimage     9:1.1.11-3+b2
lshw    02.18.85-0.2
util-linux      2.33.1-0.1
$ hostnamectl | egrep 'Operating System|Architecture'
  Operating System: Debian GNU/Linux 10 (buster)
      Architecture: x86-64