KDE PlasmaのDolphinでsmb共有の動画をVLCで再生する

問題点

普通にDolphinでsmb://192.168.1.1/Public/に移動して*.mp4を開こうとするとエラーが発生する。Dolphinの挙動的には、マウントせずにDolphin単体でアクセスしているため、VLCプレイヤーではアクセスできていない感じの挙動に見える。
(KDE Plasma:5.17.5、Dolphin:19.12.1)

改善策

基本に戻ってcifsマウントすればファイルシステムの一部として動作するはずなので、まずはcifs-utilsをインストールする。

# apt install cifs-utils

次にfstabに記述を追加してrootじゃなくてもマウント可能にする。

//192.168.1.1/Public /mnt/192.168.1.1-Public cifs username=user,password=pass,vers=3.0,file_mode=0666,dir_mode=0777,noauto,user 0 0

Dolphinを開くと、リモートの項目に「Public on 192.168.1.1」が追加されていた。クリックすると自動的にマウントが行われ、無事にVLCプレイヤーでmp4を再生できた。マウントの解除はrootじゃないとできない。

VPN切断時にアンマウント

自分の場合はVPN経由でマウントする場合もあり、VPN経由でマウントしたまま+VPN切断済みの状態でシャットダウンを行うと、smbサーバーと通信できず、マウント解除を1分30秒待機してからシャットダウンされるので、ここの手順で対策した。

ログアウト時にVPN切断

それでもVPN接続したままシャットダウンすると1分30秒待たされるので、ログアウト時に下記のような内容のVPNを切断するスクリプトを登録しておくと安心。

#!/bin/sh
nmcli connection down VPN接続名

Ubuntu18.04で認証なしsamba共有を作成する

同一ネットワーク内のほかの端末にデータを渡したい場合に、簡単に共有するための「読み取り専用のsamba共有」を作成するのが目的です。

sambaをインストールする。

# apt install samba

設定ファイルをバックアップする。

# mv /etc/samba/smb.conf /etc/samba/smb.conf.backup

設定ファイルを以下の内容で作成する。

[global]
unix charset = UTF-8
dos charset = CP932
security = user
map to guest = Bad User
guest account = nobody

[usershares]
path = /var/lib/samba/usershares/
browseable = yes
guest ok = yes

/var/lib/samba/usershares/の権限を適宜変更する。今回は個人利用なので777で良い。

# chmod 777 /var/lib/samba/usershares/

サービスの開始と有効化。

# systemctl start smbd
# systemctl enable smbd

Ubuntu18.04でLVDSのディスプレイを無効にする

接続していないのに、なぜかLVDS-1というディスプレイがメインディスプレイになっていて、HDMIで接続しているディスプレイがセカンダリ扱いになっている。無効にしたいので、”video=LVDS-1:d”を追記する。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=LVDS-1:d"

設定ファイルを書き出す。

# grub-mkconfig -o /boot/grub/grub.cfg

Ubuntu18.04でmime-typeを追加する

今回はmhtmlファイルのアイコンをhtmlと同じアイコンにしたくて調べた。
下記のようなxmlファイルを作成する。

<?xml version="1.0" encoding="utf-8"?>
<mime-type xmlns="http://www.freedesktop.org/standards/shared-mime-info" type="application/mhtml">
  <comment>MHTML Web Achive</comment>
  <glob pattern="*.mhtml"/>
  <icon name="html"/>
</mime-type>

mime-typeのデータベースを更新する。

$ update-mime-database /home/user/.local/share/mime/

Ubuntu18.04が PCIe Bus Error: severity=Corrected, type=Physical Layer, id=00ea(Receiver ID) を吐きまくる

ある日、Thinkpad E480のUbuntu18.04をアップデートしたら、急に下記のようなエラーを約1秒ごとに吐き続けるようになってしまった。
GUIの動作には支障ない。原因はよくわからないが、とりあえず超じゃまなので止めたい。

Oct 22 09:02:45 host kernel: [  288.701027] pcieport 0000:00:1d.2: AER: Corrected error received: id=00ea
Oct 22 09:02:45 host kernel: [  288.701047] pcieport 0000:00:1d.2: PCIe Bus Error: severity=Corrected, type=Physical Layer, id=00ea(Receiver ID)
Oct 22 09:02:45 host kernel: [  288.701058] pcieport 0000:00:1d.2:   device [8086:9d1a] error status/mask=00000001/00002000
Oct 22 09:02:45 host kernel: [  288.701065] pcieport 0000:00:1d.2:    [ 0] Receiver Error         (First)
Oct 22 09:02:45 host kernel: [  288.914160] pcieport 0000:00:1d.2: AER: Corrected error received: id=00ea
Oct 22 09:02:45 host kernel: [  288.914176] pcieport 0000:00:1d.2: PCIe Bus Error: severity=Corrected, type=Data Link Layer, id=00ea(Receiver ID)
Oct 22 09:02:45 host kernel: [  288.914180] pcieport 0000:00:1d.2:   device [8086:9d1a] error status/mask=00000080/00002000
Oct 22 09:02:45 host kernel: [  288.914183] pcieport 0000:00:1d.2:    [ 7] Bad DLLP              
Oct 22 09:02:49 host kernel: [  292.271860] pcieport 0000:00:1d.2: AER: Corrected error received: id=00ea
Oct 22 09:02:49 host kernel: [  292.271865] pcieport 0000:00:1d.2: PCIe Bus Error: severity=Corrected, type=Physical Layer, id=00ea(Receiver ID)
Oct 22 09:02:49 host kernel: [  292.271867] pcieport 0000:00:1d.2:   device [8086:9d1a] error status/mask=00000001/00002000
Oct 22 09:02:49 host kernel: [  292.271869] pcieport 0000:00:1d.2:    [ 0] Receiver Error         (First)

grubの設定をいじる。
・PCI_MSIカーネル構成パラメーターが有効になっている場合、システム全体でMSI割り込みの使用を無効にする。
・PCIEAERカーネル構成パラメーターが有効になっている場合、PCIE拡張エラー報告を無効にする。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nomsi"
GRUB_CMDLINE_LINUX="pci=noaer"

設定ファイルを作成する。

# grub-mkconfig -o /boot/grub/grub.cfg

再起動したらエラーでなくなった。

FreeIPAサーバーからIPAユーザーとWindows10のローカルユーザーを同期する

前提条件

この手順で設定したIPAサーバーを使用する
・IPAサーバーではexpectコマンドをインストール済み
この手順で設定したWindows10を使用する
・Windows10には設定からsshdをインストール済み

スクリプトの流れ

①FreeIPAサーバーですべてのIPAユーザーを取得してカンマ区切りに加工する
②expectコマンドを使用してWindowsにsshで接続する
③Windows上でユーザーの削除と追加を行うスクリプトに「①」で取得したユーザーリストを送信する

IPAサーバーのスクリプト

cronで定期的に実行するとWindowsの管理が少し楽になるかもしれない。
Windowsの台数が多い場合はsamba4のActiveDirectory使ったほうが良い。

#!/bin/bash

# Kerberosユーザーをすべて取得する
# IPAユーザー以外でログインしている場合はkinitが必要
# echo 'password' | kinit admin
USERS=`ipa user-find | grep "User login:*" | sed "s/  User login: //g" | sed -z "s/\n/,/g"`

# Windowsクライアントにsshで接続して専用batファイルを実行する
# WindowsのIPアドレスは192.168.0.100
# Administratorのパスワードは12345678
HOST="192.168.0.100"
expect -c "
	spawn ssh administrator@$HOST
	expect \"password:\"
	send 12345678\\n
	expect \"Microsoft Windows\"
	send \"C:\\\\Script\\\\UpdateUserAccounts.bat \\\"$USERS\\\"\r\n\"
	expect \"ユーザーリストの更新が完了しました。\"
	send exit\r\n
	interact
"

Windows10のスクリプト

ここではローカルにスクリプト置いてるけど、samba共有に置いた方が管理しやすいかも。

:# ※引数として渡されるユーザーリストはカンマ区切りで末尾にもカンマが必要
@echo off
set parameters=%~1
set domain=LOCAL.EXAMPLE.COM

setlocal enabledelayedexpansion

:# 引数で渡されたリストにいないユーザーの削除
set wmicresult=
for /f "usebackq tokens=*" %%P in (`wmic useraccount where "fullname LIKE '%%@%domain%'"`) do (
	set wmicresult=!wmicresult!%%P 
)
for %%P in (%wmicresult%) do (
	echo %%P | find "%domain%" 1>NUL
	if not ERRORLEVEL == 1 (
		set localname=%%P
		set localname=!localname:@%domain%=!
		echo !parameters! | find "!localname!," 1>NUL
		if ERRORLEVEL == 1 (
			net user !localname! /del 1>NUL
			rmdir /s /q !systemdrive!\Users\!localname! 1>NUL 2>NUL
		)
	)
)

:# 引数で渡されたリストでローカルにいないユーザーの作成
:# パスワードは実際のサインインには使用されないので固定値
set password=87654321
for %%P in (%parameters%) do (
	net user %%P 1>NUL 2>NUL
	if ERRORLEVEL == 1 (
		net user %%P %password% /add /expires:never /fullname:%%P@%domain% 1>NUL
	)
)

endlocal

echo ユーザーリストの更新が完了しました。