ArchLinuxでlinux-ltsパッケージを4.9系にしたらクラッシュした

どうしようもなく下らない原因だったが、解決まで無駄に時間がかかったので書いとく。

環境

  • XPS13(9343)
  • ArchLinux

現象

普通のlinuxパッケージだとアップデートでたまにおかしくなるので、ArchLinuxではいつもlinux-ltsパッケージを使っている。
少し前にArchLinuxのlinux-ltsパッケージが4.4系から4.9系になった。(一時的にlinux-ltsパッケージがlinuxパッケージより新しくなっていた。)
そして当然のようにおかしくなった。ログインするあたりでほとんどフリーズ状態になる。以下は journalctl で見たエラーログの一部。

Mar 18 05:32:33 arch-xps kernel: BUG: unable to handle kernel NULL pointer dereference at           (null)
Mar 18 05:32:33 arch-xps kernel: IP: [<ffffffffa0553eb4>] cfg80211_scan_done+0x34/0x100 [cfg80211]
Mar 18 05:32:33 arch-xps kernel: PGD 0 
Mar 18 05:32:33 arch-xps kernel: 
Mar 18 05:32:33 arch-xps kernel: Oops: 0000 [#1] SMP
Mar 18 05:32:33 arch-xps kernel: Modules linked in: snd_hda_codec_hdmi nls_iso8859_1 nls_cp437 vfat fat joydev mousedev iTCO_wdt snd_soc_sst_broadwell dell_laptop iTCO_vendor_support hid_multitouch dell_wmi dell_smbios dcdbas snd_soc_sst_haswell_pcm snd_soc_sst_firmware intel_rapl snd_soc_sst_ipc snd_soc_sst_dsp x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm irqbypass crct10dif_pclmul crc32_pclmul snd_soc_rt298 crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 lrw gf128mul glue_helper ablk_helper cryptd intel_cstate input_leds psmouse pcspkr intel_rapl_perf i915 wl(PO) drm_kms_helper btusb btrtl btbcm btintel rtsx_pci_ms memstick snd_hda_intel i2c_i801 bluetooth drm cfg80211 snd_hda_codec intel_gtt syscopyarea sysfillrect sysimgblt snd_hda_core rfkill fb_sys_fops i2c_algo_bit i2c_smbus lpc_ich intel_pch_thermal
Mar 18 05:32:33 arch-xps kernel:  mei_me snd_hwdep mei shpchp fan snd_soc_rt286 snd_soc_ssm4567 snd_soc_rl6347a snd_soc_core snd_compress snd_pcm_dmaengine snd_pcm snd_timer i2c_hid snd soundcore ac97_bus elan_i2c hid thermal wmi battery intel_vbtn soc_button_array int3403_thermal snd_soc_sst_acpi snd_soc_sst_match 8250_dw i2c_designware_platform int3402_thermal intel_hid i2c_designware_core int3406_thermal spi_pxa2xx_platform video sparse_keymap tpm_crb processor_thermal_device int340x_thermal_zone fjes int3400_thermal intel_soc_dts_iosf acpi_thermal_rel acpi_als acpi_pad ac kfifo_buf tpm_tis industrialio tpm_tis_core tpm button evdev mac_hid uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_core videodev media sch_fq_codel ip_tables x_tables ext4 crc16 jbd2 fscrypto mbcache sd_mod rtsx_pci_sdmmc
Mar 18 05:32:33 arch-xps kernel:  serio_raw atkbd libps2 ahci libahci libata xhci_pci scsi_mod xhci_hcd rtsx_pci usbcore usb_common i8042 serio sdhci_acpi sdhci led_class mmc_core
Mar 18 05:32:33 arch-xps kernel: CPU: 2 PID: 219 Comm: wl_event_handle Tainted: P           O    4.9.14-1-lts #1
Mar 18 05:32:33 arch-xps kernel: Hardware name: Dell Inc. XPS 13 9343/0TM99H, BIOS A09 08/29/2016
Mar 18 05:32:33 arch-xps kernel: task: ffff88020e8e1c80 task.stack: ffffc9000133c000
Mar 18 05:32:33 arch-xps kernel: RIP: 0010:[<ffffffffa0553eb4>]  [<ffffffffa0553eb4>] cfg80211_scan_done+0x34/0x100 [cfg80211]
Mar 18 05:32:33 arch-xps kernel: RSP: 0018:ffffc9000133fe08  EFLAGS: 00010246
Mar 18 05:32:33 arch-xps kernel: RAX: 0000000000000021 RBX: ffff880214b52720 RCX: ffffea00084b7220
Mar 18 05:32:33 arch-xps kernel: RDX: ffff880214b522a0 RSI: 0000000000000000 RDI: ffff88020e9c3000
Mar 18 05:32:33 arch-xps kernel: RBP: ffffc9000133fe20 R08: 0000000000000001 R09: ffffffffa0989f30
Mar 18 05:32:33 arch-xps kernel: R10: dead000000000200 R11: dead000000000100 R12: ffff88020e9c3000
Mar 18 05:32:33 arch-xps kernel: R13: 0000000000000000 R14: 000000000000002c R15: ffff880212f5800c
Mar 18 05:32:33 arch-xps kernel: FS:  0000000000000000(0000) GS:ffff88021f500000(0000) knlGS:0000000000000000
Mar 18 05:32:33 arch-xps kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Mar 18 05:32:33 arch-xps kernel: CR2: 0000000000000000 CR3: 0000000002a07000 CR4: 00000000003406e0
Mar 18 05:32:33 arch-xps kernel: Stack:
Mar 18 05:32:33 arch-xps kernel:  ffff880214b52720 ffff880212f5c090 0000000000000000 ffffc9000133fe78
Mar 18 05:32:33 arch-xps kernel:  ffffffffa098a89c ffff880214b52720 0000000114b52f40 0000000000000001
Mar 18 05:32:33 arch-xps kernel:  00000000d223f1a1 ffff880214b52720 ffff880214b52f40 ffff88020d6baa80
Mar 18 05:32:33 arch-xps kernel: Call Trace:
Mar 18 05:32:33 arch-xps kernel:  [<ffffffffa098a89c>] wl_notify_scan_status+0x7c/0x320 [wl]
Mar 18 05:32:33 arch-xps kernel:  [<ffffffffa0986f6c>] wl_event_handler+0x7c/0x1f0 [wl]
Mar 18 05:32:33 arch-xps kernel:  [<ffffffffa0986ef0>] ? wl_deinit_priv_mem+0xa0/0xa0 [wl]
Mar 18 05:32:33 arch-xps kernel:  [<ffffffff8109c0c9>] kthread+0xd9/0xf0
Mar 18 05:32:33 arch-xps kernel:  [<ffffffff8102c74e>] ? __switch_to+0x2ce/0x5b0
Mar 18 05:32:33 arch-xps kernel:  [<ffffffff8109bff0>] ? kthread_park+0x60/0x60
Mar 18 05:32:33 arch-xps kernel:  [<ffffffff815f8a55>] ret_from_fork+0x25/0x30
Mar 18 05:32:33 arch-xps kernel: Code: 41 55 41 54 49 89 f5 53 49 89 fc 0f 1f 44 00 00 49 8b 54 24 60 48 85 d2 0f 84 8f 00 00 00 4c 3b a2 78 fe ff ff 0f 85 84 00 00 00 <49> 8b 45 00 49 89 44 24 70 49 8b 45 08 41 c6 84 24 80 00 00 00 
Mar 18 05:32:33 arch-xps kernel: RIP  [<ffffffffa0553eb4>] cfg80211_scan_done+0x34/0x100 [cfg80211]
Mar 18 05:32:33 arch-xps kernel:  RSP <ffffc9000133fe08>
Mar 18 05:32:33 arch-xps kernel: CR2: 0000000000000000
Mar 18 05:32:33 arch-xps kernel: ---[ end trace ab9b0936ea08d323 ]---
Mar 18 05:32:33 arch-xps kernel: BUG: unable to handle kernel paging request at 00000000d223f1a1
Mar 18 05:32:33 arch-xps kernel: IP: [<ffffffff810c08fb>] __wake_up_common+0x2b/0x80
Mar 18 05:32:33 arch-xps kernel: PGD 0 
Mar 18 05:32:33 arch-xps kernel: 
Mar 18 05:32:33 arch-xps kernel: Oops: 0000 [#2] SMP
Mar 18 05:32:33 arch-xps kernel: Modules linked in: snd_hda_codec_hdmi nls_iso8859_1 nls_cp437 vfat fat joydev mousedev iTCO_wdt snd_soc_sst_broadwell dell_laptop iTCO_vendor_support hid_multitouch dell_wmi dell_smbios dcdbas snd_soc_sst_haswell_pcm snd_soc_sst_firmware intel_rapl snd_soc_sst_ipc snd_soc_sst_dsp x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm irqbypass crct10dif_pclmul crc32_pclmul snd_soc_rt298 crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 lrw gf128mul glue_helper ablk_helper cryptd intel_cstate input_leds psmouse pcspkr intel_rapl_perf i915 wl(PO) drm_kms_helper btusb btrtl btbcm btintel rtsx_pci_ms memstick snd_hda_intel i2c_i801 bluetooth drm cfg80211 snd_hda_codec intel_gtt syscopyarea sysfillrect sysimgblt snd_hda_core rfkill fb_sys_fops i2c_algo_bit i2c_smbus lpc_ich intel_pch_thermal
Mar 18 05:32:33 arch-xps kernel:  mei_me snd_hwdep mei shpchp fan snd_soc_rt286 snd_soc_ssm4567 snd_soc_rl6347a snd_soc_core snd_compress snd_pcm_dmaengine snd_pcm snd_timer i2c_hid snd soundcore ac97_bus elan_i2c hid thermal wmi battery intel_vbtn soc_button_array int3403_thermal snd_soc_sst_acpi snd_soc_sst_match 8250_dw i2c_designware_platform int3402_thermal intel_hid i2c_designware_core int3406_thermal spi_pxa2xx_platform video sparse_keymap tpm_crb processor_thermal_device int340x_thermal_zone fjes int3400_thermal intel_soc_dts_iosf acpi_thermal_rel acpi_als acpi_pad ac kfifo_buf tpm_tis industrialio tpm_tis_core tpm button evdev mac_hid uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_core videodev media sch_fq_codel ip_tables x_tables ext4 crc16 jbd2 fscrypto mbcache sd_mod rtsx_pci_sdmmc
Mar 18 05:32:33 arch-xps kernel:  serio_raw atkbd libps2 ahci libahci libata xhci_pci scsi_mod xhci_hcd rtsx_pci usbcore usb_common i8042 serio sdhci_acpi sdhci led_class mmc_core
Mar 18 05:32:33 arch-xps kernel: CPU: 2 PID: 219 Comm: wl_event_handle Tainted: P      D    O    4.9.14-1-lts #1

原因

エラーログを見たいのに /var/log/messages がないぞと右往左往していたが journalctl で見れた。このコマンド超便利。
そしてエラーログを見たらすぐわかった。cfg80211というやつが悪さしてる。これは無線LAN絡みで入れていたパッケージ broadcom-wl-dkms に出てきた記憶があった。

解決

結局 broadcom-wl-dkms パッケージをアップデートしたら直った…。ログの読み方はちゃんと覚えよう。そしてちゃんとアップデートしよう。(このパッケージはAURだからpacmanでできてなかった?)

Emacs/Vimで、ただの削除をする方法

Vimでは "_ をつけてから削除系のコマンドを打つと、削除したものがクリップボード的なものに入らない。つまり「切り取り」ではなく完全な「削除」になる。とても便利。
だがEmacsでこれをやる方法がわからず、地味に困っていたので調べた。ついでにVimについても書く。

何がしたいのか

単語 very_long_long_long_word をコピーし、別の単語 another_long_long_long_word をこれで置き換えたいとする。(置換コマンドを打てというのはなしで。)
another_long_long_long_wordを普通に削除(Vimでdiw、EmacsでM-dみたいに)して、very_long_long_long_wordを貼り付けようとしても、クリップボード的なものにはたったいま削除したanother_long_long_long_wordが入ってしまっているので、貼り付けられない。「削除」と言いつつ、知る限りのコマンドはすべて「切り取り」でしかないから。
another_long_long_long_wordを削除するとき、クリップボード的なものにこれを入れないようにしたい。

Vim

レジスタ

普通 ddci" など削除系コマンドを打つと、削除した内容がクリップボード的なもの(レジスタ)に入っていく。レジスタの指定をするときはダブルクオーテーションを前につける。
レジスタは0+などいろいろあり、たとえば3のレジスタに入っている内容を貼り付けたいなら"3pのように、ダブルクオーテーション + レジスタのあとに貼り付けコマンドを打てばいい。逆に"3ddのように削除内容を入れるレジスタを指定することもできる。これは削除系(dとかcとか)だけでなくヤンクyでも同じ。
レジスタの内容は:di:regで確認できる。

_レジスタを使うといい

特殊なレジスタとして_がある。Vimで:h "_とコマンドを打てばこのレジスタのヘルプが見れる。そこには”Black hole register”と書いてある。このレジスタを指定して削除系のコマンドを打てば、レジスタには残らない。ただの削除が行えるということだ。"_ddとすれば行の削除、"_di{とすれば{}内の削除が、レジスタを汚さずにできる。

これを使えば、上のような例の場合、another_long_long_long_wordを"_diwで消せばレジスタに残らないので、pでvery_long_long_long_wordが貼り付けられる。

まあdiwで削除しても"0pとすればvery_long_long_long_wordが貼り付けられるが。

Emacs

キルリング

Emacsでのクリップボード的なものはキルリングという。C-yのあとにM-yを何度も押すと、キルリングの内容が新しいものから次々に出てきて、過去にコピー・削除したものを貼り付けられる。(M-x helm-show-kill-ringを使えばもっと便利。helm入れてたら使えるはず。)

リージョン指定してBackspaceすればいい

これはEmacs: how to delete text without kill ring? – Stack Overflowに書いてある。Vimのように、どの削除コマンドにも応用できる方法はないようだ。
削除したいリージョンを選択してからDeleteキーなりBackspaceキーを押せば、キルリングを汚さずに、ただの削除ができる。
これは変数delete-active-regiontになっているとき(デフォルト)、BackspaceやDeleteがそのリージョン全体に対してBackspaceやDeleteの働きをするためのようだ(Backspaceなどはキルリングを汚さず、ただの削除をするので)。リージョン選択後にM-x delete-regionでもいける。

参考

Emacs/Vimで、現在編集中のファイルフルパスをクリップボードにコピーする

FirefoxにVimperator入れて使ってるが、yだけで現在開いているサイトのURLをコピーできるのが便利。
(copy.js使うともっと便利。)
同じことをエディタでもできればいいと思ったので設定書いてみた。
Emacs LispもVim scriptも初心者なのでいろいろ調べた。

環境

特にバージョンとかは関係なく動くと思うが一応。
+ OS: ArchLinux
+ Emacs: 25.1.1
+ Vim: 8.0

Emacs

(define-key global-map (kbd "C-z y")
  '(lambda ()
     (interactive)
     (let ((fullpath (buffer-file-name)))
       (message "copied fullpath: %s" fullpath)
       (kill-new fullpath))))

C-z y で、現在開いているファイルのフルパスをコピーする。エコー領域にも表示される。

メモ

  • エコー領域
    これは「ミニバッファ」と言うと思ってたが、
    入力を待っているときはミニバッファと言い、
    出力だけのときはエコー領域と言うらしい。
    EmacsWiki: Echo Areaによれば

    Short messages to the user appear commonly in the echo area. This area is shared with the minibuffer. The space occupied by the minibuffer for input is thus also used by the echo area for output. There are two names for this space because the behavior is different.

  • buffer-file-name
    関数。ファイルのフルパスを返す。

  • default-directory
    変数。ディレクトリのパスを返す。
    今回は使わなかったが。

  • kill-new
    関数。文字列をkill-ringに追加。

  • なぜ(interactive)をつけるのか
    これはこういうものらしい。
    define-keyとかglobal-set-keyでキーバインドを設定するときは
    インタラクティブコマンドにしないといけないそう。
    (interactive)をつけない場合、”Wrong type argument: commandp”という
    エラーメッセージが出る。

    M-x describe-function RET global-set-keyには以下のように書いてある。

    COMMAND is the command definition to use; usually it is
    a symbol naming an interactively-callable function.

参考

Vim

nnoremap <Space><C-g> :<C-u>echo "copied fullpath: " . expand('%:p') \| let @+=expand('%:p')<CR>

Space + C-g で、現在開いているファイルのフルパスをコピーする。エコー領域にも表示される。
Emacsで言うエコー領域を、Vimでは何と言うのかわからないが…。

メモ

  • expand(‘%:p’)
    これでフルパスを取得。
  • let @+=
    これで+レジスタ(クリップボード)に、=の右側を入れる。
  • .
    Vim scriptでの文字列連結。
  • <C-u>
    bashでCtrl-uすればカーソルの左を全削除するが、あれと同じ。Vimでもコマンド打つときはそうなる。
    ノーマルモードで数字打ったあとにコロン押してコマンドを打つと、
    はじめに範囲指定が入って、余計なことをする。
    <C-u>をやればその数字が消える。
  • 1 C-g
    おまけ。これはデフォルトで使えるコマンド。
    このコマンドを打てばファイルフルパスが表示される。
    2 C-g ならバッファ番号まで表示される。
    C-g だけなら相対パス。

参考