それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

headless chrome を使うために、Linuxに最新版のChromeを常に入れておく

headless chrome のためDebian/Ubuntuに最新版のChromeを突っ込む。

最新版のChromeGoogle の配付サイトに用意されている。

f:id:takuya_1st:20181126162746p:plain

配付サイトのapt 鍵をいれる。

wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo apt update 

手作業でapt に source add する

もし、手作業でAPTのURLをいれるとき( /etc/apt/sources.list.d/google-chrome.list )を更新するか新規作成する。

echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' > /etc/apt/sources.list.d/dl.google.com.list

 編集後に更新

apt update 

 最新版や ベータ版・開発版をいれる。

apt search google-chrome-beta
apt search google-chrome-unstable

  実際にやってみた例

takuya@~$ apt search google-chrom
Sorting... Done
Full Text Search... Done
google-chrome-beta/stable 69.0.3497.57-1 amd64
  The web browser from Google

google-chrome-stable/stable 68.0.3440.106-1 amd64
  The web browser from Google

google-chrome-unstable/stable 70.0.3534.4-1 amd64
  The web browser from Google

細かい違いを確認してみた

takuya@sakura:~$ apt show  google-chrome-unstable
Package: google-chrome-unstable
Version: 70.0.3534.4-1
Priority: optional
Section: web
Maintainer: Chrome Linux Team <chromium-dev@chromium.org>
Installed-Size: 204 MB
Provides: www-browser
Pre-Depends: dpkg (>= 1.14.0)
Depends: ca-certificates, fonts-liberation, libappindicator3-1, libasound2 (>= 1.0.16), libatk-bridge2.0-0 (>= 2.5.3), libatk1.0-0 (>= 1.12.4), libc6 (>= 2.16), libcairo2 (>= 1.6.0), libcups2 (>= 1.4.0), libdbus-1-3 (>= 1.1.4), libexpat1 (>= 2.0.1), libgcc1 (>= 1:3.0), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.31.8), libgtk-3-0 (>= 3.9.10), libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.22), libpango-1.0-0 (>= 1.14.0), libpangocairo-1.0-0 (>= 1.14.0), libstdc++6 (>= 4.6), libuuid1 (>= 2.16), libx11-6 (>= 2:1.4.99.1), libx11-xcb1, libxcb1 (>= 1.6), libxcomposite1 (>= 1:0.3-1), libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxi6 (>= 2:1.2.99.4), libxrandr2 (>= 2:1.2.99.3), libxrender1, libxss1, libxtst6, lsb-release, wget, xdg-utils (>= 1.0.2)
Recommends: libu2f-udev
Download-Size: 57.1 MB
APT-Sources: http://dl.google.com/linux/chrome/deb stable/main amd64 Packages
Description: The web browser from Google
 Google Chrome is a browser that combines a minimal design with sophisticated technology to make the web faster, safer, and easier.

ヘッドレスを使う場合

ヘッドレスを使うためには。、いくつかのパッケージをいれる必要がある。

sudo apt-get install -y libappindicator1 fonts-liberation

headless-chrome は、xvfb にくらべて必要なモジュールも減ってるしすごく楽だよね。

フォントがない

headless chromeを使ってスクショをとるなら、フォントを持っていたほうがいい。

使ってみてわかったけど、フォントがないとスクショ取ると期待通りにならない。

sudo apt-get install msttcorefonts

apt がHTTPだからダメ・・・?

この記事を書くために幾つかブログを見てたんだけど。

apt のソースが HTTP なのでセキュリティ的にやばい

などと嘘を書いているブログが散見されました。

apt-key で最初に「鍵」を登録しているので、HTTP通信で転送されたとして署名検証つまり改竄は検出できます。*1

HTTPSじゃないとセキュリティ基準が満たせない。

とかいてた人がいて、ちょっと何言ってるわからない。

けど、HTTPSも一応あるらしい。

HTTPはセキュリティ基準を満たせないとか、それでセキュリティを語れるんだと疑問を投げかけたいが人のブロクなので自重した。

そもそもapt-keyで何のために最初にキーを取得してんだろう。ほんの少し考えてほしかった。

https://dl-ssl.google.com/linux/chrome/deb/

杓子定規にセキュリティ基準を「満たせばいい」というのはどうなんだろうね。セキュリティ基準としても、ルールを守る側としても、どちらも思考停止していてるように感じた。

HTTPSで通信されちゃうと、何をインストールしてるか追跡不能になって、むしろめんどくさいと思うんだけど・・・

参考資料

*1:この記述で理解できないひとはこの業界を引退したほうがいい

npm -g で グローバルじゃなくてユーザー空間を使う

目次

npm -g install のインストール先

npm を入れた状況や入れ方にもよるんですけど、npm って ユーザーローカルなどを使えないよね。

まぁグローバルだから、当たり前と言われれば当たり前です。

takuya@~$ npm config --global  get prefix
/usr/local

わたしのmacOS の場合は /usr/local/ でした。

npm -g で グローバルはめんどくさいですよ

いまどき、Linux のFHSに従って /usr/lib とか /usr/local/lib にいれる必要ってある?

macOS は ユーザー空間のホームディレクトリ空間で良くないか。

npm の 設定を確認する。

現在の設定を確認するには、これを使う。

npm config --global  list

デフォルト設定を含めてすべて表示するときは、次のようにする。

npm config ls -l

このコマンドを見ると、次のようなおもしろそうな、ファイル名も見つかる。

prefix = "/usr/local"
cache = "/Users/takuya/.npm"
globalconfig = "/usr/local/etc/npmrc"
globalignorefile = "/usr/local/etc/npmignore"
init-module = "/Users/takuya/.npm-init.js"
userconfig = "/Users/takuya/.npmrc"

グローバルとローカル

npm には グローバルとローカルがあり、ローカルはフォルダごとに、グローバルはシステム全体。

システム全体をどう定義するか難しいところではあるが、「グローバル=ユーザー個人空間」と解釈して利用するほうがより現代的じゃないかなと感じた。

インストール先を変更する

npm config set prefix

インストール先を変更するとができるのでそれを使うことにする。

自分のホームディレクトリに突っ込むことにする。

わたしは、rubyのrbenv の gems を ~/.lib/ruby に突っ込んでいるので、そこを使うことにする。

npm config --global set prefix $( echo  ~/.lib/node )

または、先程の config ls -l の結果に見える npmrc を使って

NPM_PREFIX=$( echo  ~/.lib/node )
echo "prefix = $NPM_PREFIX" >> ~/.npmrc

などとしても良さそう。

設定した結果はこんな感じになりました。

takuya@Desktop$ npm config --global get prefix
/Users/takuya/.lib/node

変えたあとに知っておく必要があること

node コマンドが node_module をどこから探すかを知っておく必要がある。 Modules | Node.js v11.4.0 Documentation

node コマンドを起動したときに次の場所から探すようになっている。

  1. $HOME/.node_modules
  2. $HOME/.node_libraries
  3. $PREFIX/lib/node

つまり、 シンボリックリンクなどでぱぱっとやることで、npm コマンドだけでなく、 node コマンドからも簡単に変えることができる。

ln -sr  ~/.lib/node/lib/node_modules/  ~/.node_modules

グローバル・インストールを変更する利点

なぜグローバルのインストールを変えたほうがいいのでしょうか。

わたしは、sudoなどの権限管理とユーザー単位の管理が楽だからやりました。

パスワードを聞かれるのは不便だし、パーミッションの管理もめんどくさいのです。

/usr/lib のグローバルでのライブラリの共有は確かに便利だしディスクの容量節約になります。でも現代に置いてはDLL地獄にあるような、ライブラリの依存関係プロパティの地獄を味わうだけです。docker や openVZ のchrootアプローチも同じようなものです。

勘違いしそうになるポイント

~/.npm はただのキャッシュ

~/.npm にnode_modulesがたくさんあります。それを見ると~/.npmにインストールされるように見えてしまいます。しかし .npm はキャッシュでそこにファイルはそのまま使うことはないようです。これの根拠は初期設定を見るとわかりました。

初期設定が次の箇所になっていました、

prefix = "/usr/local"
cache = "/Users/takuya/.npm"

上は、私の設定場合です。設定を解釈すると、globalの npm のライブラリは /usr/local/node_modules にインストールされます。 ~/.npm はキャッシュですね。

つまり、"/Users/takuya/.npm" にあるファイルはキャッシュです。ローカルインストール時に使われるようです。 私の npm i コマンドの実行時に取得した npm をキャッシュ保存していて、ここからローカルに配置するようです。開発ディレクトリを含むローカルインストールの高速化と負荷低減のためでしょうか、

この設定を使うべきポイント

windows です Windowsで npm を使うときです。今回紹介した設定を使ってフォルダを移動させる手法は、Windowsでとても役に立つのです。

参考資料

2018-12-08

パスの記述を修正

losetupとddでダミーファイルを作ってHDD操作の練習をする

パーティションやフォーマットの練習のためにUSBメモリを買ってくるのはだるい

仮想ファイルシステム的に、ダミーファイルを作ってそれをHDD(ブロック)デバイスとして扱う。

ダミーファイルを作ってコマンドの練習ができます。 fdisk / gdisk / gparted / cfdisk に、cryptsetup や dm-crypt とか、LVMの練習に、mount や mkfs や btrfsを試したり。

過去にLVMやKVM+qemuwindowsなどでもやりました。記事が散財して見つけにくかったので、まとめ直しました。

お品書き

ダミーファイルの作成

1GB程度のファイルを作る

dd if=/dev/zero of=out.1GB.img bs=1MiB count=200

実験するなら 1GBでも大きすぎるきもするので、200MiB程度で十分かも

dd if=/dev/zero of=out.1GB.img bs=1MiB count=200

ループバックデバイスとして扱う

sudo losetup -f my.img

ファイルがブロックデバイス(USBドライブ的)に扱える

いくつか、接続した結果がコレです。

takuya@:~$ sudo losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE              DIO
/dev/loop1         0      0         0  0 /home/takuya/out.2.img   0
/dev/loop2         0      0         0  0 /home/takuya/out.3.img   0
/dev/loop0         0      0         0  0 /home/takuya/out.1.img   0

詳細を見るのは次の方法でも大丈夫です。

takuya@:~$ sudo losetup  -a
/dev/loop1: [65025]:2104157 (/home/takuya/out.2.img)
/dev/loop2: [65025]:2104158 (/home/takuya/out.3.img)
/dev/loop0: [65025]:2103459 (/home/takuya/out.1.img)

一つの接続したデバイスとしてのファイルを解除する。

ブロックデバイスの名前を指定して、接続を解除する

takuya@:~$ sudo losetup  -d /dev/loop1

接続を解除した結果がこちら。

takuya@:~$ sudo losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE              DIO
/dev/loop2         0      0         0  0 /home/takuya/out.3.img   0
/dev/loop0         0      0         0  0 /home/takuya/out.1.img   0

すべての接続を解除する

一つずつ解除するのがめんどくさいんで -D / --detach-all でまとめて解除する・

takuya@:~$ sudo losetup  -D

ぜんぶの接続が解除されました。

takuya@:~$ sudo losetup

バイスを使った練習

mkfs の練習

パーティションを作らずに、シンプルボリューム*1でデバイスを作ってマウントする

mkfs.btrfs でフォーマットとマウントの練習

めったに使わない btrfs でもこれで練習ができる。

takuya@:~$ sudo mkfs.btrfs /dev/loop1
btrfs-progs v4.7.3
See http://btrfs.wiki.kernel.org for more information.

Performing full device TRIM (200.00MiB) ...
Label:              (null)
UUID:
Node size:          16384
Sector size:        4096
Filesystem size:    200.00MiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         DUP              32.00MiB
  System:           DUP               8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  1
Devices:
   ID        SIZE  PATH
    1   200.00MiB  /dev/loop1

マウントしてみる。

takuya@:~$ sudo mount -t btrfs  /dev/loop1 ./mnt
takuya@:~$ df  ./mnt/
ファイルシス   1K-ブロック  使用 使用可 使用% マウント位置
/dev/loop1          204800 16640 121856   13% /home/takuya/mnt

コマンドの練習

これで、気にせずに実験ができるのでガンガンいこうぜ

パーティションの作成と削除

gdisk /dev/loop1
fdisk /dev/loop1
cfdisk /dev/loop1

パーティションを作った結果を確認した状態

takuya@:~$ lsblk
NAME                           MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0                            7:0    0   200M  0 loop
loop1                            7:64   0   200M  0 loop
└─loop1p1                        7:65   0   199M  0 loop

/dev/loop1にパーティションを作ると loop1p1 が作られる。わかりやすい。

フォーマットしてみる

フォーマットするコマンドをあれこれ試してみると楽しいかもしれない

mkfs.bfs     mkfs.btrfs   mkfs.cramfs  mkfs.exfat   mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.fat     mkfs.minix   mkfs.msdos   mkfs.ntfs    mkfs.vfat

NTFSの場合。

takuya@:~$ sudo mkfs.ntfs /dev/loop1p1
The partition start sector was not specified for /dev/loop1p1 and it could not be obtained automatically.  It has been set to 0.
The number of sectors per track was not specified for /dev/loop1p1 and it could not be obtained automatically.  It has been set to 0.
The number of heads was not specified for /dev/loop1p1 and it could not be obtained automatically.  It has been set to 0.
Cluster size has been automatically set to 4096 bytes.
To boot from a device, Windows needs the 'partition start sector', the 'sectors per track' and the 'number of heads' to be set.
Windows will not be able to boot from this device.
Initializing device with zeroes: 100% - Done.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.
takuya@:~$ sudo mount -t ntfs  /dev/loop1p1 ./mnt

この方法で練習できるコマンド

ディスクを取り扱ううえで、練習するコマンドもこの手法で練習できそうだ

  • dump
  • dd
  • dd_rescue
  • gdisk / fdisk / cfdisk など
  • parted
  • LVM
  • mdadm ( RAID )
  • dm-crypt ( LUKS )

ソフトRAIDとLVMの組み合わせなどめんどくさいこともぱぱっと試せそう。RAID on LVM や LVM on RAID とか。LUKS on LVMや LVM on LUKS とかもできそうですね。

chrootなども合わせて起動ディスクイメージ作成や、grub修正などもこの方法を知ってると楽。

まとめ

ブロックデバイスをファイルとして作ってフォーマットをしたりパーティションを作ったり練習する事ができることがわかった。

Linux のブロックデバイスの扱いになれるには、アレコレの方法があると思うんだけど、私の知る限りでは、losetupとddを組み合わせるのが一番手軽だと思います。

まさか、フォーマットの練習のためだけに、VmwareVirtualBox持ち出してパーティションを作る練習をするわけにも行かないし。手順も多く覚えることが多すぎてね。

ただし、ブロックデバイスとファイルの違いやファイルが何をしているかを知らないと混乱することになるので、完全な初心者にはおすすめできないのが難点。

fdisk は直接ファイルをいじれるし、mount も直接ファイルをマウントできたりするんだけど、いったんloopデバイスに取り付けちゃうと通常のSSD/HDDと変わらず扱いができるので迷わないですむし、覚えることも減る。

次回の予定

次回は、暗号化ディスクを作る練習をコレでやってみたいと思います。

*1:windowsではこう呼ぶ