Ubuntu一覧

DD Max M4をUbuntu 18.04で動かしたメモ

[参考]
Build and install the dddvb driver under Linux (DVB)

Digital Devices社(独)から販売されている Max M4をUbuntuで使えたので忘れないようにメモ。
記事作成時点だとLinuxに入っているデフォルトのカーネルドライバ(ddbridge)が古くてMax M4は動かないため、手動で新しいバージョンのドライバを入れてMirakurunに設定するところまで書いておく。
あと面倒なのでBCASカードとかそこらへんは割愛してPT3やPLEX系から切り替える感じの手順。
カーネルをアップグレードするとドライバの再インストールが必要になるため注意。個人的にはそのうちにデフォルトドライバで使えるようになって解決する問題だと思ってるので放置してる。

確認環境

Ubuntu 18.04.1

必要パッケージとかのインストール

必要パッケージのインストール

sudo apt install build-essential git dvb-tools

DVB用の周波数設定をインストール

cd /usr/local
sudo git clone https://github.com/Chinachu/dvbconf-for-isdb.git

#Max M4はどのチューナーでも地上/衛星どちらも受信できるので設定ファイルを一つで参照できるようまとめる
cd /usr/local/dvbconf-for-isdb/conf/
cat dvbv5_channels_isdbs.conf dvbv5_channels_isdbt.conf | sudo tee -a dvbv5_channels_isdb.conf

ドライバをインストール

先にPCIスロットへ刺したMax M4を認識しているか確認

lspci |grep Multi

#多分こんなのが表示される
06:00.0 Multimedia controller: Digital Devices GmbH Device 000a

makeしてインストール

cd /usr/local/src
git clone https://github.com/DigitalDevices/dddvb.git
cd dddvb

make clean && make
sudo make install

必要性がわからないけど参考元にあった呪文
たぶんデフォルトの古いドライバより新しく入れたものを優先させるための設定

sudo mkdir -p /etc/depmod.d
echo 'search extra updates built-in' | sudo tee /etc/depmod.d/extra.conf
sudo depmod -a

ドライバをロードして再起動

sudo modprobe ddbridge
sudo reboot

DVBデバイスとして見えるか確認

ls /dev/dvb/

#こんな感じに見えるはず
adapter0  adapter1  adapter2  adapter3

受信動作確認

アンテナを繋いだら実際に受信できるか確認

sudo dvbv5-zap -a 0 -c /usr/local/dvbconf-for-isdb/conf/dvbv5_channels_isdb.conf -r -P 14

#各オプションのざっくりした説明
# -a 使用するDVBデバイスの番号 0なら「/dev/dvb/adapter0」
# -c 周波数の設定ファイル指定
# -r DVBデバイスを録画できるようセットアップ
# -P チャンネル名(チャンネル名は周波数設定から参照)
# 地デジのチャンネルは地方によって変わるので注意、例は山形のNHK総合のつもり

実際に実行するとこうなるはず
「Lock」と出ていれば録画できる程度の感度が確保できてるみたい

$ sudo dvbv5-zap -a 0 -c /usr/local/dvbconf-for-isdb/conf/dvbv5_channels_isdb.conf -r -P 14
using demux 'dvb0.demux0'
reading channels from file '/usr/local/dvbconf-for-isdb/conf/dvbv5_channels_isdb.conf'
tuning to 479142857 Hz
pass all PID's to TS
  dvb_set_pesfilter 8192
       (0x00) Signal= -25.63dBm C/N= 0.00dB UCB= 0
Lock   (0x1f) Signal= -32.93dBm C/N= 32.77dB UCB= 0
Lock   (0x1f) Signal= -32.93dBm C/N= 32.67dB UCB= 0
DVR interface '/dev/dvb/adapter6/dvr0' can now be opened
Lock   (0x1f) Signal= -33.31dBm C/N= 32.67dB UCB= 0 preBER= 0
^CLock   (0x1f) Signal= -33.31dBm C/N= 32.87dB UCB= 0 preBER= 0

受信できてない場合はこんな感じ

$ sudo dvbv5-zap -a 0 -c /usr/local/dvbconf-for-isdb/conf/dvbv5_channels_isdb.conf -r -P 62
using demux 'dvb0.demux0'
reading channels from file '/usr/local/dvbconf-for-isdb/conf/dvbv5_channels_isdb.conf'
tuning to 767142857 Hz
pass all PID's to TS
  dvb_set_pesfilter 8192
       (0x00) Signal= -82.70dBm C/N= 0.00dB UCB= 0
       (0x00) Signal= -82.32dBm C/N= 0.00dB UCB= 0
       (0x00) Signal= -82.32dBm C/N= 0.00dB UCB= 0

Mirakurunの設定

インストール方法は割愛

設定を呼び出す

sudo mirakurun config tuners

以下のように書き換え

- name: MaxM4
  types:
    - GR
    - BS
    - CS
  command: dvbv5-zap -a 0 -c /usr/local/dvbconf-for-isdb/conf/dvbv5_channels_isdb.conf -r -P <channel>
  dvbDevicePath: /dev/dvb/adapter0/dvr0
  decoder: arib-b25-stream-test
  isDisabled: false

- name: MaxM4
  types:
    - GR
    - BS
    - CS
  command: dvbv5-zap -a 1 -c /usr/local/dvbconf-for-isdb/conf/dvbv5_channels_isdb.conf -r -P <channel>
  dvbDevicePath: /dev/dvb/adapter1/dvr0
  decoder: arib-b25-stream-test
  isDisabled: false

- name: MaxM4
  types:
    - GR
    - BS
    - CS
  command: dvbv5-zap -a 2 -c /usr/local/dvbconf-for-isdb/conf/dvbv5_channels_isdb.conf -r -P <channel>
  dvbDevicePath: /dev/dvb/adapter2/dvr0
  decoder: arib-b25-stream-test
  isDisabled: false

- name: MaxM4
  types:
    - GR
    - BS
    - CS
  command: dvbv5-zap -a 3 -c /usr/local/dvbconf-for-isdb/conf/dvbv5_channels_isdb.conf -r -P <channel>
  dvbDevicePath: /dev/dvb/adapter3/dvr0
  decoder: arib-b25-stream-test
  isDisabled: false

Mirakurunを再起動

sudo mirakurun restart

あとは適当に動くか確認して使う

(おまけ)DVBデバイス番号の固定

他のチューナデバイスと共存する時にデバイスの割当番号が変わって慌てないように固定しておくための設定

cat <<'EOF' | sudo tee -a /etc/modprobe.d/ddbridge.conf
options ddbridge adapter_nr=4,5,6,7
EOF

#設定を反映するための再起動
sudo reboot

上記の設定だとadapter4~7になる

$ ls /dev/dvb/
adapter4  adapter5  adapter6  adapter7

ZFSでディスクをreplaceしようとして「(ディスク名) is part of active pool ‘プール名’」のエラーがでた

環境

  • Ubuntu 18.04

事象の発生

ZFSでプールを作成するときにディスクのパスを/dev/disk/by-id/*の永続名で指定するの忘れていて、/dev/sdj1みたいに指定しちゃってた。

$ sudo zpool status -v
 pool: rpool
 state: ONLINE
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://zfsonlinux.org/msg/ZFS-8000-8A
  scan: scrub repaired 384K in 33h36m with 2 errors on Mon Oct 15 10:00:35 2018
config:

        NAME                                          STATE     READ WRITE CKSUM
        rpool                                         ONLINE       0     0     0
          raidz1-0                                    ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
          raidz1-2                                    ONLINE       0     0     0
            sdf1                                      ONLINE       0     0     0
            sdi1                                      ONLINE       0     0     0
            sdj1                                      ONLINE       0     0     0
        logs
          mirror-1                                    ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx           ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx           ONLINE       0     0     0
        cache
          sda                                         ONLINE       0     0     0

errors: 1 data errors, use '-v' for a list

しばらくしてから新しいHDDを追加した際にSATAポートを繋ぎ変えてしまい、/dev/sdj1→/dev/sdh1とパスが変わってプールから見えなくなってしまった。

$ sudo zpool status -v
  pool: rpool
 state: DEGRADED
status: One or more devices could not be used because the label is missing or
        invalid.  Sufficient replicas exist for the pool to continue
        functioning in a degraded state.
action: Replace the device using 'zpool replace'.
   see: http://zfsonlinux.org/msg/ZFS-8000-4J
  scan: scrub in progress since Tue Nov 13 21:59:11 2018
        32.2G scanned out of 20.2T at 192M/s, 30h36m to go
        0B repaired, 0.16% done
config:

        NAME                                          STATE     READ WRITE CKSUM
        rpool                                         DEGRADED     0     0     0
          raidz1-0                                    ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
            ata-ST8000DM004-xxx                       ONLINE       0     0     0
          raidz1-2                                    ONLINE       0     0     0
            sdf1                                      ONLINE       0     0     0
            sdi1                                      ONLINE       0     0     0
            1896067203366565522                       UNAVAIL      0     0     0  was /dev/sdj1
        logs
          mirror-1                                    ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx           ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx           ONLINE       0     0     0
        cache
          sda                                         ONLINE       0     0     0

errors: No known data errors

対応

で、replaceすればいい話だし、どうせなら永続名に変えとこうとか思っていたら以下のようにエラーが出てreplaceできない。

$ sudo zpool replace -f rpool 1896067203366565522 ata-WDC_WD40EFRX-68N32N0_WD-xxx
invalid vdev specification
the following errors must be manually repaired:
/dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-xxx-part1 is part of active pool 'rpool'

ディスクのどっかの情報を見て、どこかのプール所属だと消せないようになってるらしい。
事故防止になるし、まあいいと思う。

メッセージでググってみると、「zpool labelclearコマンド」でディスクからラベル情報が消せるらしいのでやってみる。
(参考)ZFSで使ったことがあるHDD/SSDを再利用する時はzpool labelclearすべき

$ sudo zpool labelclear -f /dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-xxx
/dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-xx is a member (ACTIVE) of pool "rpool"

怒られた。
プールに所属している情報を消してやり直したいのに、所属しているから消せない理不尽。

さらにググったらddコマンドで直接的にディスクから情報を上書き削除している記述がったので真似してみる。
(参考)RAIDZ1: unable to replace a drive with itself

sudo dd if=/dev/zero of=/dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD-xxx bs=64M count=10

これで都合の悪い部分が削除できたらしく、replaceできるようになった。

sudo zpool replace rpool /dev/sdj1 ata-WDC_WD40EFRX-68N32N0_WD-xxx

リプレースしてるところ。

$ sudo zpool status -v
  pool: rpool
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Tue Nov 13 22:07:28 2018
        4.57T scanned out of 20.2T at 1.47G/s, 3h1m to go
        149G resilvered, 22.59% done
config:

        NAME                                            STATE     READ WRITE CKSUM
        rpool                                           DEGRADED     0     0     0
          raidz1-0                                      ONLINE       0     0     0
            ata-ST8000DM004-xxx                         ONLINE       0     0     0
            ata-ST8000DM004-xxx                         ONLINE       0     0     0
            ata-ST8000DM004-xxx                         ONLINE       0     0     0
          raidz1-2                                      DEGRADED     0     0     0
            sdf1                                        ONLINE       0     0     0
            sdi1                                        ONLINE       0     0     0
            replacing-2                                 DEGRADED     0     0     0
              1896067203366565522                       UNAVAIL      0     0     0  was /dev/sdj1
              ata-WDC_WD40EFRX-68N32N0_WD-xxx           ONLINE       0     0     0  (resilvering)
        logs
          mirror-1                                      ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx             ONLINE       0     0     0
            ata-SanDisk_SD8SBAT032G1122_xxx             ONLINE       0     0     0
        cache
          sda                                           ONLINE       0     0     0

errors: No known data errors

Ubuntu18.04のnetplanでIPアドレスのないブリッジが有効化しない事象の回避

KVMで仮想マシンを繋ぐ場合などにIPアドレスのないブリッジを作成することがある。
しかし、記事編集時点でUbuntu18.04とnetplanの組み合わせではそのようなブリッジが手動でないと有効化(UP)しないバグがある。

(参考) netplan does not bring up anonymous bridge on boot

参考元に回避方法についても言及しているコメントが有り、忘れないようにメモしておく。

事象の例

netplanを以下のように設定したとする。

/etc/netplan/01-netcfg.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3:
      dhcp4: yes
      dhcp6: no

  vlans:
    vlan.10:
      id: 10
      link: ens3
      dhcp4: no
      dhcp6: no

    vlan.20:
      id: 20
      link: ens3
      dhcp4: no
      dhcp6: no

  bridges:
    br.10:
      interfaces: [vlan.10]
      dhcp4: no
      dhcp6: no

    br.20:
      interfaces: [vlan.20]
      dhcp4: no
      dhcp6: no

[netplan apply]や再起動をした場合に以下の様になり、br.10/br.20がDOWNのままとなる。

test@test:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.103/24 brd 192.168.40.255 scope global dynamic ens3
       valid_lft 259170sec preferred_lft 259170sec
3: br.20: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 16:80:32:d9:a0:9d brd ff:ff:ff:ff:ff:ff
4: br.10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether d2:c0:53:11:b5:10 brd ff:ff:ff:ff:ff:ff
5: vlan.10@ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br.10 state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff
6: vlan.20@ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br.20 state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff

手動でbr.10を有効化する

sudo ip link set br.10 up

問題なくbr.10が有効化される

test@test:~$ ip a
---略---
3: br.20: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 16:80:32:d9:a0:9d brd ff:ff:ff:ff:ff:ff
4: br.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d2:c0:53:11:b5:10 brd ff:ff:ff:ff:ff:ff
---略---

回避方法

systemdに以下のようなnetworkの設定ファイルを作成
「Name」行をブリッジ名に合わせて作成、ワイルドカードも使えるらしいので今後も増える場合は命名規則を決めてそちらで指定したほうがいいかも。

cat <<'EOF' | sudo tee -a /etc/systemd/network/10-netplan-brUp.network
[Match]
Name=br.10
Name=br.20

[Network]
LinkLocalAddressing=no
ConfigureWithoutCarrier=true
EOF

この状態で設定を適用してみる

sudo netplan apply

ブリッジが有効化される

test@test:~$ ip a
---略---
3: br.20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 16:80:32:d9:a0:9d brd ff:ff:ff:ff:ff:ff
4: br.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d2:c0:53:11:b5:10 brd ff:ff:ff:ff:ff:ff
---略---

Ubuntu18.04で再起動時にsysctlでIPv6を無効化する

記事編集時点で、Ubuntu18.04はバグのせいでsysctlでIPv6を無効化する設定をしてもそのままでは再起動時に読み込んでくれない。

(参考)Using sysctl to permanently disable IPv6 doesn’t have any effect

GRUBにIPv6モジュールを読み込まないよう設定する方法もあるが、モジュールを必要とするアプリケーションで不具合が出ることもあるので、なるべくsysctlを利用して回避する方法を探したら以下の解決方法があった。

(参考)Disable IPv6 on Ubuntu 18.04

参考元のほぼ丸パクリとなるが、備忘の意味も含めて手順をメモしておく。

sysctlでIPv6の無効化設定

何もしてない時点でのアドレス状態
「inet6」がある

test@test:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.105/24 brd 192.168.40.255 scope global dynamic noprefixroute ens3
       valid_lft 258652sec preferred_lft 258652sec
    inet6 fe80::52da:7f99:1e89:4171/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

sysctlを設定

# 設定ファイルの作成
cat <<'EOF' | sudo tee -a /etc/sysctl.d/70-disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF

# 反映
sudo sysctl --system

設定後のアドレス状態
「inet6」がない

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:af:42:25 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.105/24 brd 192.168.40.255 scope global dynamic noprefixroute ens3
       valid_lft 258250sec preferred_lft 258250sec

これだけではバグで再起動した際に反映されないので、以下の手順も行う。

OS起動後にsysctl設定を再適用するスタートアップスクリプトを作成

# スタートアップスクリプトを作成
cat <<'EOF' | sudo tee -a /etc/rc.local
#!/bin/bash
# /etc/rc.local

# Load kernel variables from /etc/sysctl.d
/etc/init.d/procps restart

exit 0
EOF

#実行権限を付与
sudo chmod 755 /etc/rc.local

これで再起動して、IPv6アドレスがなければOK。

本来IPv6も使えるようにしておくべきだが、アプリケーション側で不具合の原因になったり、セキュリティやメンテナンスや設備でコスト増になったりするのでしょうがないんや…