[DELL XPS 13 9350]Xubuntu 16.04 LTSをインストールした時の覚書

ノートパソコンにLinuxを入れるのは、メンドイなぁ。

laptop-xps-13-9350-pdp-polaris-03

いろいろと症状が出たので、備忘録を残します。

環境

  • DELL XPS 13 9350
  • CPU Core i7 Skylake、Mem:8GB、SSD:512GB
  • ディスプレイはタッチパネル付きのQHD+液晶です。
  • 無線LANカード:Broadcom BCM4230
    過去の投稿記事で、Intel製のものに載せ替えていますが、もう一度デフォルトの無線LANカードに戻しました。
  • SSD内にWindows領域は、ありません。

Xubuntu 16.04のインストール

事前にやっておくことは2つ。

  1. BIOSを最新版にしておくこと。
  2. BIOSからSATAの設定を「AHCI」にしておくこと。
  3. セキュアブートの無効化

BIOSの更新方法は省きます。

起動時にF2ボタンを連打して、BIOSに入ったあと、SATA Operationの設定から「AHCI」を選ぶだけです。

DSC_0301

あとは、Xubuntuを入れておいたUSBからブートして、インストールを進めるだけです。

DSC_0300

Secure bootの無効化は同じく、BIOSの中で、
Secure Boot -> Secure Boot Enable -> Disable

インストール後のあれこれ

XPS13特有のバグ?から、Xubuntu16.04のバグ、バグでもないけど使いづらいものまでありましたが、最低限、使えるようにする備忘録です。

ディスプレイの設定を変更する。

液晶画面がQHD+(3200 x 1800)という高精細なものですので、デフォルトのままだと文字が異常に小さくて、とても読めるものではありません。
解消するには2パターンあります。

DPIの設定を変更する

設定→外観→フォントから「カスタムDPI設定」で値を変更する。
DPIの設定はお好みですが、「192」とかにしておけばいいかな、と思います。
xps-dpi

またテーマも変更します。
設定→ウィンドウマネージャーを開きます。
「Default-xhdpi」を選びます。
xps13-xhdpi

ただ、アイコンがすべてHiDPIに対応しているわけではないので、見づらい箇所もチラホラ。お好みでどうぞ。

解像度を変える

設定→ディスプレイ

解像度そのものを「1920×1080」あたりに設定する。フォントがややボケ気味になるかも。
xps13-display

Wifi接続を安定化させる。

Wifiのエラーがひどすぎ。

DNS参照エラーを解消

Newtworkマネージャーが悪さをしているらしいです。

解決策が具体的に見つかったわけではないけれど、上記のやり方で安定しているので、このまま設定してみます。
dns=dnsmasqをコメントアウト(または削除。)

エディターで設定ファイルを開きます。

$ sudo nano /etc/NetworkManager/NetworkManager.conf

赤字部分を修正。

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

スリープからの復帰した際、ネットワークに接続できない。

SoftbankのPocket Wifi 303ZTと接続できなくなりました。
こちらのサイトをそのまま実行してみたら、解決できました。
また、スリープからの復帰も早くなったような気がします。

wakenet.shファイルを作成

$sudo touch /etc/pm/sleep.d/wakenet.sh

実行権限を与える

$sudo chmod +x /etc/pm/sleep.d/wakenet.sh

ファイルの中身を編集。お好みのエディターで開く。

$sudo nano /etc/pm/sleep.d/wakenet.sh

空白のファイルが開くので下記を追加。

#!/bin/bash
case "{$1}" in
thaw|resume)
nmcli nm sleep false
pkill -f wpa_supplicant
;;
*)
;;
esac

スリープから復帰するとマウスカーソルが消える

スリープ絡みのエラーが多すぎ。

絶賛、バグ認定中。
これはデスクトップPCでも同じことが起きたので、XPS13のせいではないです。

代替案として、スクリーンセーバーを変えちゃうらしいです。

デフォルトの「Light Locker」は消して、「Gnome Screensaver」を入れます。

$ sudo apt-get install gnome-screensaver
$ sudo apt-get remove light-locker

スリープに入る時間が怪しいけど、とりあえずこれで代用。

【2016/05/01追記】

上記以外にも方法が。

ひとつは「Ctrl+Alt+F1」を押してから、「Ctrl+Alt+F7」を押すこと。

もうひとつは、「xset s activate」とコマンドを打つこと。

確かに両方共復帰するけれど、面倒なのでスリープ復帰時にコマンドを唱えることにしてみました。
これをやると、スリープ復帰後のパスワード入力は無効になってしまいます。
設定→電源管理→Securityの「スリープ状態へ遷移中は、画面をロックする」のチェックを外す。

$ cd /etc/pm/sleep.d
$ sudo nano mouse.sh

で、これに下記を入力。

!/bin/bash
case "{$1}" in
resume|thaw)
 /usr/bin/xset s activate
;;
*)
;;

esac

保存したら、実行権限を与えたりする。

sudo chmod +x mouse.sh
sudo chmod 755 mouse.sh

これで無事にマウスカーソルが復活します。

ディスプレイを閉じてスリープに入り、ディスプレイを開けるとタッチパネルが使えなくなる

さらっと書きますが、対策はありません・・・。
(これを解決するのに2ヶ月調べましたが無理でした)

電源ボタンにスリープを割り当てるほかないです。

タッチパッドのジャンピングを防止する。

キーボードで文字を打っていると、いつの間にか手の平がタッチパッドに触れて、マウスカーソルが吹っ飛びます。結構なストレス。

タッチパッドの設定

$ xinput -l

を実行して、タッチパッドデバイスが2つ出てくる。

  • synaptics: DLL0704:01 06CB:76AE Touchpad:
  • SynPS/2 Synaptics TouchPad:

このうち、SynPS/2の方を無効にする。

$ sudo nano /etc/modprobe.d/blacklist.conf

追記す  るところはどこでもいいので、

blacklist psmouse

を追記して保存。

カーネルモジュールの依存関係情報を更新します。実行後は再起動。

$ sudo depmod -a 
$ sudo update-initramfs -u

続いてコマンドでジャンピング抑制を行います。

syndaemonコマンド

こちらのサイトが詳しいです。

単純に

$ syndaemon -d

だけでもデーモンとしてバックグラウンドで実行できるけど、キーボードの入力から2秒間、一切タッチパッドを受け付けないので、やめたほうがいいです。
以下、細かく設定してみます。

$ /usr/bin/syndaemon -t -k -i .5 -d
  • -t
    タップとスクロールだけを無効にして、タイピング中もマウスの移動を無効にしないようにデーモンを設定します。
  • -k
    キーボードの活動を監視している間は修飾キーを無視するようにデーモンを設定します (例: Ctrl+左クリック)。
  • -i .5
    アイドル時間を0.5秒に設定します。このアイドル時間は最後のキーの押下からタッチパッドをまた有効にするまで何秒間待機するかを指定します。
  • -d
    デーモンとして起動、バックグラウンドで動きます。

これをスタートアップに追加します。

セッションと起動→自動開始アプリケーションを開きます。XPS-syndaemon

synclientコマンドを使う

synclientコマンドでは細かなタッチパッドの設定を行えます。
次のコマンドで変更できるパラメーターをリスト表示できる。設定項目が多いのでどれをどういじっていいか分からないけど、メインどころだけ注釈を入れてある。
「0」が無効、「1」が有効

$ synclient -l

Parameter settings:
LeftEdge = 48
RightEdge = 1168
TopEdge = 36
BottomEdge = 644
FingerLow = 25
FingerHigh = 30
MaxTapTime = 180
MaxTapMove = 61
MaxDoubleTapTime = 100
SingleTapTimeout = 180
ClickTime = 100
EmulateMidButtonTime = 0
EmulateTwoFingerMinZ = 282
EmulateTwoFingerMinW = 7
VertScrollDelta = 27(ナチュラルスクロールはこの値をマイナスに)
HorizScrollDelta = 27(ナチュラルスクロールはこの値をマイナスに)
VertEdgeScroll = 0(端でのスクロール設定)
HorizEdgeScroll = 0(下端でのスクロールを設定)
CornerCoasting = 0
VertTwoFingerScroll = 1(縦方向の二本指スクロール)
HorizTwoFingerScroll = 0(横方向の二本指スクロール)
MinSpeed = 1
MaxSpeed = 1.75
AccelFactor = 0.143575
TouchpadOff = 0
LockedDrags = 0(ドラッグロック(3回タップでドラッグ)
LockedDragTimeout = 5000
RTCornerButton = 2
RBCornerButton = 3
LTCornerButton = 0
LBCornerButton = 0
TapButton1 = 1
TapButton2 = 3
TapButton3 = 2
ClickFinger1 = 1
ClickFinger2 = 3
ClickFinger3 = 0
CircularScrolling = 0
CircScrollDelta = 0.1
CircScrollTrigger = 0
CircularPad = 0
PalmDetect = 0(ここはゼロにしておき、syndaemonで制御)
PalmMinWidth = 10(手が触れたと認識する領域の広さ)
PalmMinZ = 200(検出が行われる最小圧力)
CoastingSpeed = 20
CoastingFriction = 50
PressureMotionMinZ = 30
PressureMotionMaxZ = 160
PressureMotionMinFactor = 1
PressureMotionMaxFactor = 1
ResolutionDetect = 1
GrabEventDevice = 0
TapAndDragGesture = 1
AreaLeftEdge = 0
AreaRightEdge = 0
AreaTopEdge = 0
AreaBottomEdge = 0
HorizHysteresis = 6
VertHysteresis = 6
ClickPad = 1
RightButtonAreaLeft = 608
RightButtonAreaRight = 0
RightButtonAreaTop = 557
RightButtonAreaBottom = 0
MiddleButtonAreaLeft = 0
MiddleButtonAreaRight = 0
MiddleButtonAreaTop = 0
MiddleButtonAreaBottom = 0

この設定値をいじれば、かなり細かく設定できることが分かります。

先ほどの「syndaemon」だけで済む場合は、この設定は必要ないですが、実際のところはSynclientも合わせた方がより効果が高いと思います。

タッチパッドの大きさをXY軸で表示させる。

Synclientでタッチパッドの一部を無効化させるために、タッチパッドの大きさをXYの座標データを得たいと思います。

$ grep range /var/log/Xorg.0.log

これでX軸とY軸の座標データを得られます。

タッチパッドの左上を起点にX軸方向に1216、Y軸のマイナス方向に680という数値が得られました。

[ 5.000] (--) synaptics: DLL0704:01 06CB:76AE Touchpad: x-axis range 0 - 1216 (res 12)
[ 5.000] (--) synaptics: DLL0704:01 06CB:76AE Touchpad: y-axis range 0 - 680 (res 12)

ということで、横が1216、縦が680ということが判明しました。

先ほどの「synclient -l」で出力したパラメーターのうち、次のパラメーターに数値を入れることで、タッチパッドの特定のエリアを無効にすることができます。

  • タッチパッド左端を100だけ無効にする
    AreaLeftEdge = 100
  • タッチパッド右端を100だけ無効にする
    AreaRightEdge = 1116
  • タッチパッド上端を50だけ無効にする
    AreaTopEdge = 50
  • タッチパッド下端を50だけ無効にする
    AreaBottomEdge = 630

右端と下端だけ無効にすればいいのかな、と思います。

もし、座標軸の数値を細かく得たいのであれば、「input-utils」をインストールする。

$ sudo apt-get install input-utils

次にデバイスのイベント番号を特定します。
すべてのデバイスが表示されるのでダラダラと長いです。

 $ cat /proc/bus/input/devices

 I: Bus=0018 Vendor=06cb Product=76ae Version=0100
 N: Name="DLL0704:01 06CB:76AE Touchpad"
 P: Phys=i2c-DLL0704:01
 S: Sysfs=/devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-7/i2c-DLL0704:01/0018:06CB:76AE.0002/input/input12
 U: Uniq=
 H: Handlers=mouse2 event10
 B: PROP=5
 B: EV=b
 B: KEY=e520 10000 0 0 0 0
 B: ABS=260800000000003

赤字部分の「event10」を使う。

$ sudo input-events 10

/dev/input/event10
 bustype : BUS_I2C
 vendor : 0x6cb
 product : 0x76ae
 version : 256
 name : "DLL0704:01 06CB:76AE Touchpad"
 phys : "i2c-DLL0704:01"
 uniq : ""
 bits ev : EV_SYN EV_KEY EV_ABS

waiting for events

一定時間、タッチパッドのタッチログをリアルタイムに表示してくれる。

14:21:13.917292: EV_ABS ABS_MT_POSITION_X 843
 14:21:13.917292: EV_ABS ABS_MT_POSITION_Y 308

こんな感じで表示してくれるので、この場合、X軸843とY軸308の位置をタッチしていることが分かるので、無効にしたい領域をこれを使って知ることができる。

ここまで細かく、座標を知る必要はないと思います。

このままだと再起動した際、設定が無効になるのでセッションと起動でスタートアップ時に設定を有効にするようにしておきます。
問題なのはこれらの設定は、ログアウトまたは再起動するとリセットされてしまうこと。
なのでスタートアップでこれらの設定を有効にするように突っ込んでおく。
設定→セッションと起動に登録しておけばオッケーです。

/usr/bin/synclient VertEdgeScroll=0 PalmDetect=0 AreaRightEdge=1068 AreaTopEdge=150 VertScrollDelta=-27 HorizScrollDelta=-27

※VertScrollDelta=-27 HorizScrollDelta=-27
ナチュラルスクロールの設定です。
タブレットのようなスクロール設定を有効にします。

xps13-syndaemon

電源管理の設定

ちゃんと使えるようになるまで、長いですね・・・。

いろいろとツールはあるようですが、私はIntel謹製「Powertop」を使います。

$sudo apt-get install powertop

「$ sudo powertop」で確認すると、消費電力6Wから9Wの間くらいで維持していました。
xps13-powertop-default
Xubuntu15.10の時はこの倍くらいはデフォルトで消費していたので、16.04になってから優秀な部類に入るのではないでしょうか。

これから省電力設定を行いますが、上記画面のうち「Tunables」のタブを開くとこんな感じです。
xps13-powertop-Tunables

このうち、BadとあるのをGoodにすると省電力設定となります。
BadのところでEnterキーを押すとGoodになりますが、これを自動的にやりたいのです。

キャリブレーション

まずは、powertopコマンドで電源管理の調整をしてもらいます。

$ sudo powertop --calibrate

するとしばらく画面が真っ暗になったり、いろいろな挙動が起こりますが、落ち着いてコーヒーでも飲んで待ってみてください。

一番手抜きの電源管理

一番手抜きな方法は

$ sudo powertop --auto-tune

を実行すればいいだけです。
これを行うとすべての項目がGoodとなるので、一番楽チンです。

ただし、問題なのはUSB接続したマウスとか、Bluetooth接続したマウスなどが一定時間スリープ状態になってしまい、反応しなくなってしまうのです。

なので、これを個別に行う必要があります。

面倒な電源管理

手順が多くて面倒ですが、USBマウス等を使う人はやらざるを得ません。

チューニングすべきコマンドを出力

htmlファイルもしくはcsvファイルで、チューニングのためのコマンドを出力することができます。

$ sudo powertop --html result.html

または

$ sudo powertop -C result.csv

見やすいのはHTMLです。
Chromeですと崩れるのでFirefoxでご覧ください。
xps13-powertop-html-overview

このうち、「Tuning」のタブを見ると、DescriptionとScriptが分かれていると思います。
このScriptが実行すべき省電力コマンドです。
xps13-pt-Script

Script欄のコマンドをSuperUser権限で実行します。

$ sudo echo '1500' > '/proc/sys/vm/dirty_writeback_centisecs';

これで個別の省電力設定が可能になります。

個別のコマンドをScript化

さすがに一つ一つコマンドを売っていくのは面倒なので、Shell Scriptに実行させたいと思います。

それを自分なりにまとめたのがコレです。

#!/bin/sh

#VM writeback timeout
 echo '1500' > '/proc/sys/vm/dirty_writeback_centisecs';

#NMI watchdog should be turned off
 echo '0' > '/proc/sys/kernel/nmi_watchdog';

#Enable Audio codec power management
 echo '1' > '/sys/module/snd_hda_intel/parameters/power_save';

#Enable SATA link power management for host1
 echo 'min_power' > '/sys/class/scsi_host/host1/link_power_management_policy';

#Enable SATA link power management for host2
 echo 'min_power' > '/sys/class/scsi_host/host2/link_power_management_policy';

#Enable SATA link power management for host0
 echo 'min_power' > '/sys/class/scsi_host/host0/link_power_management_policy';

#Runtime PM for I2C Adapter i2c-0 (i915 gmbus dpc)
 echo 'auto' > '/sys/bus/i2c/devices/i2c-0/device/power/control';

#Runtime PM for I2C Adapter i2c-2 (i915 gmbus dpd)
 echo 'auto' > '/sys/bus/i2c/devices/i2c-2/device/power/control';

#Autosuspend for USB device Touchscreen [ELAN]
 echo 'auto' > '/sys/bus/usb/devices/1-4/power/control';

#Runtime PM for I2C Adapter i2c-1 (i915 gmbus dpb)
 echo 'auto' > '/sys/bus/i2c/devices/i2c-1/device/power/control';

#Autosuspend for USB device BCM2045A0 [Broadcom Corp] USBデバイスが使えなくなりそう。
# echo 'auto' > '/sys/bus/usb/devices/1-3/power/control';

#Runtime PM for PCI Device Intel Corporation Sky Lake Host Bridge/DRAM Registers
 echo 'auto' > '/sys/bus/pci/devices/0000:00:00.0/power/control';

#Runtime PM for PCI Device Intel Corporation Sky Lake Integrated Graphics
 echo 'auto' > '/sys/bus/pci/devices/0000:00:02.0/power/control';

#Runtime PM for PCI Device Intel Corporation Skylake Processor Thermal Subsystem
 echo 'auto' > '/sys/bus/pci/devices/0000:00:04.0/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP Thermal subsystem
 echo 'auto' > '/sys/bus/pci/devices/0000:00:14.2/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP USB 3.0 xHCI Controller
 echo 'auto' > '/sys/bus/pci/devices/0000:00:14.0/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP CSME HECI
 echo 'auto' > '/sys/bus/pci/devices/0000:00:16.0/power/control';

#Runtime PM for PCI Device Intel Corporation Device 9d10
 echo 'auto' > '/sys/bus/pci/devices/0000:00:1c.0/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP PCI Express Root Port
 echo 'auto' > '/sys/bus/pci/devices/0000:00:1c.5/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP LPC Controller
 echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.0/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP PMC
 echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.2/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP HD Audio
 echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.3/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP SMBus
 echo 'auto' > '/sys/bus/pci/devices/0000:00:1f.4/power/control';

#Runtime PM for PCI Device Broadcom Corporation BCM4350 802.11ac Wireless Network Adapter
 echo 'auto' > '/sys/bus/pci/devices/0000:3a:00.0/power/control';

#Runtime PM for PCI Device Realtek Semiconductor Co. Ltd. RTS525A PCI Express Card Reader
 echo 'auto' > '/sys/bus/pci/devices/0000:3b:00.0/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP SATA Controller [AHCI mode]
 echo 'auto' > '/sys/bus/pci/devices/0000:00:17.0/power/control';

#Runtime PM for PCI Device Intel Corporation Sunrise Point-LP PCI Express Root Port
 echo 'auto' > '/sys/bus/pci/devices/0000:00:1c.4/power/control'; 

exit 0

これを適当な場所に「powertop.sh」として保存します。

実行権限を与え、パーミッションを変更します。

$ sudo chmod +x powertop.sh
$ sudo chmod 755 powertop.sh

続いて、SuperUser権限で起動時に実行させるため、サービス化する。

$ cd /etc/systemd/system
$ sudo nano powertop.service

空のファイルが出来上がるので、追記。

[Unit]
 Description=PowerTOP Shell Script tune

[Service]
 Type=idle
 ExecStart=[作成したファイルのパスを記述]/powertop.sh

[Install]
 WantedBy=multi-user.target

これらに実行権限とパーミッションを変更する。

$ sudo chmod +x powertop.service
$ sudo chmod 755 powertop.service

systemdを再読み込み

$ sudo systemctl daemon-reload

起動時に読み込ませる

$ sudo systemctl enable powertop.service
 Created symlink from /etc/systemd/system/multi-user.target.wants/powertop.service to /etc/systemd/system/powertop.service.

これで再起動してみて、起動直後にpowetopを実行してみてみると・・・
わーい\(^o^)/
xps13-pt-after-tune

消費電力も5.25Wまで落ちました。
xps13-pt-battery

という感じです。

最後に

これで一通り、XPS13をXubuntuで使うための最低限の準備が整いました。
手順がいっぱいあって面倒ですが、一度やってしまえば、快適なモバイルライフを満喫できております。

先人の皆様には毎度毎度、感謝申し上げます。m(_ _)m

関連のありそうな記事

2件のコメント

  1. 初めまして。
    BIOSの設定方法についてご質問させてください。

    XPS 13 9350をこの度購入し、
    OSが起動しなくなった時のために、外付けHDDにバックアップを作り起動用DVDを作成いたしました。
    しかしF12キーまたはF2キーでの起動オプション・BIOSを確認しても外付けドライブ(USB)ドライブから起動する設定がありません。
    サポートセンターに問い合わせたところ「わからないの」との回答でした。
    外付けドライブから起動する設定方法をお教えいただけないでしょうか?
    よろしくお願いいたします。

  2. >ざっきー氏
    外付けDVDドライブ自体がUSBブートに対応していない
    または
    BIOSがUSBブートに対応していない
    のでは?
    他の、USBデバイスからのブートが確実にできるPCをもってたらつないでやってみてください
    どっちのせいでできないか切り分けができます

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)