IT

ストビュー着々

ニュース ちょっと前だけど ストリートビュー

波照間島より

波照間の素泊り宿 美波のオーナーが主催するブログ波照間島によると1ヶ月ほど前ルーフにカメラを載せたストリートビュー撮影車が来て撮影していったそうだ。最近はプリウスばかりでは無くインプレッサもあるんだなぁ。

気が付いたらウチの実家の前も対応済みだし、昨年11月に目撃された喜界島を始めとした、沖永良部や与論島など奄美群島の大部分の道路は既に対応済みとなっているので、そろそろ携帯電話のエリアを越えてしまう日も近いのかもね。

港ターミナルでWiFi可能にという話は、竹富町FREE Wi-Fiの一環で石垣港離島ターミナルを中心に竹富島や西表島はおろか、鳩間島、小浜島、黒島を含めた21箇所に無料のWiFiスポットを整備したと言う事だ。ほっほ~、なかなかやるね。

参照

波照間の宿 美波 日本最南端 http://homepage2.nifty.com/minami85/

波照間島 http://minami85.ti-da.net/

安栄観光 - スタッフブログ http://www.aneikankou.co.jp/staffblog/

フルノシステムズ http://www.furunosystems.co.jp/

Wikipedia http://ja.wikipedia.org/wiki/

スマ放題

スマホ時代の新料金プラン「スマ放題」登場!

スマ放題特設サイトより

ソフトバンクの『スマ放題』6月11日から申し込み開始、ドコモの「カケホーダイ&パケあえる」との差分は「データくりこし」「家族おトク割」との事。

「データくりこし」は5Gバイト以上のプランのみが対象で、「家族おトク割」と「家族データシェア」は併用不可だそうだ。

参照

ITmedia Mobile http://www.itmedia.co.jp/mobile/

Engadget Japanese http://japanese.engadget.com/

ケータイ Watch http://k-tai.impress.co.jp/

ソフトバンク http://www.softbank.jp/

ソフトバンクモバイル http://www.softbank.jp/mobile/

Wikipedia http://ja.wikipedia.org/wiki/

Infostealer.Bankeiya

2月にIeの脆弱性を突いて感染を広めたマルウェア、Infostealer.BankeiyaINTERNET Watchの記事によると

不正プログラムは、日本のインターネットバンキング利用者を狙う不正プログラム「Infostealer.Bankeiya」で、ゆうちょ銀行とみずほ銀行のオンラインバンキングへのアクセスを監視し、アクセス時に偽のログイン画面を表示し、IDやパスワード、第2暗証番号などの情報を盗もうとするものだという。

という発表から、具体的に日本人を狙った攻撃が始まったという事で注目を集めていた。

5月になってFlashの脆弱性を突いて感染する亜種のInfostealer.Bankeiya.Bが発生、旅行代理店の「his-j.com」、ブログサイトの「jugem.jp」、動画共有サイトの「pandora.tv」が侵害されていた事が明らかになっているが、今度はバッファローのダウンロードサーバで公開されていたソフトにも感染していた事が判明。

著名な企業の公式サイトが侵害され、マルウェア感染を拡げる形となった事態はかなり深刻だ。

しかし@ITの記事にもあるように何となく表に出ている問題ではなく、業務委託先であるコンテンツプロバイダの問題であるように思える。バッファローの委託先であるCDNetworksにしても、第一報のセキュリティ侵害に関するお知らせなんてどことなく呑気なタイトルだし、本日発表された経過報告にしても原因については未だに「推測」の域を出ないままという体たらくで、何となく「認証サーバ経由への移行作業における些細な不手際から侵入を許してしまった」というところに着地しそうな気配すらあり、そんなとこに任せておいて大丈夫なのかな?と心配になる。

取り敢えず、各種アンチウィルスソフトのアップデートと、59件ものIeの脆弱性修正を含む6月の月例セキュリティパッチ「Flash Player」「Adobe AIR」の脆弱性を修正したバージョン「14」を適用しましょう。

参照

@IT http://www.atmarkit.co.jp/

INTERNET Watch http://internet.watch.impress.co.jp/

ITpro http://itpro.nikkeibp.co.jp/

マイナビニュース http://news.mynavi.jp/

Symantec Connect コミュニティ http://www.symantec.com/

Heartbleed

Heartbleed

http://heartbleed.com/より

今年4月、OpenSSLに発見されたCVE-2014-0160通称ハートブリード問題。

幸いにしてHeartbeat機能が未実装される前のレガシーなUbuntu 10.04ベースだった「自宅サーバ」や「さくらVPSな自前サーバ」は影響を受けないという事だったので、騒動を静観しつつ各方面の情報を整理してみたが、具体的に言うと

OpenSSL 1.0.1 から 1.0.1f および 1.0.2beta1 において Heartbeat メッセージの処理において境界チェックの問題があり、OpenSSL が動作しているマシンのメモリ情報を取得可能な状態にあった

という事で、「Heartbeat RequestのPayload lengthが実際の長さより大きかった場合のケアが不足していた」というお粗末なバグな雰囲気だ。

狙った情報がピンポイントで採れるわけでは無いものの「サーバーの秘密鍵やパスワード等が漏洩」する**“可能性がある”のは間違い無い事からそれなりに深刻な問題である事は否定しないが、それにしてもGW前に起こったセキュリティ アドバイザリ 2963983 – Internet Explorer の脆弱性により、リモートでコードが実行されると同様にマスメディアの騒ぎ方は甚だ不自然**な印象を受ける。

先週は**「CCS Injection脆弱性」**CVE-2014-0224が見つかった。OpenSSLのハンドシェーク中にChangeCipherSpecを受け付けてしまう事で「弱い鍵」を使用させるよう仕向けられ、暗号化通信の内容を第三者(=攻撃者)が読み取ったり、改ざんしたりする事が可能になるそうだ。

UbuntuUpdatesPackage “openssl” (trusty 14.04)でチェックしたところ"Latest version:1.0.1f-1ubuntu2.2"で「対応済み」のようなのでひと安心。

16年もの長い間発見できなかった問題を発見したのは株式会社レピダムの菊池正史氏という事で、珍しく日本語による詳細な経緯も公開されているが、ハートブリード問題を受けて「OpenSSLのコードって実際のところ大丈夫なのかな?」と思ったのが発端だったとかなかなか興味深い。

「大丈夫?」という意味では2010年に1.0になったばかりのOpenSSLだが、1998年の0.9.1から15年以上(暗号技術の輸出規制もあって表面化していないが実際はそれ以前から)開発が続いている経緯としがらみからブラックボックスがあるのかもと思われるので、“よりセキュアな実装"を目指しているLibReSSLにも期待したい。

参照

@IT http://www.atmarkit.co.jp/

UbuntuUpdates http://www.ubuntuupdates.org/

OpenSSL http://www.openssl.org/

CVE https://cve.mitre.org/

eyefiserver2

4月にTrusty化したML110G7でまだ十分に動作確認ができていなかったのが、昨年5月に導入、1月に改修したeyefiserver2

先日Trusty化したGT110bではすんなり動いているように思っていたのだが、実はpyexiv2関連で発生したExceptionによってSOAPの応答が発行されず、電源が入る度にEye-Fiカードがアップロードを繰り返していた事が判明。

よくよく調べてみると、昨年5月のUbuntu 10.04ではlucidなpython-pyexiv2がバージョン 0.1.3だったので、APIはレガシーなpyexiv2.Imageやexif.readMetadataを使用する必要があったのだが、preciseなpython-pyexiv2以降はバージョン 0.3.2になっているのでpyexiv2関連のAPIはモダンなpyexiv2.ImageMetadataやexif.readに戻す必要があったという事だ。

*** eyefiserver.py.orig 2012-06-28 13:16:46.000000000 +0900
--- eyefiserver.py      2014-06-10 00:14:38.685191477 +0900
***************
*** 56,61 ****
--- 56,62 ----
  from datetime import datetime
  import ConfigParser
+ import re
  class Daemon:
      """
***************
*** 566,578 ****
      eyeFiLogger.debug("Using file_mode " + file_mode)
      eyeFiLogger.debug("Using dir_mode " + dir_mode)
!     tempDir = os.path.dirname(self.server.config.get('EyeFiServer','upload_dir'))
      imageTarPath = os.path.join(tempDir, imageTarfileName)
      eyeFiLogger.debug("Generated path " + imageTarPath)
-
      fileHandle = open(imageTarPath, 'wb')
      eyeFiLogger.debug("Opened file " + imageTarPath + " for binary writing")
--- 567,581 ----
      eyeFiLogger.debug("Using file_mode " + file_mode)
      eyeFiLogger.debug("Using dir_mode " + dir_mode)
!     tempDir = os.path.dirname(self.server.config.get('EyeFiServer','temp_dir'))
!     if not os.path.isdir(tempDir):
!       eyeFiLogger.info("Creating folder " + tempDir)
!       os.makedirs(tempDir)
      imageTarPath = os.path.join(tempDir, imageTarfileName)
      eyeFiLogger.debug("Generated path " + imageTarPath)
      fileHandle = open(imageTarPath, 'wb')
      eyeFiLogger.debug("Opened file " + imageTarPath + " for binary writing")
***************
*** 586,634 ****
      imageTarfile = tarfile.open(imageTarPath)
      for member in imageTarfile.getmembers():
!       #timezone = self.server.config.getint('EyeFiServer','timezone')
!       timezone = -7
        imageDate = datetime.fromtimestamp(member.mtime) - timedelta(hours=timezone)
        uploadDir = imageDate.strftime(self.server.config.get('EyeFiServer','upload_dir'))
-       eyeFiLogger.debug("Creating folder " + uploadDir)
        if not os.path.isdir(uploadDir):
            os.makedirs(uploadDir)
            if uid != 0 and gid != 0:
                 os.chown(uploadDir, uid, gid)
            if file_mode != "":
                 os.chmod(uploadDir, string.atoi(dir_mode))
!       f=imageTarfile.extract(member, uploadDir)
!       imagePath = os.path.join(uploadDir, member.name)
!       eyeFiLogger.debug("imamgePath " + imagePath)
        if uid != 0 and gid != 0:
!         os.chown(imagePath, uid, gid)
        if file_mode != "":
!         os.chmod(imagePath, string.atoi(file_mode))
!
!     eyeFiLogger.debug("Closing TAR file " + imageTarPath)
!     imageTarfile.close()
!     eyeFiLogger.debug("Deleting TAR file " + imageTarPath)
!     os.remove(imageTarPath)
      try:
          import pyexiv2
!         metadata = pyexiv2.ImageMetadata(imagePath)
!         metadata.read()
!         if 'Exif.Image.DateTime' in metadata.exif_keys:
!             d = metadata['Exif.Image.DateTime'].value
              seconds = time.mktime(d.timetuple())
              os.utime(imagePath, (seconds, seconds))
          else:
              eyeFiLogger.error("Could not find Exif.Image.DateTime field in EXIF information")
      except ImportError, e:
!         eyeFiLogger.error("pyexiv2 module not present. Could not read EXIF information.")
          if e.message != 'No module named pyexiv2':
              raise
      # Create the XML document to send back
      doc = xml.dom.minidom.Document()
--- 589,674 ----
      imageTarfile = tarfile.open(imageTarPath)
      for member in imageTarfile.getmembers():
!       timezone = self.server.config.getint('EyeFiServer','timezone')
!       # timezone = -7
        imageDate = datetime.fromtimestamp(member.mtime) - timedelta(hours=timezone)
        uploadDir = imageDate.strftime(self.server.config.get('EyeFiServer','upload_dir'))
        if not os.path.isdir(uploadDir):
+           eyeFiLogger.info("Creating folder " + uploadDir)
            os.makedirs(uploadDir)
            if uid != 0 and gid != 0:
                 os.chown(uploadDir, uid, gid)
            if file_mode != "":
                 os.chmod(uploadDir, string.atoi(dir_mode))
!       eyeFiLogger.debug("member.name " + member.name)
!       if re.match(r'^.+\.(LOG)$(?i)', member.name) is not None:
!           continue
!
!       extractFilePath = os.path.join(uploadDir, member.name)
!       if os.path.exists(extractFilePath):
!           eyeFiLogger.info(extractFilePath + " is exist.")
!           continue
!
!       f = imageTarfile.extract(member, uploadDir)
!       eyeFiLogger.info("extractFilePath " + extractFilePath)
        if uid != 0 and gid != 0:
!         os.chown(extractFilePath, uid, gid)
        if file_mode != "":
!         os.chmod(extractFilePath, string.atoi(file_mode))
!         seconds = time.mktime(imageDate.timetuple())
!         os.utime(extractFilePath, (seconds, seconds))
!       if re.match(r'^.+\.(JPE?G)$(?i)', member.name) is None:
!           continue
+       imagePath = extractFilePath;
+       eyeFiLogger.debug("imagePath " + extractFilePath)
          try:
              import pyexiv2
!             eyeFiLogger.debug("pyexiv2.Image: " + imagePath)
!             exif = pyexiv2.ImageMetadata(imagePath)
!             exif.read()
!             if 'Exif.Image.DateTime' in exif.exif_keys:
!                 d = exif['Exif.Image.DateTime'].value
                  seconds = time.mktime(d.timetuple())
                  os.utime(imagePath, (seconds, seconds))
              else:
                  eyeFiLogger.error("Could not find Exif.Image.DateTime field in EXIF information")
          except ImportError, e:
!             eyeFiLogger.exception("pyexiv2 module not present. Could not read EXIF information.")
              if e.message != 'No module named pyexiv2':
                  raise
+         except Exception, e:
+             eyeFiLogger.exception(e.message)
+             raise
+
+     eyeFiLogger.debug("Closing TAR file " + imageTarPath)
+     imageTarfile.close()
+
+     eyeFiLogger.debug("Deleting TAR file " + imageTarPath)
+     os.remove(imageTarPath)
+
+ #    try:
+ #        import pyexiv2
+ #
+ #     eyeFiLogger.debug("pyexiv2.Image: " + imagePath)
+ #        exif = pyexiv2.Image(imagePath)
+ #        exif.readMetadata()
+ #        if 'Exif.Image.DateTime' in exif.exifKeys():
+ #            d = exif['Exif.Image.DateTime']
+ #            seconds = time.mktime(d.timetuple())
+ #            os.utime(imagePath, (seconds, seconds))
+ #        else:
+ #            eyeFiLogger.error("Could not find Exif.Image.DateTime field in EXIF information")
+ #    except ImportError, e:
+ #        eyeFiLogger.error("pyexiv2 module not present. Could not read EXIF information.")
+ #        if e.message != 'No module named pyexiv2':
+ #            raise
+
      # Create the XML document to send back
      doc = xml.dom.minidom.Document()
***************
*** 799,804 ****
--- 839,846 ----
    fileHandler.setFormatter(eyeFiLoggingFormat)
    eyeFiLogger.addHandler(fileHandler)
+   eyeFiLogger.setLevel(config.getint('EyeFiServer','loglevel'))
+   eyeFiLogger.info("Eye-Fi server started loglevel=" + str(config.getint('EyeFiServer','loglevel')))
    server_address = (config.get('EyeFiServer','host_name'), config.getint('EyeFiServer','host_port'))
***************
*** 839,844 ****
--- 881,888 ----
      config = ConfigParser.SafeConfigParser()
      config.read(configfile)
+     eyeFiLogger.setLevel(config.getint('EyeFiServer','loglevel'))
+     eyeFiLogger.info("Eye-Fi server reload loglevel=" + str(config.getint('EyeFiServer','loglevel')))
  class MyDaemon(Daemon):
    def run(self):

参考まで、Python系のライブラリパッケージ導入手順は

vpsもTrusty

2012年5月に導入したさくらのVPS。先日のGT110bに続いてTrusty化。

何はともあれVPSリモートコンソールから

root@vps:~# **apt-get install update-manager-core**
root@vps:~# **do-release-upgrade -d**

を投入する手順でトライしてみたが、やはり先日のGT110bと同様にCPAN/Perl絡みでエラーが量産される状況で環境を引き継ぐオンラインアップデートは不可。

というわけで、潔く再インストールを決断してVPSコントロールパネルから「OS再インストール」をポチッとな。「Ubuntu 14.04」を選択した後はガイダンスに従ってポチポチと一時間弱。

/home配下は無事に引き継げたので/etc/ssh/sshd_configのPort番号を22から**“ほにゃらら”**に変更PasswordAuthenticationはnoにPermitRootLoginはwithout-passwordのままでOKとし、

$ sudo service ssh restart

sshdを再起動した後、remoteからのssh作業にスイッチ。

続いてお約束の設定変更。

$ sudo /usr/sbin/groupmod -n owner yano
$ sudo update-alternatives --config editor

で、グループ名とデフォルトエディタを変更。ついでにsudoでいちいちパスワードを打たなくていいようvisudoNOPASSWDオプションを付与しておく。

yano ALL=(ALL) **NOPASSWD:** ALL

続いてaptをアップデートし、ntpbuild-essentialを導入。

$ sudo apt-get update
$ sudo apt-get install ntp build-essential

インターネットマルチフィード時刻情報サービス:サービス詳細に倣って/etc/ntp.confのサーバをntp1~3.jst.mfeed.ad.jpに変更。

# Specify one or more NTP servers.
# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
# server 0.ubuntu.pool.ntp.org
# server 1.ubuntu.pool.ntp.org
# server 2.ubuntu.pool.ntp.org
# server 3.ubuntu.pool.ntp.org
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
sudo /etc/init.d/ntp restart

今回はロケール設定は英語のままで。

本因坊秀策生誕 185 周年

本因坊秀策生誕 185 周年

本因坊秀策生誕 185 周年より

今日のGoogle Doodles、通称Googleロゴ。

ヒカルの碁でお馴染み…という枕もどうかと思うのだが、とにかく江戸時代の囲碁棋士である本因坊秀策だった。

センスが渋いなぁ…

【追記】ただ、国際的にはノルマンディー上陸作戦の決行日、通称D-Dayでしかも節目の70周年だったのに本因坊Doodleが世界で表示されて大変だったらしいとの事。

合掌。

参照

MdN Design Interactive http://www.mdn.co.jp/

ITライフハック http://itlifehack.jp/

ITmedia オルタナティブ・ブログ:海外速報部ログ http://blogs.itmedia.co.jp/burstlog/

Wikipedia http://ja.wikipedia.org/wiki/

Postfix設定見直し

GT110bのTrusty化作業で、cronepgrecの予約タスクのエラーメールがSMTP送信されずにローカル配送されている事に気付いた。真っ先に疑ったiptablesのフィルタ設定は空っぽだったので、早速Postfixの設定ファイル/etc/postfix/main.cfをチェック。

宛先アドレスがroot@GT110b.bravotouring.comとなってホスト名を含む形になるのが問題なのはわかったが、VPSML110G7と照らし合わせながら試行錯誤して落ち着いた結果が以下の通り。

# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
# ホスト名の設定
myhostname = GT110b.bravotouring.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# ドメインの無いアドレスに付加する値の設定
myorigin = /etc/mailname
# ローカル配送するドメインを指定
mydestination = GT110b.bravotouring.com, localhost.bravotouring.com, , localhost
relayhost =
# メール中継が可能な IP アドレスを制限
mynetworks = 192.168.199.0/24 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
# メールボックスファイルの最大サイズ(単位は bye。 0 は無制限)
# mailbox_size_limit = 0
mailbox_size_limit = 51200000
recipient_delimiter = +
inet_interfaces = all

とはいえ、本質的には

IE11の互換性の変更点

何気にアクセスログ解析を見たところ、ブラウザ別アクセス数で"Mozilla/5.0"が1位になっているのに気付いた。

Netscapeシリーズかと思ったらそうではなく、昨年11月にリリースされた「Internet Explorer 11」で「ユーザーエージェント文字列が変更されたらしい。

**“compatible”とか“MSIE”というトークンが無くなる一方で“like Gecko”**トークンが追加されるという大胆な変更は、「今までのIEとは違う」という立ち位置を表すもので、Windows 8.1のInternet Explorer 11では

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko

Windows 7のInternet Explorer 11では

Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

となっているそうだ。

他にもIE11 の互換性の変更点が公開されているので、参考にされたい。

ついでに64bit版「Google Chrome」も出たよ。

参照

Windows デベロッパー センター http://msdn.microsoft.com/ja-JP/windows/

ITmedia PC USER http://www.itmedia.co.jp/pcuser/

ITmedia ニュース http://www.itmedia.co.jp/news/

窓の杜 http://www.forest.impress.co.jp/

Wikipedia http://ja.wikipedia.org/wiki/

TrustyとPT2

Ubuntu 14.04(Trusty Tahr)を入れたML110G7へのサーバ移行作業。

earthsoft PT2

アースソフト PT2

F-PLUGBluetoothのペアリングが解除される問題が残っているものの、それ以外は特に問題無い事が確認出来たので全面的にML110G7へ移そうかと思ったのだが、ML110G7にはPCIスロットが全く無いのでPT2が浮いてしまう事に気付いた。

改めて整理するとGT110b自体は昨年2月にB75マザーGIGABYTE GA-B75M-D3Hへ喚装済み。という事はハード的にはUSB3.0やSATA3.0もReadyで、問題の根幹はOSであるUbuntu 10.04が古い事に尽きる。

とは言えアップデートに手間取ってGT110bを長時間止めるわけにもいかないのでML110G7へ移行すべしと相成ったわけだが、クリティカルなサービスはML110G7に移行してしまったので、改めてGT110bをアップデートしてみる事にする。

まずはML110G7の時と同じ手順で、ターミナルから

yano@GT110b:~$ **sudo apt-get install update-manager-core**
yano@GT110b:~$ **sudo do-release-upgrade -d**

を投入する手順でトライしてみたが、どうもCPAN/Perl絡みで残骸由来の不整合が残っている(俗に言う「腐った」状態)らしくエラー終了してしまった。

10.04からだと12.04、14.04と2段階上げなければならない事も考慮してオンラインアップグレードを諦め、CD-ROMからクリーンインストールを実施。欲張ったのが災いした区画設定のミスなどでやり直す羽目にも陥ったが、3度目の正直で無事導入完了。

なお、B75マザーGIGABYTE GA-B75M-D3Hでもbiosdevnameの問題が発生。/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT

# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
**GRUB_CMDLINE_LINUX_DEFAULT**="nosplash biosdevname=0"
GRUB_CMDLINE_LINUX=""

と追記して、

$ sudo update-grub2

とする必要があった。

さてカードリーダーSCR3310-NTTComのインストールは

yano@GT110b:~$ **sudo apt-get install libccid pcsc-tools libpcsclite-dev pcscd**
yano@GT110b:~$ **sudo pcsc_scan**

でOK。pt3_drvML110G7に展開したhttps://github.com/m-tsudo/pt3.gitのソースツリーをコピー&インストールして、

blacklist earth-pt1

と書いた/etc/modprobe.d/blacklist-earth-pt1.confを用意するだけでOKかと思いきや、

yano@GT110b:~$ **sudo modprobe pt3_drv**

とやっても/dev/pt3video?ができない問題に直面。

いろいろと調べてみてもよくわからなかったのだが、一晩置いてよく考えたらGT110bに実装しているのはPT3ではなくPT2なので、pt3_drvではなくpt1_drvが正解。いくらpt3_drvをロードしたところで/dev/pt3video?ができないのは当たり前というオチだった。

しかし、手元の