Ubuntu/ArchLinuxで画面キャプチャ(jpg/png/mp4/gif)

久々に画面キャプチャしようとしたらやり方がわからなかったのでメモ。
たくさんツールはあると思うので、一例でしかない。

環境

以下のOSでの方法。

  • Ubuntu 16.04
  • ArchLinux

なおUbuntu(というかDebian)では現在、パッケージ管理のコマンドとして apt-get ではなく apt を使う方がいいらしい。
でも apt-get でやってしまったのでそのまま書く。

静止画(jpg/png)

GIMPを使う。
これでjpg形式やpng形式にできる。
スクショを撮るためにGIMPを入れるのはけっこう間違ってるが、たまたま入ってたのでこれを使う。
なおUbuntuでは普通にPrintScreenを押せば撮れる。

インストール

  • Ubuntu
    $ sudo apt-get install gimp
    
  • ArchLinux
    $ sudo pacman -S gimp
    

使い方

  1. GIMP起動
  2. 「ファイル」 -> 「画像の生成」 -> 「スクリーンショット」
    キャプチャ範囲などが選択できる。これでキャプチャするとすぐGIMPに取り込まれて編集可能になる。
  3. 「ファイル」 -> 「エクスポート」
    普通に「保存」だとxcf形式とかになってしまう。jpgなどにするにはエクスポートを選択。

動画(mp4/gif)

SimpleScreenRecorderを使う。
これでmp4形式などにできる。

SimpleScreenRecorderではなぜかgif形式での録画に失敗したので、いったんmp4で録画し、FFmpegで変換してgifにした。

インストール

公式のダウンロード方法に書いてある。

  • Ubuntu
    SimpleScreenRecorderは17.04以降では公式リポジトリに入っているようだが、それ以前では以下のようにPPA追加してからインストール。

    $ sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
    $ sudo apt-get update
    $ sudo apt-get install simplescreenrecorder
    # FFmpegを入れる場合は以下もやる
    $ sudo apt-get install ffmpeg
    
  • ArchLinux
    $ sudo pacman -S simplescreenrecorder
    # FFmpegを入れる場合は以下もやる
    $ sudo pacman -S ffmpeg
    

使い方

SimpleScreenRecorder

SimpleScreenRecorderはツールチップがわりと親切なので、それを参考に設定する。

  1. SimpleScreenRecorder起動
  2. キャプチャ範囲などの設定をする
    「任意の矩形を録画」を選択すれば、自由に矩形範囲を指定してキャプチャするか、ウィンドウをキャプチャするか選べる。
    ウィンドウをキャプチャするときは、ウィンドウ選択時にウィンドウの枠をクリックすると枠を含めたウィンドウ全体がキャプチャされる。内部をクリックすると枠はキャプチャされない。(ということがツールチップに書いてある。)
    解像度が高いときなどは動画サイズが大きくなってしまうので「映像をリサイズ」で小さくした方がいい。
  3. 保存場所・コンテナ・コーデックなどの設定をする
    コンテナはMP4などを選ぶ。
    「その他」を選ぶとgifやflvなどたくさん選択肢があるが、gifではなぜかうまく録画ができなかった。
    他はデフォルトにした。(コーデックはH.264、プリセットはsuperfast。)
  4. 録画
    「録画を開始」を押すかホットキー(デフォルトはCtrl + r)で開始。終了は「録画を中断」か同じホットキー。
    「録画を保存」するのを忘れない。

FFmpeg

SimpleScreenRecorderでgif形式にできなかったので、FFmpegでmp4をgifに変換する。

$ ffmpeg -i input.mp4 output.gif

サイズを小さくしたいときはフレームレートを変えるのがいいよう。
これはrオプションで数値指定。小さいほどフレームレートも小さい。
ffmpeg -i input.mp4 -r 5 output.gif のように使う。これでサイズを小さくできるが、当然カクつく。

参考

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でできてなかった?)

XPS13 (9343)にArchLinuxをインストールする –ISOイメージ作成編–

2015年の春に買ったNew XPS13 (9343)(もうNewでも何でもない)にWindows10をクリーンインストールした。そのときついでにArchLinuxをインストールし直したので、そのときのメモ。
作業直後に書くつもりだったが大分時間が経ってしまったため、怪しいところがあるかもしれない。
本当はインストール作業まで全部書く予定だったが、力尽きたので続きはまたいつか書く。

要点

  • 通常のArchLinuxのISOイメージにはXPS13用の無線LANアダプタのドライバが入ってないので、このISOではインストールが難しい
  • 必要なドライバは broadcom-wl-dkms
  • ArchLinuxのISOイメージは Archiso でカスタマイズできる

ArchLinuxをインストールしたPCを用意する

何を言っているのかわからないかもしれないが、XPS13にArchLinuxをインストールするためには、ArchLinuxをインストールしたPCが必要。なぜなら通常のArchLinuxのISOイメージにはXPS13の無線LANのドライバが入っていないため(ここ参照)、そのままインストールしようとしてもネットに接続できず詰む。 broadcom-wl-dkmsというドライバを含むようカスタマイズしたISOイメージを作る作業をしなければならない。
ただし、XPS13の内蔵無線LANアダプタを使わずに、たとえばUSB接続の有線LANアダプタを使う場合などはこの作業は必要ないはず。そのときもドライバなかったら詰む。
なお、PCを別に用意しなくとも、XPS13のWindowsでArchLinuxの仮想マシンを作って以下の作業をしてもいい。

ArchLinuxのISOイメージを作成する

普通はArchLinuxのダウンロードサイト一覧からISOイメージを持ってきて、USBメモリに dd すればいい。
そのはずなのにドライバが足りてないため、以下のようになる。ここに感謝。

  1. Archisoの環境作り

    これはArchLinuxのISOイメージを自作するためのツール。以下では ~/archlive 以下に作業ディレクトリを作ることにする。

    sudo pacman -S archiso
    mkdir ~/archlive
    sudo cp -r /usr/share/archiso/configs/releng ~/archlive
    cd ~/archlive/releng
    
  2. yaourtを使うための設定

    broadcom-wl-dkmsはAURというリポジトリにある。AURにあるパッケージはyaourtというツールを使うと操作しやすい。

    まず ~/archlive/releng/pacman.conf の最後に以下を追記して archlinuxfr リポジトリを使えるようにする。

    [archlinuxfr]
    SigLevel = Never
    Server = http://repo.archlinux.fr/$arch
    

    そして ~/archlive/releng/package.both の最後に以下を追記。

    yaourt
    
  3. broadcom-wl-dkms のための設定

    上で編集した ~/archlive/releng/package.both にさらに以下を追記。これでbroadcom-wl-dkmsをビルドする環境が整う。

    linux-headers
    dkms
    fakeroot
    

    さてここから詰まった。2015年にArchlinuxを入れたときは ~/archlive/releng/airootfs/root/customize_airootfs.sh

    sudo -u arch yaourt --noconfirm -S broadcom-wl-dkms
    

    を追記すれば問題なくビルドできた(…はず)。これをする理由は、yaourtはrootでは実行できないため。sudoでarchというユーザに切り替えてyaourtを実行し、broadcom-wl-dkmsをインストールしているわけ。ところがなぜか今回はarchというユーザがいなくなっていたようだ。
    仕方ないので、あまりうまくないやり方だが他に思いつかないので次のようにやる。 ~/archlive/releng/airootfs/root/customize_airootfs.sh の最後に追記する内容を以下のように変える。

    useradd arch # archユーザを追加
    echo "root:hoge" | chpasswd # こうすればrootのパスワードをhogeに変えられる
    sudo -u arch yaourt --noconfirm -S broadcom-wl-dkms
    

    ここではarchというユーザを追加したが、既にシステムに存在するユーザでないなら何でもいい。パスワードを上のように切り替える方法はここで知った。

  4. ビルド

    cd ~/archlive/releng
    sudo ./build.sh -v
    

    ビルドの際にrootのパスワードを聞かれるので、上で設定した通りhogeと入れる。そうすれば実行ユーザが一般ユーザarchに切り替わり、yaourtが進む。

    1回のビルドでうまくいかずやり直すときは

    sudo rm -v ~/archlive/releng/work/build_make_*
    

    でリセットしてからまたビルドする。

    ビルドすればISOイメージが ~/archlive/releng/out/ 下にできているはず。

  5. USBメモリにISOイメージを書き込む

    ここに書いてある通り。
    lsblk でデバイス一覧が見れるので、どのデバイスファイルがUSBメモリなのかを 注意深く確認するここで不適切なデバイスファイルを指定すると重要なデータを意図せず消してしまう恐れがあるので気を付ける 。 もしマウントしているようなら umount でアンマウントしておく。
    /dev/sdx がUSBメモリだとして

    sudo dd bs=4M if=~/archlive/releng/out/archlinux-2016.09.11-dual.iso of=/dev/sdx
    

    のようにやればいい。ファイル名は例。

参考