20191214のLinuxに関する記事は11件です。

diffでテキストファイルの違う行だけ表示したい

diff

diff data1.txt data2.txt

と普通に使うと

--- data1.txt
+++ data2.txt
@@ -1,4 +1,4 @@
 11111
-22222
+22225
 33333
-44444
+44445

のように内容が同じ行と違う行とが混じって表示されます。
行数が多い時にはちょっと見づらいなと思いました。

sed

同じ行の先頭は空白なので、sedでフィルタ(削除)します。

sed -e '/^ .\+/d'

「^ 」先頭が空白で始まる「.\+」任意の文字列をdで削除という意味です。

diffとパイプでつなぎます。

diff data1.txt data2.txt | sed -e '/^ .\+/d'

すると

--- data1.txt
+++ data2.txt
@@ -1,4 +1,4 @@
-22222
+22225
-44444
+44445

違う行だけになってスッキリしました。

最近Windows上でbusyboxを使い、シェルの勉強をしているんですが奥が深いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

virtiofsについて

この記事は2019年12月時点におけるvirtiofsの簡単な紹介です。

概要

公式サイト: https://virtio-fs.gitlab.io/

virtiofsはホストと(複数の)ゲストVM間でディレクトリを共有するための新しいファイルシステムで、redhatのエンジニアを中心に開発されています。

主なユースケースとしては、まず軽量VM(kata-containerなど)のルートファイルシステムにvirtiofsを使うことが挙げられます。ゲストへの不要なファイルコピーを削減することによりブート時間が短縮される等の利点があります。また他のユースケースとして、ゲストからファイルシステムの詳細が隠蔽されることも挙げられます。ゲストからは共有されているディレクトリのファイルシステムの詳細は見えないので、例えばネットワークファイルシステムのIPやセキュリティ等の設定をゲストで気にする必要がなくなります。

ホストとゲスト間でディレクトリを共有する方法としてNFSや9pfsなどのネットワークファイルシステムが既にあります。しかしこれらはネットワークスタック/プロトコルを利用しており、仮想環境(同一マシンに存在するホストとゲストの通信)の利用に最適化されているわけではありません。またネットワークファイルシステムのsemanticsはローカルファイルのsemanticsと異なる面が多くあり、(ゲストの)アプリケーションの挙動が影響を受ける場合があります。

virtiofsではこれらの問題を改善すべく、(1) IO性能が高く、(2) ゲストに対してローカルファイルシステム同様のsemanticsを提供するファイルシステムであることを目的としています。そしてこれを実現するため、ネットワークスタックに依存がなく、かつlinux VFSのインタフェースに近いFUSEプロトコルをベースに(一部拡張して)開発が行われています1

通常のFUSEファイルシステムではユーザー空間で動くファイルシステムデーモンがkernelからFUSEリクエストを受け取り、リクエストに沿った処理を行います。virtiofsではデーモンがホスト(のユーザー空間)に存在し、ゲストからFUSEリクエストを受け取り、必要に応じてホストのファイルシステムとやり取りを行います。なおゲストとデーモン間のやりとりはDPDKやSPDKと同様にvirtio vhost-userにより行われます2

virtiofsについては公式のdesign documentやメイン開発者によるkvm forum 2019のスライド等も参照して下さい。

status

virtiofsを利用するためにはlinuxおよびqemuの対応が必要です。現時点(2019/12)の状況ですが、基本機能の開発は概ね完了しており、kernelパートはLinux 5.4でマージされています(ただし後述するDAXの機能はまだ含まれていません)。一方でqemu側はvhost-user-fs-pciのコードは4.2でマージされたものの、デーモンのコードは現在レビュー中となっています。Linux+qemuで実際に動かしてみたいという方は公式サイトの説明を参照してください。

一方、kata-containerのvirtiofs対応はすでに活発に行われており、experimentalではあるもののv1.7からvirtiofsを使用することができます。簡単に動くのでその方法を次に説明します。

kata-containerでの利用方法

とりあえず現時点で簡単にvirtiofsを試すにはkata-containerを使うことです。実際にコンテナのrootfsとして共有ディレクトリが使用されていることを確認してみます。

※ 以下はkata-container v1.9での挙動です。繰り返しになりますがexperimentalのため今後色々と変更があると思います。事実すでにkata-containerに使用されているvirtiofsとupstreamにマージされたvirtiofsを比較するとマウントオプション等に違いがあります

インストールとコンテナの立ち上げ

まず最新版のkata-containerをkata-deployコマンドを使用してインストールします (/opt/kata以下にファイルが置かれます):

# docker run --runtime=runc -v /opt/kata:/opt/kata -v /var/run/dbus:/var/run/dbus -v /run/systemd:/run/systemd -v /etc/docker:/etc/docker -it katadocker/kata-deploy kata-deploy-docker install

あとはdockerのruntimeにkata-qemu-virtiofsを指定するだけでvirtiofsが使用されます:

# docker run --runtime=kata-qemu-virtiofs -it busybox

コンテナの中でmountを確認してみると、ルートファイルシステムにvirtiofsが使用されていることがわかります3:

(container内)
/ # mount -t virtio_fs (注: upstreamの版ではvirtio_fsではなくvirtiofsになっています)
kataShared on / type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax)
kataShared on /etc/resolv.conf type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax)
kataShared on /etc/hostname type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax)
kataShared on /etc/hosts type virtio_fs (rw,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,dax)

いくつかの設定ファイルもマウントされているように見えますが、これはbind mountされているためです。

ホストのプロセスを確認するとvirtiofsデーモン(virtiofsd)が起動していることがわかります:

(host内)
$ pgrep -a virtiofsd
13154 /opt/kata/bin/virtiofsd --fd=3 -o source=/run/kata-containers/shared/sandboxes/<container ID> -o cache=always --syslog -o no_posix_lock -f

ここでsourceに指定されているディレクトリがvirtiofsで使用する共有ディレクトリになります。

共有ディレクトリの確認

実際にホストとゲストでディレクトリが共有されていることを確認します。

まず、ホストにおいてsourceに指定されているディレクトリを見てみます:

(host内)
# ls /run/kata-containers/shared/sandboxes/<container ID>
<container ID>
<container ID>-resolv.conf
<container ID>-hosts
<container ID>-hostname

# ls /run/kata-containers/shared/sandboxes/<container ID>/<container ID>
rootfs

# ls /run/kata-containers/shared/sandboxes/<container ID>/<container ID>/rootfs
bin  dev  etc  home  mnt  proc  root  sys  tmp  usr  var

共有ディレクトリの直下にはいくつかの設定ファイルがあり、更にもう一つのcontainer IDのディレクトリの下にrootfsがあることがわかります4

このディレクトリの内容がゲストと共有されているため、実際にゲストで適当なファイルを作成するとその内容がホストから読めることが確認できます。

(container内)
/ # echo abc > XXX 
/ # ls
XXX   bin   dev   etc   home  mnt   proc  root  sys   tmp   usr   var
(host内)
# ls /run/kata-containers/shared/sandboxes/<container ID>/<container ID>/rootfs
XXX   bin   dev   etc   home  mnt   proc  root  sys   tmp   usr   var
# cat /run/kata-containers/shared/sandboxes/<container ID>/<container ID>/rootfs/XXX
abc

この逆にホストからファイルを作った場合もゲストから読むことができます。

DAXについて

virtiofsの目標の1つは高いIO性能を実現することですが、このための機能の1つがDAXです。DAXはDirect Accessの略でよく不揮発メモリの文脈で使用される言葉です5。ただしvirtiofsのDAXは実際の不揮発メモリは関係がなく、ゲストがゲストのページキャッシュを使用せずにホストメモリにアクセスすること = (複数の)ゲストとホストでホストメモリ(ページキャッシュ)を共有する、という意味です。データがメモリ上にある場合はゲスト-ホスト間のコミュニケーションは一切ないため性能が向上します。またページキャッシュを共有することでデータの変更が即座に他のゲスト/ホストに見える(ローカルファイルのsemanticsと同じ)という利点やメモリ使用量が減るという利点もあります。

DAXの仕組みについてざっくりと説明します。まずvirtioを使用するためにはqemuの起動時にvirtioデバイスを加える必要がありますが、これはゲストからはPCIとして認識されます6。そしてPCIにはそのデバイスのメモリ領域を示すBARという制御レジスタがあります。DAXの機能はこのBARから見えるメモリ領域にデータをmmapしてアクセスすることで実現します7。当然ながら領域のサイズは限られているので、どのデータをBAR空間のどこにmap/unmapするのかをvirtiofsで制御します(DAX windowと呼んでいます)。またこのためにmap/unmapする領域をリクエストするためのFUSEプロトコルも追加されています。

なおkernel 5.4にマージされたvirtiofsにはまだDAXサポートの機能は入っていないので、この機能を試したい人は開発ブランチを使用して自分でコンパイルするか、kata-containerを使用してください (kata-container版のvirtiofsには既に組み込まれています)。

さいごに

qemuにマージ予定のvirtiofsデーモン(virtiofsd)はCで実装されていますが、当然ながら別の実装も可能です。実際、rust(crosvm)によるデーモンの実装も行われています8。またあまり詳しい情報は見つかりませんでしたが、すでにvirtiofsとSPDKを組み合わせて使用する方法を考えている人もいるようです9。upstreamにコードがマージされてきているので、来年はvirtiofsの利用ケースも増えていくのではないかと思います。


  1. FUSEには長年の実績があるという利点もあります。 

  2. vhost-userについて大雑把に説明をすると、初期化等の制御処理はqemuを介して行うものの、データのやり取りについては共有メモリ上に作成されたvirtqueueを利用することでqemuを介さずにゲストとホストユーザー空間上のプロセス(ここではvirtiofsデーモン)がやり取りできるという仕組みです。vhost-userがでてきた背景などについては例えばこの記事のシリーズが参考になります 

  3. runtimeにkata-qemuを使用すると従来の9pfsが使用されていることがわかります 

  4. 共有ディレクトリ直下がそのままゲストに見えていないのはpivot_rootしているためでしょう 

  5. ページキャッシュを利用せずにデバイスへ直接アクセスすること 

  6. virtiofsではvhost-user-fs-pciというデバイスをqemuの起動オプションに加えることで、ゲストがvirtiofsが利用できることを認識します。 

  7. なおこの領域はゲストからは不揮発デバイスのように見えているので、kernelコードはDAXのコードを利用します 

  8. git commit 

  9. Introduction of SPDK Vhost-fs target to accelerate file access in VMs and containers, SDC 2019 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本番で使っているサーバを破壊して孤立させた話

新卒のときに本番サーバ破壊したので備忘録として残しておこうかと思います。

もう結構前の話なので一部おかしいかもしれないですが、本筋は間違っていないのでご容赦ください:bow:

背景とか

やらかしがあったのは新卒研修のときでした。

私の会社は物理サーバからウェブのフロントまで幅広く扱う会社で、研修にも一通りの業務に触れられるようにカリキュラムが組まれていました。

事件が起きたのはサーバのラッキングやネットワークの研修・構築が終わり、次はホストの中身を構築しているときでした。

時は静かに訪れる...

研修用のホストにOSをインストールした後、色々パッケージをインストールしたりコンフィグを流し込もうとしている時です。

当時の私は、持ち前のめんどくさがりを発揮し、必要なデータを開発用の共用サーバで取ってきたあと、chmodで編集可能な状態に書き換えてからホストにデータを送っていました。

ちょうど下のような感じです。

sudo wget hogehoge
cd /path/to/package/directory
sudo chmod -R 777 ./
nano ./path/to/config
sudo scp /hoge/fuga hoge-user@hoge:/home/hoge/dest/
...

あとは察しがつくかもしれないですが、何度もやっているうちに下のように実行してしまったのです。

...
cd /path/to/package/directory
sudo chmod -R 777 /

気づき始め

最初は何も結果が帰ってこなかったことから、実行が遅いだけかな?と思っていました。
しかしコンソールを眺めていたときに事の重大さに気づきました。

chmodの対象ディレクトリにrootを指定しているじゃん?

急いでctrl + c、影響範囲の確認。

接続しているコンソールはそのまま残し、別のシェルを起動。
対象サーバにつなごうとしましたが、もちろん繋がりませんでした。
sshのconfigのpermissionが怒られる...
接続されているやつでsshのconfigを戻そうと試みるもpermissionが無いと怒られる...

slackを見ると共用サーバの他のユーザでもコマンドが通らなくなったという話が出始め、やらかしたと悟りました。
使っていたサーバは本番環境の構築にも使っていたのです。
隣に担当のチームの方(上司)がいたので速攻でSOSを出しました。

事の顛末

報告後、速やかに関連する人達に確認。

最終的にはスナップショットからロールバックし、事無きを得ました。
開発用サーバなのでお客様に影響なく事態はすぐに収束。

惨劇はなぜおこってしまったのか

自分がどっかでミスっていたのか、自身のユーザのホームディレクトリがroot権限じゃないと書き換えられない状態で放置していたのは失敗でした。
その影響でwgetやchmodなどでroot権限を使う必要が発生し、結果的に事故に繋がりました。

二度と惨劇を起こさないためにどうしたのか

root権限の必要がない作業ではroot権限を使わない/使えないようにサーバの構成を変更しました。
それ以降は事件を起こしていません...

話のオチ

研修の担当チームにだいぶ迷惑をかけ、時分自身も反省しました。
その縁か、研修後はその担当と同じチームに配属され今は仲良く仕事しています。

みなさんもchmodする時は気をつけましょう...

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntuのコア部分のみインストールしてみる

この記事は「Linux Advent Calendar 2019」の22日目の記事です。

Ubuntuの最小限な環境について

Ubuntuをインストールすると、もれなく色んなものがついてくる。
デスクトップ環境はもちろんのこと、

  • ファイルマネージャー
  • Firefox
  • gedit
  • Thunderbird

などなど…
今回はそれらをすべてインストールすることなく、本当にUbuntuのコアの部分だけをVirtualBoxにインストールしてみる。

用意するもの

  • VirtualBoxをインストールしたPC
  • ネットワーク環境

さっそくインストール

1. ダウンロード

  1. ダウンロードページにアクセスする。
  2. [jp.ubuntu.comのダウンロードページへ]をクリックする。
  3. スクロールしていくと、[その他のダウンロード方法]とあるので、それをクリックする。
  4. [Network installer]から好きなバージョンをクリックする。
    • 今回は「18.04 LTS」を選択。
  5. アーキテクチャの選択が出てくるので、自分の環境に合わせて選択する。
    • 今回は「32-bit Intel/AMD (x86)」を選択1
  6. いくつかファイルやフォルダが出てくるが、[mini.iso]をクリックしてダウンロード

今回のUbuntu18.04 LTS (i836)のmini.isoはこちら

VirtualBoxのセットアップからは、全て書いているときりがないので、大事そうなところを書いていく。

2. VirtualBoxセットアップ

名前とオペレーティングシステム

名前は仮想マシン名なので自分のお好みで良いが、タイプとバージョンはちゃんと指定しなければ動かない。

項目名 選択内容
タイプ Linux
バージョン Ubuntu (64-bit)

fig1.png

メモリーサイズ・ハードディスク

今回のような最小インストールの起動条件は、公式に記載されていない。似たような環境で、Ubuntu Serverがあるので、それの起動条件に従っておけば概ね問題ない。ちなみに、Ubuntu Server 18.04 LTSの起動条件は以下の通り。

CPU メモリ ディスク領域
1GHz以上(64bit) 1GB以上 5GB以上

CPUとメモリはこのサイトから。ディスク領域は、自分で一度インストールして「これくらいは必要だな」と思った数値。

インストールディスクの挿入

先ほどダウンロードしたmini.isoを、仮想の光学ドライブに入れておく。

  1. [設定]をクリック。
  2. [ストレージ]をクリック。
  3. 「空」と記載された箇所をクリックし、右端の円盤マークをクリックして[仮想光学ディスクファイルを選択]をクリック。 fig2.png
    • 先程ダウンロードしたmini.isoを選択。
  4. [OK]をクリック。

3. インストール

キーボードの設定

  1. キーボードレイアウトを自動検出するか聞かれるが<いいえ>を選択。 fig3.png
  2. キーボードの国について聞かれるので、[Japanese]を選択。 fig4.png
    • USキーボードは[English(US)]を選択してください。
  3. キーボードレイアウトを聞かれるので、[Japanese]を選択。 fig5.png
    • Macの方も[Japanese]を選択する。[Japanese - Japanese (Macintosh)]を選択すると、以後かな入力しかできなるのでご注意!

ディスクのパーティショニング

  1. ここの選択は、[ガイド - ディスク全体を使う]で良い。 fig6.png
    • LVMは、複数のハードディスクやパーティションを1つのディスクとして扱うことのできるディスク管理機能2。今回はディスクが1つしかないので関係ない。
  2. パーティショニングするディスクの選択が出てくるが、先程VirtualBoxで作成した仮想ハードディスクのみ出てくるので、それを選択。 fig7.png
  3. ディスクの書き込み確認が出てくるので、<はい>を選択すれば、ベースシステムのインストールが始まる。 fig8.png

ソフトウェアの選択

この記事の肝となるところ。他にどのようなソフトウェアをインストールするか聞かれる。ここで何も選択せずに<続ける>を選択すれば、コア部分のみのUbuntuが出来上がる。
fig9.png

ハードディスクへのGRUBブートローダーのインストール

GRUBブートローダーのインストールをしてよいか聞かれるので、<はい>を選択する。これをインストールしないと、せっかくインストールしても起動することができない。
fig10.png

インストール完了

最後の設定。

  1. システム時刻をUTCにするか聞かれるので、特にシステム時刻にこだわりがなければ<はい>で良い。
    fig11.png

  2. インストール完了したから、インストールディスクを抜けと言われるので、VirtualBoxの設定から取り出す。
    fig12.png

    • ディスクの取り出し(VirtualBox)
      1. [設定]をクリック。
      2. [ストレージ]をクリック。
      3. 「mini.iso」と記載された箇所をクリックし、右端の円盤マークをクリックして[仮想ドライブからディスクを除去]をクリック。

最後に<続ける>を選択して再起動すれば、インストールは完了。
おつかれっした。

いよいよ起動

インストール完了でディスクを取り外し、<続行>を選択すると、再起動され、インストールされたUbuntuが立ち上がる。
fig13.png
この画面が出たら、インストール時に設定したユーザ名を入力。
fig14.png
続いてパスワード。
fig15.png
ログイン完了。色々出てくるがこの初回のみ。

インストール後のトラブル対処

1. 起動時に「*ERROR* Failed to send log」が出る問題

おそらくデフォルトの設定で使い始めると、ログイン時にこんなのが出てくる。
fig16.png
運用していく上で問題ないが、なんか気持ち悪い。

解決方法

一旦Ubuntuはシャットダウンしておく。
1. [設定]を開く。
2. ディスプレイ内の「グラフィックコントローラ」を[VBoxSVGA]にする。
fig17.png

設定後

fig13.png
文句なし。

2. 「◆」が出る問題

使用していると、文字が「◆」になって、何が何だか分からなくなる。

fig18.png
とまぁ、こんな感じに。

解決方法

  1. ホームディレクトリにある、.bashrcを開nanoか何かで開く。

    nanoで開くなら
    nano ~/.bashrc
    
  2. 末尾に以下を追加して保存する。

    ~/.bashrc
    #Fix diamond character.
    case $TERM in
    linux) LANG=C ;;
    *)     LANG=ja_JP.UTF-8;;
    esac
    
    • nanoで保存する場合は、Ctrl+OY
  3. .bashrcを反映させる。

    sourceコマンド
    source ~/.bashrc
    

設定後

fig19.png
良いね。

ちなみに、インストール時に言語を英語にしておけば、これに遭遇することはない。日本語でインストールしても、CUIはどのみち英語なので、英語でインストール進めてもいいかもしれない。

まとめ

可変サイズのvdi形式でインストールした結果、仮想ハードディスクの容量が3.5GB弱ですんだ。容量が多く食われることが大っ嫌いな自分にとってはすごい嬉しいインストール方法だった。ちなみにUbuntuでdf -BMを叩くと、2.5GB程度使っていることになっていた。

※このあたりは人によって差異が出るかも。

Ubuntuをインストールしてもターミナルしか使わないよって人はこれで十分だと思う。少なくとも自分はこれで満足。


  1. 「 64-bit Intel/AMD (x86_64)」をインストールすると、言語選択で日本語を選択したときにインストール過程でループ現象が起きてしまう。 

  2. https://tech.nikkeibp.co.jp/it/article/Keyword/20071012/284413/ 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

スマホでVPN接続してサーバーをOFF/ON

これは、
サーバーにVPN接続、サーバーの電源OFF/ONを、全てスマホ(Android)でやりました。
というだけの事です。
滅多にやらないので、手順の備忘です。

事情

休日にサーバーの電源をOFF/ONしなければならない時があります。
(建屋の電源の工事とか検査とか)

働き方改革

そもそも、サーバーがオンプレミスなのが悪いのですが、
休日に仕事場には行きたくありません。
なので家からVPN接続して操作するのですが、
外出中に対応しなければならない時があります。
家族で出かけているのに、仕事でPCを持ち歩くのは、時代に逆行しています、家族に何か言われそうです。

なので、スマホで全て操作してみました。

OFF

UTMメーカー謹製のスマホアプリでVPN接続
ConnectBotでサーバーにSSH接続
su - 成り上がり
shutdown -h now

ON

UTMメーカー謹製のスマホアプリでVPN接続
サーバーのリモートマネージメント機能
(サーバーが起動していなくても、電源ON/OFF出来る機能)
で、サーバーの電源ON

結果

ログインパスワードのセットが、スマホだとイライラしますが、
出先の美味しいものを調べるふりをすれば、何をしているか家族にバレません。
平和が一番です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

スマホでVPN接続してサーバーの電源OFF/ON

サーバーにVPN接続、サーバーの電源OFF/ONを、全てスマホ(Android)でやりました。
というだけの事です。
滅多にやらないので、手順の備忘です。

事情

休日にサーバーの電源をOFF/ONしなければならない時があります。
(建屋の電源の工事とか検査とか)

働き方改革

そもそも、サーバーがオンプレミスなのが悪いのですが、
休日に仕事場には行きたくありません。
なので家からVPN接続して操作するのですが、
外出中に対応しなければならない時があります。
家族で出かけているのに、仕事でPCを持ち歩くのは、時代に逆行しています、家族に何か言われそうです。

なので、スマホで全て操作してみました。

電源OFF

UTMメーカー謹製のスマホアプリでVPN接続
ConnectBotでサーバーにSSH接続
su - 成り上がり
shutdown -h now

電源ON

UTMメーカー謹製のスマホアプリでVPN接続
サーバーのリモートマネージメント機能
(サーバーが起動していなくても、電源ON/OFF出来る機能)
で、サーバーの電源ON。

結果

ログインパスワードのセットが、スマホだとイライラしますが、
出先の美味しいものを調べるふりをすれば、何をしているか家族にバレません。
平和が一番です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux(Ubuntu)で、Trackpadをチューニングして、3本指スワイプに機能を設定したりする

Ubuntu19.10を使用して、3本指スワイプに機能をもたせるまでの記録です。
達成したことは以下の通りです。

  • Logicool T650 トラックパッドで使用するドライバを変更した
  • 2本指スクロールのスクロール量を調整した
  • 3本指スワイプに、デスクトップ移動の機能を割り当てた

使用するドライバを設定する

Ubuntu19.10を使用しています。
LinuxでTrackpadを使うには以下の3つのドライバがあります。

  • Synaptic
  • mtrack
  • libinput

今どれが使われているか知るには、xinputコマンドを使います。
xinput listで認識しているデバイスの名前をしらべ、xinput list-prop <device name or id>で表示できます。

$xinput list
⎡Virtual core pointer                     id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech Rechargeable Touchpad T650       id=12   [slave  pointer  (2)]

$xinput list-props 'Logitech Rechargeable Touchpad T650'                                                
Device 'Logitech Rechargeable Touchpad T650':
    Device Enabled (154):   1
    Coordinate Transformation Matrix (156): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Accel Profile (286): 0
    Device Accel Constant Deceleration (287):   1.000000
    Device Accel Adaptive Deceleration (288):   1.000000
    Device Accel Velocity Scaling (289):    25.000000
    Trackpad Disable Input (290):   0
    Trackpad Sensitivity (291): 1.000000

Synaptic、libinputの場合には、そのモジュールの名前の設定名があるため、判別できます。mtrackの場合には、Trackpadと表示されます。

特定のドライバを有効化するには、ドライバをインストール後に/usr/share/X11/xorg.conf.d/に初期設定が格納されるため、これを/etc/X11/xorg.conf.d/にコピーします。

$ls /usr/share/X11/xorg.conf.d/                                                                         
10-amdgpu.conf  10-quirks.conf  40-libinput.conf  51-synaptics-quirks.conf  70-wacom.conf
10-nvidia.conf  10-radeon.conf  50-mtrack.conf    70-synaptics.conf

$cp /usr/share/X11/xorg.conf.d/50-mtrack.conf /etc/X11/xorg.conf.d/                                                                               

$ls /etc/X11/xorg.conf.d/                                                                               
50-mtrack.conf

これで、ログインログアウトを行うと目的のドライバが有効化されます。

ドライバの設定を変えるためには、/etc/X11/xorg.conf.d/Optionの項目を書き換えるか、xinput set-props <device name> <prop> <value>を使います。
confは永続化する目的に使用でき、xinput set-propsはアドホックに設定をすることに使うことができます。

ただし、confファイルと、xinput list-propsでの設定名は一致しません。
おおよそ同じ名前の設定名ですが、対応表はないため、それっぽいものを選ぶしかないようです。

Xorgのスクロール事情

現状Xorgのスクロールは、ボタン5、ボタン6として動作しています。
よって、スクロールは移動量ごとにボタン5、ボタン6を何回押したかどうかで実現されているようです。

Synapticsでは慣性スクロールが実現されていますが、
スクロールボタンを押す頻度を調整して実現されているようです。

libinputは、きちんとどのくらい移動したかを伝えていますが、
その仕様をまもるために、スクロール量を調整する仕様を持っていません。
現状GNOME3もスクロール量を取り扱っていないようです。

それぞれの特徴

Synaptics

Synapticsはすでにメンテナンスモードに入っており、今後機能がアップデートされる予定はないそうです。
しかし、唯一慣性スクロールをサポートしており、macOSになれた人には非常に使いやすく感じます。
ただし、3本指Swipeは動作しません。

https://wiki.archlinux.jp/index.php/Synaptics_%E3%82%BF%E3%83%83%E3%83%81%E3%83%91%E3%83%83%E3%83%89

設定項目の一覧はmanから確認できます。

https://linux.die.net/man/4/synaptics

操作してみて、カクカク動く感じがあり、慣性スクロールは気持ちよいですが、自由に使える感じはしませんでした。

mtrack

mtrackは、3本指スワイプ、4本指スワイプも機能として持っています。
2本指スクロールもクイックに動作します。
ただし現在はメンテナンスされていないようです。
設定項目はすべてこのgithubのREADMEにかかれています。

https://github.com/BlueDragonX/xf86-input-mtrack

スクロール量や移動スピードも調整可能なため、古いですが非常に有効です。

libinput

現在も開発の続いているライブラリです。可能であればこちらを使うのが良いと思われます。

https://wayland.freedesktop.org/libinput/doc/latest/index.html

設定項目は以下に記載があります。

https://www.mankier.com/4/libinput

3本指スワイプはサポートされていませんが、libinput-gesturesをインストールすることで使うことができます。
前節の理由からスクロール時の移動量は設定することができません。

結局どれを使えばよいか。

libinput+libinput-gesturesを使って十分ならば、それで良いと思います。
libinputで、スクロールの量をチューニングしたい場合には、mtrackを使うことができます。

筆者は、2019年12月時点で、mtrackを使用しています。
以下が使用している設定ファイルです。

Section "InputClass"
    MatchIsTouchpad "true"
    Identifier "Multitouch Touchpad"
    Driver "mtrack"
    Option "ScrollDistance" "30"
    Option "ScrollUpButton" "5"
    Option "ScrollDownButton" "4"
    Option "SwipeDistance" "200"
    Option "TapDragEnable" "false"
EndSection
  • ScrollDistance 30 2本指スクロールでのスクロール量を調整量
  • ScrollUp/DownButton 5/4 入れ替えることで、ナチュラルスクロールに変更
  • SwipeDistance 200 3本指スワイプの感度の閾値(初期値700)
  • TapDragEnable false タップでドラッグする機能を無効化する

3本指スワイプに機能を割り振る

マウスのキーから、デスクトップの移動を行いたいと思います。
そのためには、以下の手順を取ります。

  • mtrackでSwipeにマウスのボタンを割り振る
  • xbindkeysで、マウスのボタンから、コマンドを実行できるようにする
  • xdotoolsで、コマンドからキーボードのキー(Super+Mなど)を送る
  • キー(Super+M)を、デスクトップ移動のキーボードショートカットに設定する

mtrackでは、3本指スワイプは8~11ボタンに割り振られています。

xbindkeysで、xdotoolsのコマンドを実行するには、以下のような~/.xbindkeysrcを作成します。

"xdotool key Super_R+m"
b:8+Release
"xdotool key Super_R+comma"
b:9+Release
"xdotool key Super_R+s"
b:10+Release

xbindkeysを常駐させるには、コマンドxbindkeys_autostartを実行されるように組みます。
最後に、Gnomeのキーボードショートカットの設定で、Super+M、Super+,、Super+sに必要な機能を割り当てます。

Trackpadを使って、スクロール量を調整したり、3本指スワイプに機能を割り振ることができました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

linux版 nodeとnpmとprettier

まず確認

Nodejs
ローカルでもjavascriptを使えるようにしたもの
npm
パッケージ管理
n 
Nodejsのバージョン管理

aptからインストール

インストール先: /usr/bin/

sudo apt install nodejs npm

npmでnをインストール

インストール先: /usr/local/bin/

sudo npm instal -g n

n

nでインストールされるNodeの場所は以下になります。
/usr/local/bin/

インストール可能なバージョンを調べる

最新の20件取得
n lsr

すべて取得
n lsr --all

nodeインストール&削除&バージョン切り替え

インストール
sudo n バージョン

インストール済みNodejs一覧
n ls

バージョン切り替え
sudo n バージョン

削除
n rm バージョン

ヘルプ

npm help npm
n help

npm

npm本体

バージョン一覧
npm info npm versions

アップデート
sudo npm update -g npm

インストール&ダウングレード
sudo npm install -g npm@バージョン

パッケージ(モジュール)管理

package.jsonをつくる

npm init 
or 
npm init -y

ローカル
プロジェクト/node_modulesにインストール

npm install パッケージ名

グローバル
/usr/local/bin/npm/node_modulesにインストール

sudo npm install -g パッケージ名

開発環境
・インストールはローカルと同じ
・gitなどで管理する時は必須
・本番環境と開発環境を区別したい場合
・package.jsonの[devDependencies]に追記される。

sudo npm install --save-dev パッケージ名

package.json通りにすべてインストール

npm install

依存関係を満たすようにインストール

npm ci

依存の問題は必ずぶつかる壁なので、頭の片隅に置いといてください。npm lsするとよくerr missingがます。これは依存してるパッケージをインストールして欲しい、というお願いです。
ちなみに、package.json通りにインストールしたときに、生成されるのがpackage-lock.jsonですが、lockファイルに依存パッケージが全て記載されています。助かりますね。こちらの記載どおりにインストールしてくれるコマンドがciコマンドです。
`

パッケージのインストール場所確認

ローカル
npm root
グローバル
npm root -g

Prettier

最近はやっているフォーマッター 

ローカル
npm install prettier -D

※しかし、これだけではまだ使えない。そこで次のやり方をします。

とても参考になったパスの通し方

ローカル環境にあるツールをバージョン毎に使い分けるnpmにもってこいのテクニックだと思います。
プロジェクトのあるパスのモジュールを参照する必殺技でもなんでもないなんの変哲のない相対参照(./)を使うやり方です。

export PATH=$PATH:./node_modules/.bin
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

linux版 nodeとnpmをインストール

まず確認

Nodejs ローカルでもjavascriptを使えるようにしたもの
npm パッケージ管理
n Nodejsのバージョン管理

aptからインストール

インストール先: /usr/bin/
sudo apt install nodejs npm

npmでnをインストール

インストール先: /usr/local/bin/
sudo npm instal -g n

n

nでインストールされるNodeの場所は以下になります。
/usr/local/bin/

インストール可能なバージョンを調べる

最新の20件取得
n lsr

すべて取得
n lsr --all

nodeインストール&削除&バージョン切り替え

インストール
sudo n バージョン

インストール済みNodejs一覧
n ls

バージョン切り替え
sudo n バージョン

削除
n rm バージョン

ヘルプ

npm help npm
n help

npm

npm本体

バージョン一覧
npm info npm versions

アップデート
sudo npm update -g npm

インストール&ダウングレード
sudo npm install -g npm@バージョン

パッケージ(モジュール)管理

package.jsonをつくる
npm init

ローカル
プロジェクト/node_modulesにインストール
npm install パッケージ名

グローバル
/usr/local/bin/npm/node_modulesにインストール
sudo npm install -g パッケージ名

開発環境
・インストールはローカルと同じ
・gitなどで管理する時は必須
・本番環境と開発環境を区別したい場合
・package.jsonの[devDependencies]に追記される。
sudo npm install --save-dev パッケージ名

package.json通りにすべてインストール
npm install

パッケージのインストール場所確認
ローカル
npm root
グローバル
npm root -g

Prettier

最近はやっているフォーマッター 
ローカルインストール
npm install prettier -D

※しかし、これだけではまだ使えない。そこで次のやり方をします。

とても参考になったパスの通し方

ローカル環境にあるツールをバージョン毎に使い分けるnpmにもってこいのテクニックだと思います。
プロジェクトのあるパスのモジュールを参照する必殺技でもなんでもないなんの変哲のない相対参照(./)を使うやり方です。

export PATH=$PATH:./node_modules/.bin

とても気に入ったので、
これ ./ を
今日から執拗に使っていこうかなと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails sがうまくいかない時の対応

rails sでサーバーを立ち上げた後、Ctrl + Cで終了せずにターミナルを終了しちゃったりすると、次回起動時に以下のようなエラーが発生します。

$ rails s
=> Booting Puma
=> Rails 5.0.4 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
A server is already running. Check プロジェクト名/tmp/pids/server.pid.
Exiting

対処方法

$ lsof -ni tcp:3000
COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    77464 d0ne1s   20u  IPv4 0xe8bde147dfa7a793      0t0  TCP 127.0.0.1:hbci (LISTEN)
ruby    77464 d0ne1s   22u  IPv6 0xe8bde147d9f527d3      0t0  TCP [::1]:hbci (LISTEN)

$ kill -9 77464

lsof:オープンしているファイルを一覧表示するコマンド
-n:IPアドレスを表示する(名前解決しない)
-i:ポート番号やプロトコルを指定する

kill:プロセスを終了する
-9:強制終了

参考

Rails sのプロセスが切れない時
【 lsof 】コマンド――オープンしているファイルを一覧表示する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】error Couldn't find the binary gitが出た時の対処法

error Couldn't find the binary gitが出たDockerfileのソースコード

Nuxt.jsで開発したアプリから、Dockerのイメージを作成した時に「error Couldn't find the binary git」というエラーが起きました。

実際にエラーが起きたDockerfileのソースコードは以下です。

FROM node:10.15.1-alpine as builder
WORKDIR /app
COPY . /app
RUN yarn install --production
RUN yarn build

FROM node:10.15.1-alpine
WORKDIR /app
COPY --from=builder /app /app
CMD ["yarn", "start"]

※Dockerfileの作成方法もまとめているので参考にしてもらえると嬉しいです。

参考:https://qiita.com/arthur_foreign/items/fca369c1d9bde1701e38

Dockerイメージ作成時のエラーログ

エラーログは以下のような感じです。(GCRにイメージをPUSHする想定でした)

$ docker build -t gcr.io/${PROJECT_ID}/app_name:v1 .
Sending build context to Docker daemon  157.9MB
Step 1/9 : FROM node:10.15.1-alpine as builder
 ---> xxxxxxxxxx
Step 2/9 : WORKDIR /app
 ---> Running in xxxxxxxxxx
Removing intermediate container 0eb38e4dfdc1
 ---> xxxxxxxxxx
Step 3/9 : COPY . /app
 ---> xxxxxxxxxx
Step 4/9 : RUN yarn install --production
 ---> Running in xxxxxxxxxx
yarn install v1.13.0
[1/4] Resolving packages...
[2/4] Fetching packages...
error Couldn't find the binary git
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
The command '/bin/sh -c yarn install --production' returned a non-zero code: 1

タイトルや見出しにも書いてる通り、error Couldn't find the binary gitというエラーが発生していますね。

error Couldn't find the binary gitの原因

ちょうど同じエラーがteratailに掲載されていました。

参考:https://teratail.com/questions/179483

teratailのベストアンサーや解決の報告を見るにGitでこけているようですね。

error Couldn't find the binary gitの解決方法

おそらく、teratailはローカルの操作なのでDockerfileにも合わせていきましょう。

Dockerでうまくいかないということは、alpineのパッケージマネージャであるapkにGitを入れる必要があります。

そのため、Dockerfileを以下のようにしましょう。

FROM node:10.15.1-alpine as builder
WORKDIR /app
COPY . /app
RUN apk update && \
    apk add git
RUN yarn install --production
RUN yarn build

FROM node:10.15.1-alpine
WORKDIR /app
COPY --from=builder /app /app
CMD ["yarn", "start"]

すると、Dockerイメージの作成に成功します。

Successfully built xxxxxxxxxxxx
Successfully tagged gcr.io/gke_project_name/app_name:v1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む