smartyのエスケープについて見直す

SmartyではPHPの値を出力するとき、デフォルトではエスケープされていないので、 XSS対策として、明示的にエスケープしなければなりません。

XSS対策としての正しくエスケープを行うには、内部でどのような動きをしているのか把握する必要があるので、 見直していきます。

以下の環境を使って見直す

  • PHP7.3
  • Smarty3.1.36

ドキュメントを確認してみる

大まかに解説が載っているが、javascript など抜けているのもある https://www.smarty.net/docs/ja/language.modifier.escape.tpl

コードを確認してみる

こちらを読んでいけばわかりそう。 https://github.com/smarty-php/smarty/blob/v3.1.36/libs/plugins/modifiercompiler.escape.php

エスケープ処理を見ていく

html

  • デフォルト
  • htmlspecialcharsをかけ & " ' < >エスケープする
    • オプションは、ENT_QUOTES 固定
    • smartyで指定された文字コードを指定
    • htmlspecialcharsの第四引数、double_encodeのオン・オフが選べる

https://github.com/smarty-php/smarty/blob/v3.1.36/libs/plugins/modifiercompiler.escape.php#L46-L54

htmlall

  • 適用可能な文字を全て HTML エンティティに変換する
    • マルチバイトもHTML エンティティに変換するため、mb_stringが有効なときは、htmlspecialcharsをした上 で、mb_convert_encodingしている。

https://github.com/smarty-php/smarty/blob/v3.1.36/libs/plugins/modifiercompiler.escape.php#L56-L81

url

  • rawurlencodeを行う

https://github.com/smarty-php/smarty/blob/v3.1.36/libs/plugins/modifiercompiler.escape.php#L84

urlpathinfo

  • rawurlencodeを行う
    • ただし、%2F/ に戻すようにしている

https://github.com/smarty-php/smarty/blob/v3.1.36/libs/plugins/modifiercompiler.escape.php#L86

javascript

https://github.com/smarty-php/smarty/blob/v3.1.36/libs/plugins/modifiercompiler.escape.php#L94

XSSの対応

HTML要素、属性値、リンクに値を入れるとき

escape:html を使う

<h1>{$hoge|escape:html}</h1>
<input type="text" name="hoge" value="{$huga|escape:html}" />
※属性値はダブルクォートで囲ってあること
<a href="{$hoge|escape:html}">リンク<a>
※別途スキーマのバリデーションは行うこと

URLのパラメータに値をいれるとき

escape:'url', escape:'urlpathinfo' を使う

<a href="http://localhost:8080/index.php?hoge={$hoge|escape:'url'}"
<a href="http://localhost:8080/{$hoge|escape:'urlpathinfo'}"

JavaScriptの文字列に値をいれるとき

function hoge(){
    var = "{$hoge|escape: 'javascript'}";
}
※ そもそも、JavaScript内に動的に値を埋め込まないのがベスト

イベントハンドラの場合は、+αでHTMLのエスケープをする

<body onload="console.log('{$hoge|escape: 'javascript'|escape: 'html'}');">

参考

体系的に学ぶ 安全なWebアプリケーションの作り方 第2版

開発環境としてChromiumOSを使ってみる(インストール編)

Chromebook最近すごいですね。 存在自体は、数年前くらいから知ってはいたのですが、去年の年末あたりからよくCMでも見かけるようになりました。 www.youtube.com. 海外の教育現場では、割と一般的に使われているという話を聞いたことがありますが、 最近だと、こんなニュースもありました。

pc.watch.impress.co.jp.

Chromebook物欲の赴くままに即ポチって色々試してみたいのですが、購入する前に、どこまでできるの?開発もできるの?というのをあらかじめ把握しておきたいので、まずは、ChromeOSのオープンソース開発バージョンであるChromiumOSをインストールし、検証していきたいと思います。

ChromiumOSをビルド・インストールするマシン

実家からもらってきた富士通のLIFEBOOKを使いました。 https://www.fmworld.net/biz/fmv/lifebook/1101/e780b/ ※ HDD => SSD、メモリ2G => 8Gに換装しています。

もともと、Ubuntu 18.04 LTS が入っていたので、これを使ってビルドします。

ChromiumOSのビルド・インストール

スタートガイドがあるので、これに従いやっていきます。 https://www.chromium.org/chromium-os/quick-start-guide

大まかな流れ

  • OSのビルド
  • USBメモリにコピー
  • USBからChromiumOSを起動
  • SSDにChromiumOSをインストール

という流れで行いました。

ハマったところ

USBからChromiumOSを起動し、fdisk, partedでインストールするSSDのパーディションを整理しようと思ったのですが、fdisk, partedコマンドが見つかりませんでした。 調べてみたところ、どうやら /sbin /usr/sbin のパスが通っていないので、このパスを通す必要がありました。 https://www.reddit.com/r/chromeos/comments/2gn445/quick_fix_for_anyone_not_able_to_use_fdisk_or/

ChromiumOSの設定

インストールは完了したので、設定を行っていきます。

  • ネットワーク
  • 言語
  • 時刻
  • Linux(Crostini)

の設定を行います。

Linux(Crostini)は、ChromiumOSを使用してソフトウェアを開発できる機能です。 Linuxコマンドラインツール、コードエディタ、IDE を ChromiumOS にインストールして、コーディングやアプリの開発などを行うことができます。参考: https://support.google.com/chromebook/answer/9145439?hl=ja.

Linux(Crostini)を起動し、ChromiumOS上でDebianを起動することを確認

バージョンは10.3だった。

takapi@penguin:~$ cat /etc/debian_version
10.3

仕組み的には、ChromiumOS上でコンテナ(LXD)を動かしている(実際には間にlinuxVMがいる)ようです。 (ちなみに、DebianからArch Linuxにも変えられるそうです。https://wiki.archlinux.jp/index.php/Crostini

ハマったところ

こちらの手順で、Linux(Crostini)のセットアップを行いましたが、セットアップ中に、仮想マシンのダウンロード中にエラーが発生しました。もう一度やり直してください。 というエラーが発生し、インストールができませんでした。 https://support.google.com/chromebook/answer/9145439?hl=ja

どうやら、セットアップ中にコンテナのホストとなっているLinuxVM(termina)が起動できていないことが原因で、以下の手順で正常にセットアップすることができました。

  • エラーメッセージが画面に出ている状態で、Ctrl+Alt+tを押し、crosh(ターミナル)を開く
  • 以下のコマンドを実行し、VM(termina)を起動
crosh> vmc list # terminaが作成されていることを確認
termina (3461484544 bytes, min shrinkable size 4870635520 bytes, raw, sparse)
Total Size (bytes): 3461484544
crosh> vmc start termina # VMを起動

この状態で、エラーメッセージの出ているセットアップ画面の 再実行 ボタンを押すと次に進め、正常にセットアップすることができました。

Linux(Crostini)環境の設定

fish, tmux, ghq, fzf

ビャッと入れます http://takapi86.hatenablog.com/entry/2019/08/12/143719

docker

apt経由で入れます

日本語入力

こちらを参考にさせていただきました。 https://www.axon.jp/entry/2018/10/18/201812

キーバインドは、mozcの設定でMac風に変えました。

vscode

Linux(Crostini)環境でインストールしたGUIアプリケーションを起動すると、何もしなくても、ホスト側であるChromiumOSの画面に表示されるようになっています。

こちらを参考にさせていただきました。 https://qiita.com/suzuki_sh/items/adead0fd9adefec112af

まとめ

とりあえず、わーっとChromiumOSで開発環境を整えてみました。 この記事は、上記でインストールしたvscodeで書いてますが特に問題なく使えています。

しばらく使ってみて、良い点・悪い点を検証していきたいと思います。

では〜

Docker + PhpStorm 環境でXdebugのリモートデバッグが使えるようにするためのメモ

PHPデバッグには、Xdebugを使っていますが、いつも設定の仕方を忘れてしまうのでメモしておきます。

環境

  • Mac
  • Docker(Docker Desktop for Mac, Docker Machineどちらでも)
  • PhpStorm

Docker側の設定

peclXdebugをインストールします。

Dockerfileに以下の内容を追加し、xdebugをインストールします。

RUN pecl install xdebug

php.iniに以下の内容を追加します。

[xdebug]
zend_extension="/usr/lib64/php/modules/xdebug.so" # 環境に応じて、xdebug.soが置いてある場所を指定します。
xdebug.remote_enable = On
xdebug.remote_autostart = Off
xdebug.remote_connect_back = Off
xdebug.remote_log="/tmp/xdebug.log"
xdebug.remote_port=9001
xdebug.remote_host=host.docker.internal

ポイント

* デフォルトでは、XdebugをOffにし、使いたい人だけ、環境変数 XDEBUG_CONFIGremote_enable=On をセットするようにして有効化するようにします。 * XDEBUG_SESSION_START という名前のパラメータを渡すことで任意のタイミングでリモートデバッグを有効化できました。 ※ xdebug.remote_autostart を Offにする必要あり。https://xdebug.org/docs/remote#browser_session

  • remote_portはバッティングしないようなportを設定するのが良いです。
  • remote_hostは環境に合わせて、PhpStormのデバッグポートを待ち受けているホスト側のIPアドレス、もしくはホスト名を指定します。

そのほか、各設定内容は以下をご確認ください。 https://xdebug.org/docs/remote

PhpStorm側の設定

  • 環境設定 => 言語 & フレームワーク => PHP => サーバ を選択
    • ホスト: _
    • ポート: 環境に応じて設定
    • デバッガ: Xdebug
    • パス・マッピングの設定: 環境に応じて設定
  • 環境設定 => 言語 & フレームワーク => PHP => デバッグ を選択
    • 3.PHPデバッグ接続のリスニングを使用可能にするリスニングを開始 を選択
    • デバッグ・ポートを xdebug.remote_port で設定した値に合わせて設定
    • 一度PhpStormの再起動が必要かも

lsofコマンドで、設定したポートで待ち受けているか確認

$ lsof -i:9001
COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
phpstorm 8875 takapi  467u  IPv4 0x5054b8bd5948d975      0t0  TCP *:etlservicemgr (LISTEN)

ここで、適当な場所に、ブレークポイントを置いてステップ実行できれば完了です。 もし、できていなかったら、xdebug.remote_log で設定したログを見てみると良さそうです。

Btrfsについて軽く調べた

Btrfsとは

Btrfsは、フォールトトレランス、管理、データ保護など、企業のストレージ システムでよく見られた障害に対処することを目的に、複数の組織(Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATOなど)によって、開発されたファイルシステム

SUSE Linux Enterprise Server 12 で採用されているらしいです。

https://www.synology.com/ja-jp/dsm/Btrfs https://wiki.archlinux.jp/index.php/Btrfs

Btrfsの特徴

  • 最大ファイルサイズは16EiB
  • コピーオンライト
  • ディスク容量の効率的な利用
  • iノードの動的割り当て
  • ストレージプール対応
  • スナップショット機能
  • チェックサムによる完全性の保証
  • 効率的な増分バックアップ
  • オンラインデフラグ

まず使用できるか確認してみる

modprobe btrfs
grep btrfs /proc/filesystems
    btrfs

Btrfsファイルシステムを作成

前回と同じく、家に転がっていた4GのHDDを使います。

ディスク /dev/sdb: 4 GiB, 4327464960 バイト, 8452080 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子:

mkfs.btrfs または mkfs -t btrfs で、作成します。

今回は、/dev/sdb1 /dev/sdb2 まとめて、Btrfsファイルシステムを作成します。

sudo mkfs -t btrfs /dev/sdb1 /dev/sdb2
btrfs-progs v4.15.1
See http://btrfs.wiki.kernel.org for more information.

Label:              (null)
UUID:               911d6614-d117-44b2-93a5-4a531e7938ec
Node size:          16384
Sector size:        4096
Filesystem size:    4.03GiB
Block group profiles:
  Data:             RAID0           412.50MiB
  Metadata:         RAID1           206.25MiB
  System:           RAID1             8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  2
Devices:
   ID        SIZE  PATH
    1     1.95GiB  /dev/sdb1
    2     2.08GiB  /dev/sdb2
lsblk
sdb      8:16   0     4G  0 disk
├─sdb1   8:17   0     2G  0 part /media/takapi/911d6614-d117-44b2-93a5-4a531e7938ec
└─sdb2   8:18   0   2.1G  0 part
df -h
/dev/sdb1       4.1G   17M  3.5G   1% /media/takapi/911d6614-d117-44b2-93a5-4a531e7938ec

どうやら、sdb1 の方にまとまっているっぽいです。

マウントする

特に指定無しで、マウントできました。

sudo mount /dev/sdb1 /mnt/disk/
sudo bash -c "echo test > /mnt/disk/test.txt" # 一応、読み書きできるか確認
cat /mnt/disk/test.txt
test
sudo umount /dev/sdb1

ファイルシステムのチェック

fsckコマンドを実行すると、btrfs check を使ってくれとのこと。

sudo fsck /dev/sdb1
fsck from util-linux 2.31.1
If you wish to check the consistency of a BTRFS filesystem or
repair a damaged filesystem, see btrfs(8) subcommand 'check'.

チェックできました。

sudo btrfs check /dev/sdb1
Checking filesystem on /dev/sdb1
UUID: 911d6614-d117-44b2-93a5-4a531e7938ec
checking extents
checking free space cache
checking fs roots
checking csums
checking root refs
found 262144 bytes used, no error found
total csum bytes: 0
total tree bytes: 131072
total fs tree bytes: 32768
total extent tree bytes: 16384
btree space waste bytes: 123655
file data blocks allocated: 131072
 referenced 131072

サブボリューム

Btrfsでは、ファイルシステムをサブボリュームという単位で分割することができます。

作成

sudo btrfs subvolume create /mnt/disk/sub1
Create subvolume '/mnt/disk/sub1'
sudo btrfs subvolume create /mnt/disk/sub2
Create subvolume '/mnt/disk/sub2'

一覧表示

sudo btrfs subvolume list /mnt/disk/
ID 260 gen 15 top level 5 path sub1
ID 261 gen 16 top level 5 path sub2

削除

sudo btrfs subvolume delete /mnt/disk/sub1
Delete subvolume (no-commit): '/mnt/disk/sub1'
sudo btrfs subvolume delete /mnt/disk/sub2
Delete subvolume (no-commit): '/mnt/disk/sub2'

サブボリュームのマウント

個々のサブボリュームをマウントする場合は、IDを使います。

sudo btrfs subvolume list /mnt/disk/
ID 262 gen 19 top level 5 path mount_data
sudo mount -t btrfs -o subvolid=262 /dev/sdb1 /mnt/disk/
mount | grep sdb1
/dev/sdb1 on /mnt/disk type btrfs (rw,relatime,space_cache,subvolid=262,subvol=/mount_data)
df -h | grep sdb1
/dev/sdb1       4.1G   17M  3.5G   1% /mnt/disk

スナップショット

サブボリューム単位でスナップショットもとれます。

sudo touch /mnt/disk/test.txt
sudo btrfs subvolume snapshot /mnt/disk/ /mnt/disk/snapshot
Create a snapshot of '/mnt/disk/' in '/mnt/disk/snapshot/disk'
sudo ls /mnt/disk/snapshot
disk
sudo ls /mnt/disk/snapshot/disk/
snapshot  test.txt

ファイルシステムの情報の表示

ファイルシステムの情報を表示する

sudo btrfs filesystem df /mnt/disk/
Data, RAID0: total=412.50MiB, used=128.00KiB
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=206.25MiB, used=160.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B

ファイルシステムの使用状況を表示する

sudo btrfs filesystem df /mnt/disk/
Data, RAID0: total=412.50MiB, used=128.00KiB
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=206.25MiB, used=160.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B

参考

https://www.slideshare.net/fj_staoru_takeuchi/btrfs-part1

php-memcached 2.2.0 と 3.1.4 でデータの互換性があるのか確認する

pecl/memcached は、libmemcachedライブラリを介してmemcachedインターフェイスするためのPHP拡張です。

https://pecl.php.net/package/memcached

PHP5系で最新版(3.1.4) をインストールしようと思ったところ、7.0.0からしかインストールができないとのエラーが発生。memcached-2.2.0であればインストール可能

root@3105494f7cac:/var/www/html# pecl install memcached
pecl/memcached requires PHP (version >= 7.0.0), installed version is 5.6.40
pecl/memcached can optionally use PHP extension "igbinary" (version >= 2.0)
pecl/memcached can optionally use PHP extension "msgpack" (version >= 2.0)
No valid packages found
install failed

逆に、memcached-2.2.0 はPHP7系ではインストールできませんでした。

pecl/memcached requires PHP (version >= 5.2.0, version <= 6.0.0, excluded versions: 6.0.0), installed version is 7.3.10
No valid packages found
install failed

READMEにもバッチリ書いてありました。

github.com

互換性があるか検証してみる

PHP5からPHP7へバージョンアップする際に、ログインセッション引き継ぎながら動的に切り替えしたいので、memcached2,3間でデータの互換性があるかどうか簡単に検証していきます。

検証環境

docker環境を使って、PHP5.6(memcached-2.2.0), PHP7.3(memcached-3.1.4)を用意しました。

github.com

なお、igbinary, msgpack は入れていません。

php -i | grep igbinary
igbinary support => no
php -i | grep msgpack
msgpack support => no

libmemcached は、1.0.18 最新、 実行時設定(php.ini)はデフォルトにしています。

この環境に、 画面にアクセスしたら値をカウントアップ => Memcachedに保管 => 画面に表示するという簡単なwebアプリを乗せ、PHP5.6とPHP7.3で互いに、カウント数の書き込み・読み込みができれば、互換性があると判断します。

https://github.com/takapi86/verify-memcached-for-php-migration/blob/b3e80555a04784c69aacb03759c8a60850d15a74/app/index.php

セッションを使うケースと、Memcached直接を使うケースで試してみます。

結果

無事問題なく、相互に読み書きができることを確認できました。

簡単な確認でしたが、ここまで

参考

https://pecl.php.net/package-changelog.php?package=memcached&release=3.1.4 https://github.com/php-memcached-dev/php-memcached#dependencies https://launchpad.net/libmemcached/+download

xfsについて調べた

XFSとは

XFSは、Silicon Graphics という会社が自社のIRIXというUNIXOS向けに開発されたジャーナルファイルシステムで、巨大なファイルシステムなどに対応する目的で開発されたもの。

RHEL7で採用されているらしいです。

XFS の主な特徴

とのこと

参考:

第3章 XFS ファイルシステム Red Hat Enterprise Linux 7 | Red Hat Customer Portal

まず使用できるか確認してみる

modprobe xfs
grep xfs /proc/filesystems
        xfs

XFSファイルシステムを作成

家に転がっていた4GのHDDを使います。

ディスク /dev/sdb: 4 GiB, 4327464960 バイト, 8452080 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 

mkfs.xfs または mkfs -t xfs で、作成します。

sudo mkfs -t xfs /dev/sdb1 
mkfs.xfs: /dev/sdb1 appears to contain an existing filesystem (ext4).
mkfs.xfs: Use the -f option to force overwrite.

すでに、ファイルシステムが含まれていると警告を出し、続行できないので -f で上書きます。

sudo mkfs -t xfs -f /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=264000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0, rmapbt=0, reflink=0
data     =                       bsize=4096   blocks=1056000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

マウントする

特に指定無しで、マウントできました。

sudo mount /dev/sdb1 /mnt/disk/
sudo bash -c "echo test > /mnt/disk/test.txt" # 一応、読み書きできるか確認
cat /mnt/disk/test.txt 
test
sudo umount /dev/sdb1

ファイルシステムのチェック

xfs_repair で、ファイルシステムのチェック・修復を行います。 ext系で言うと、それぞれ fsck, e2fsck コマンドにあたります。

修復を行わず、チェックだけの場合は、-n コマンドを使います。

xfs_check というコマンドもあるようなのですが、どうやらチェックのスピードが遅い関係で、非推奨になっているようです。

sudo xfs_repair /dev/sdb1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

ファイルシステムのパラメータ変更

ファイルシステムのパラメータ変更は、xfs_admin を使います。 ext系で言うと、 tune2fs コマンドにあたります。

  • xfs_admin -u デバイス名 ・・・ UUIDを表示
  • xfs_admin -U デバイス名 ・・・ UUIDを設定
  • xfs_admin -l デバイス名 ・・・ ラベルを表示
  • xfs_admin -L デバイス名 ・・・ ラベルを設定
sudo xfs_admin -U `uuidgen` /dev/sdb1
Clearing log and setting UUID
writing all SBs
new UUID = 6774ad78-fd02-417d-b717-f08c2b29214f

sudo xfs_admin -L "test" /dev/sdb1 
writing all SBs
new label = "test"

sudo xfs_admin -ul /dev/sdb1 
UUID = 6774ad78-fd02-417d-b717-f08c2b29214f
label = "test"

ファイルシステムの情報を表示

ファイルシステムの情報を表示は、xfs_info を使います。 ext系で言うと、 dumpe2fs コマンドにあたります。

xfs_info /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=264000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0 rmapbt=0
         =                       reflink=0
data     =                       bsize=4096   blocks=1056000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

ファイルシステムのバックアップ・リストア

ファイルシステムの情報を表示は、xfsdump xfsrestore を使います。 (xfsのあとにハイフンはつかないので注意) ext系で言うと、 dump restore コマンドにあたります。

バックアップ

sudo xfsdump -l 0 -L test -f /tmp/test /dev/sdb1
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.6 (dump format 3.0) - type ^C for status and control
xfsdump: level 0 dump of XXXXXXXXXXXXX:/mnt/disk
xfsdump: dump date: Tue Oct 15 00:29:24 2019
xfsdump: session id: 
xfsdump: session label: "test"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 25216 bytes
xfsdump: /var/lib/xfsdump/inventory created

 ============================= media label dialog =============================

please enter label for media in drive 0 (timeout in 300 sec)
 -> test
media label entered: "test"

 --------------------------------- end dialog ---------------------------------

xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 21880 bytes
xfsdump: dump size (non-dir files) : 544 bytes
xfsdump: dump complete: 6 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /tmp/test.txt OK (success)
xfsdump: Dump Status: SUCCESS

リストア

xfsrestore -f /tmp/test -L test /tmp/restore/test
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.6 (dump format 3.0) - type ^C for status and control
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: examining media file 0
xfsrestore: reading directories
xfsrestore: 1 directories and 1 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /tmp/test OK (success)
xfsrestore: Restore Status: SUCCESS
ls /tmp/res/
test.txt

XFSとext系ファイルシステムの管理コマンドの比較

こちらのページに見やすい比較表がありました。 http://www.intellilink.co.jp/article/column/oss-rh02.html

参考

http://www.intellilink.co.jp/article/column/oss-rh02.html

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-xfs#xfscreating

macでたまに 英数<->かな の切り替えができなくなる問題が発生した

最近、macを使っていると、英数<->かなの切り替えができなくなることがある。

現象としては、

  • 何度か連打しているとたまに切り替わる
  • PCを再起動すると直る
  • ことえり -> Google日本語入力にしても同じ
  • 切り替えができないときは、ファンが唸っている
  • 別のキーボードでも同じ

1日1回あるかないかくらいだったので、これまでPCを再起動して対応していたが、流石に今後も再起動し続けるのは厳しいので原因を確認した。

※ ちなみに、根本原因は未解決です。

macの負荷を見てみる

sudo htop

CPUの使用率でソートすると、

/System/Library/CoreServices/SystemUIServer.app/Contents/MacOS/SystemUIServer というプロセスが一番上にくる。(使用率65%前後)

シュッと調べてみると、以下の記事がヒットした。

qiita.com

SystemUIServer スクリーン上部のメニューバーを司るプロセス とのこと。

この記事を書いた方は、 SystemUIServer の負荷が上がったときに、メニューバーが動かなくなってしまったらしい。

こちらも試しに、切り替えができない状態でメニューバーを触ってみたが確かに反応しない。

SystemUIServer MacOSのどこで監視されているのかわらんけど、プロセスをkillするとまた上がってくるようになっているっぽいので、雑に htop 上から kill(TERM) してみる。

そうすると、また、プロセスが復活してきて・・・

  • ファンが止まり
  • メニューバーも動くようになり
  • 英数<->かなの切り替え

ができるようになった!!

とりあえず、原因はこれっぽい。

しかし、なぜこれが発生するようになったのだろう。

我々はその謎を解明すべくアマゾンの奥地へと向かった。