- 投稿日:2019-12-14T21:13:26+09:00
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を使い、シェルの勉強をしているんですが奥が深いです。
- 投稿日:2019-12-14T19:51:16+09:00
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の利用ケースも増えていくのではないかと思います。
FUSEには長年の実績があるという利点もあります。 ↩
vhost-userについて大雑把に説明をすると、初期化等の制御処理はqemuを介して行うものの、データのやり取りについては共有メモリ上に作成されたvirtqueueを利用することでqemuを介さずにゲストとホストユーザー空間上のプロセス(ここではvirtiofsデーモン)がやり取りできるという仕組みです。vhost-userがでてきた背景などについては例えばこの記事のシリーズが参考になります ↩
runtimeにkata-qemuを使用すると従来の9pfsが使用されていることがわかります ↩
共有ディレクトリ直下がそのままゲストに見えていないのはpivot_rootしているためでしょう ↩
ページキャッシュを利用せずにデバイスへ直接アクセスすること ↩
virtiofsではvhost-user-fs-pciというデバイスをqemuの起動オプションに加えることで、ゲストがvirtiofsが利用できることを認識します。 ↩
なおこの領域はゲストからは不揮発デバイスのように見えているので、kernelコードはDAXのコードを利用します ↩
Introduction of SPDK Vhost-fs target to accelerate file access in VMs and containers, SDC 2019 ↩
- 投稿日:2019-12-14T19:26:22+09:00
本番で使っているサーバを破壊して孤立させた話
新卒のときに本番サーバ破壊したので備忘録として残しておこうかと思います。
もう結構前の話なので一部おかしいかもしれないですが、本筋は間違っていないのでご容赦ください背景とか
やらかしがあったのは新卒研修のときでした。
私の会社は物理サーバからウェブのフロントまで幅広く扱う会社で、研修にも一通りの業務に触れられるようにカリキュラムが組まれていました。
事件が起きたのはサーバのラッキングやネットワークの研修・構築が終わり、次はホストの中身を構築しているときでした。
時は静かに訪れる...
研修用のホストに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する時は気をつけましょう...
- 投稿日:2019-12-14T16:29:00+09:00
Ubuntuのコア部分のみインストールしてみる
この記事は「Linux Advent Calendar 2019」の22日目の記事です。
Ubuntuの最小限な環境について
Ubuntuをインストールすると、もれなく色んなものがついてくる。
デスクトップ環境はもちろんのこと、
- ファイルマネージャー
- Firefox
- gedit
- Thunderbird
などなど…
今回はそれらをすべてインストールすることなく、本当にUbuntuのコアの部分だけをVirtualBoxにインストールしてみる。用意するもの
- VirtualBoxをインストールしたPC
- ネットワーク環境
さっそくインストール
1. ダウンロード
- ダウンロードページにアクセスする。
- [jp.ubuntu.comのダウンロードページへ]をクリックする。
- スクロールしていくと、[その他のダウンロード方法]とあるので、それをクリックする。
- [Network installer]から好きなバージョンをクリックする。
- 今回は「18.04 LTS」を選択。
- アーキテクチャの選択が出てくるので、自分の環境に合わせて選択する。
- 今回は「32-bit Intel/AMD (x86)」を選択1。
- いくつかファイルやフォルダが出てくるが、[mini.iso]をクリックしてダウンロード
今回のUbuntu18.04 LTS (i836)のmini.isoはこちら
VirtualBoxのセットアップからは、全て書いているときりがないので、大事そうなところを書いていく。
2. VirtualBoxセットアップ
名前とオペレーティングシステム
名前は仮想マシン名なので自分のお好みで良いが、タイプとバージョンはちゃんと指定しなければ動かない。
項目名 選択内容 タイプ Linux バージョン Ubuntu (64-bit) メモリーサイズ・ハードディスク
今回のような最小インストールの起動条件は、公式に記載されていない。似たような環境で、Ubuntu Serverがあるので、それの起動条件に従っておけば概ね問題ない。ちなみに、Ubuntu Server 18.04 LTSの起動条件は以下の通り。
CPU メモリ ディスク領域 1GHz以上(64bit) 1GB以上 5GB以上 CPUとメモリはこのサイトから。ディスク領域は、自分で一度インストールして「これくらいは必要だな」と思った数値。
インストールディスクの挿入
先ほどダウンロードしたmini.isoを、仮想の光学ドライブに入れておく。
- [設定]をクリック。
- [ストレージ]をクリック。
- 「空」と記載された箇所をクリックし、右端の円盤マークをクリックして[仮想光学ディスクファイルを選択]をクリック。
![]()
- 先程ダウンロードしたmini.isoを選択。
- [OK]をクリック。
3. インストール
キーボードの設定
- キーボードレイアウトを自動検出するか聞かれるが<いいえ>を選択。
![]()
- キーボードの国について聞かれるので、[Japanese]を選択。
![]()
- USキーボードは[English(US)]を選択してください。
- キーボードレイアウトを聞かれるので、[Japanese]を選択。
![]()
- Macの方も[Japanese]を選択する。[Japanese - Japanese (Macintosh)]を選択すると、以後かな入力しかできなるのでご注意!
ディスクのパーティショニング
- ここの選択は、[ガイド - ディスク全体を使う]で良い。
![]()
- LVMは、複数のハードディスクやパーティションを1つのディスクとして扱うことのできるディスク管理機能2。今回はディスクが1つしかないので関係ない。
- パーティショニングするディスクの選択が出てくるが、先程VirtualBoxで作成した仮想ハードディスクのみ出てくるので、それを選択。
![]()
- ディスクの書き込み確認が出てくるので、<はい>を選択すれば、ベースシステムのインストールが始まる。
![]()
ソフトウェアの選択
この記事の肝となるところ。他にどのようなソフトウェアをインストールするか聞かれる。ここで何も選択せずに<続ける>を選択すれば、コア部分のみのUbuntuが出来上がる。
ハードディスクへのGRUBブートローダーのインストール
GRUBブートローダーのインストールをしてよいか聞かれるので、<はい>を選択する。これをインストールしないと、せっかくインストールしても起動することができない。
インストール完了
最後の設定。
インストール完了したから、インストールディスクを抜けと言われるので、VirtualBoxの設定から取り出す。
- ディスクの取り出し(VirtualBox)
- [設定]をクリック。
- [ストレージ]をクリック。
- 「mini.iso」と記載された箇所をクリックし、右端の円盤マークをクリックして[仮想ドライブからディスクを除去]をクリック。
最後に<続ける>を選択して再起動すれば、インストールは完了。
おつかれっした。いよいよ起動
インストール完了でディスクを取り外し、<続行>を選択すると、再起動され、インストールされたUbuntuが立ち上がる。
この画面が出たら、インストール時に設定したユーザ名を入力。
続いてパスワード。
ログイン完了。色々出てくるがこの初回のみ。インストール後のトラブル対処
1. 起動時に「*ERROR* Failed to send log」が出る問題
おそらくデフォルトの設定で使い始めると、ログイン時にこんなのが出てくる。
運用していく上で問題ないが、なんか気持ち悪い。解決方法
一旦Ubuntuはシャットダウンしておく。
1. [設定]を開く。
2. ディスプレイ内の「グラフィックコントローラ」を[VBoxSVGA]にする。
設定後
2. 「◆」が出る問題
使用していると、文字が「◆」になって、何が何だか分からなくなる。
解決方法
ホームディレクトリにある、
.bashrc
を開nano
か何かで開く。nanoで開くならnano ~/.bashrc末尾に以下を追加して保存する。
~/.bashrc#Fix diamond character. case $TERM in linux) LANG=C ;; *) LANG=ja_JP.UTF-8;; esac
- nanoで保存する場合は、
Ctrl+O
→Y
.bashrcを反映させる。
sourceコマンドsource ~/.bashrc
設定後
ちなみに、インストール時に言語を英語にしておけば、これに遭遇することはない。日本語でインストールしても、CUIはどのみち英語なので、英語でインストール進めてもいいかもしれない。
まとめ
可変サイズのvdi形式でインストールした結果、仮想ハードディスクの容量が3.5GB弱ですんだ。容量が多く食われることが大っ嫌いな自分にとってはすごい嬉しいインストール方法だった。ちなみにUbuntuで
df -BM
を叩くと、2.5GB程度使っていることになっていた。※このあたりは人によって差異が出るかも。
Ubuntuをインストールしてもターミナルしか使わないよって人はこれで十分だと思う。少なくとも自分はこれで満足。
「 64-bit Intel/AMD (x86_64)」をインストールすると、言語選択で日本語を選択したときにインストール過程でループ現象が起きてしまう。 ↩
https://tech.nikkeibp.co.jp/it/article/Keyword/20071012/284413/ ↩
- 投稿日:2019-12-14T15:12:24+09:00
スマホでVPN接続してサーバーをOFF/ON
これは、
サーバーにVPN接続、サーバーの電源OFF/ONを、全てスマホ(Android)でやりました。
というだけの事です。
滅多にやらないので、手順の備忘です。事情
休日にサーバーの電源をOFF/ONしなければならない時があります。
(建屋の電源の工事とか検査とか)働き方改革
そもそも、サーバーがオンプレミスなのが悪いのですが、
休日に仕事場には行きたくありません。
なので家からVPN接続して操作するのですが、
外出中に対応しなければならない時があります。
家族で出かけているのに、仕事でPCを持ち歩くのは、時代に逆行しています、家族に何か言われそうです。なので、スマホで全て操作してみました。
OFF
UTMメーカー謹製のスマホアプリでVPN接続
ConnectBotでサーバーにSSH接続
su - 成り上がり
shutdown -h nowON
UTMメーカー謹製のスマホアプリでVPN接続
サーバーのリモートマネージメント機能
(サーバーが起動していなくても、電源ON/OFF出来る機能)
で、サーバーの電源ON結果
ログインパスワードのセットが、スマホだとイライラしますが、
出先の美味しいものを調べるふりをすれば、何をしているか家族にバレません。
平和が一番です。
- 投稿日:2019-12-14T15:12:24+09:00
スマホで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。結果
ログインパスワードのセットが、スマホだとイライラしますが、
出先の美味しいものを調べるふりをすれば、何をしているか家族にバレません。
平和が一番です。
- 投稿日:2019-12-14T14:50:55+09:00
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.000000Synaptic、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+Releasexbindkeysを常駐させるには、コマンド
xbindkeys_autostart
を実行されるように組みます。
最後に、Gnomeのキーボードショートカットの設定で、Super+M、Super+,、Super+sに必要な機能を割り当てます。Trackpadを使って、スクロール量を調整したり、3本指スワイプに機能を割り振ることができました。
- 投稿日:2019-12-14T13:39:01+09:00
linux版 nodeとnpmとprettier
まず確認
Nodejs
ローカルでもjavascriptを使えるようにしたもの
npm
パッケージ管理
n
Nodejsのバージョン管理aptからインストール
インストール先:
/usr/bin/
sudo apt install nodejs npmnpmでnをインストール
インストール先:
/usr/local/bin/
sudo npm instal -g nn
nでインストールされるNodeの場所は以下になります。
/usr/local/bin/
インストール可能なバージョンを調べる
最新の20件取得 n lsr すべて取得 n lsr --allnodeインストール&削除&バージョン切り替え
インストール 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 -gPrettier
最近はやっているフォーマッター
ローカル npm install prettier -D※しかし、これだけではまだ使えない。そこで次のやり方をします。
とても参考になったパスの通し方
ローカル環境にあるツールをバージョン毎に使い分けるnpmにもってこいのテクニックだと思います。
プロジェクトのあるパスのモジュールを参照する必殺技でもなんでもないなんの変哲のない相対参照(./)を使うやり方です。export PATH=$PATH:./node_modules/.bin
- 投稿日:2019-12-14T13:39:01+09:00
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
とても気に入ったので、
これ./
を
今日から執拗に使っていこうかなと思います。
- 投稿日:2019-12-14T13:32:29+09:00
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
:強制終了参考
- 投稿日:2019-12-14T03:44:44+09:00
【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