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

【Linux】psコマンド

毎回オプションを忘れてしまう、同じものしか使ってないので覚書

出来事

Oracle Exadataを使用しているが、Oracle Linux uek4.x で発生する mellanoxドライバの不具合での再起動する予兆を検知するために psコマンドを使用したので、その時のメモ

Oracle Exadataでは Oracle.Exawatcherが動いているが、そこで取得している psコマンドのオプションは『-elf』

[root@host ~]# ps -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 - 32068 ep_pol  6月30 ?      00:15:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1 S root         2     0  0  80   0 -     0 kthrea  6月30 ?      00:00:04 [kthreadd]
1 I root         4     2  0  60 -20 -     0 worker  6月30 ?      00:00:00 [kworker/0:0H]

いつも psコマンドで確認する時に使用していたオプションは『-ef』もしくは『aux』でした。
とくに、これって理由がなかったけど昔教えられたままだったので改めて、ステータスとか見れるから『ef』だけよりいいかなと思った。

[root@host ~]#  ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  6月30 ?      00:15:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2     0  0  6月30 ?      00:00:04 [kthreadd]
root         4     2  0  6月30 ?      00:00:00 [kworker/0:0H]

[root@host ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 128272  6588 ?        Ss    6月30  15:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S     6月30   0:04 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<    6月30   0:00 [kworker/0:0H]
オプション 説明
a 全てのプロセスの集合に対して課される。このオプションを指定すると、psは端末(tty)を持つ全てのプロセスをリストする。また xオプションと共に指定すると、全てのプロセスをリストする。
-e 全てのプロセスを選択する。
x psは呼び出したユーザの所有する(psと同じ EUIDの)全てのプロセスをリストする。また aオプションと共に指定すると、全てのプロセスをリストする
-f 完全なフォーマットでリストする。
-l 長いフォーマット。-yオプションは、このオプションと組み合わせることで、しばしば役立つ。
u ユーザ指向のフォーマット
-y
[root@host ~]# ps -elfy
S UID        PID  PPID  C PRI  NI   RSS    SZ WCHAN  STIME TTY          TIME CMD
S root         1     0  0  80   0  6588 32068 ep_pol  6月30 ?      00:15:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
S root         2     0  0  80   0     0     0 kthrea  6月30 ?      00:00:04 [kthreadd]
I root         4     2  0  60 -20     0     0 worker  6月30 ?      00:00:00 [kworker/0:0H]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

チートシートまとめ

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

OpneJDK8 ビルド on CentOS7_x86_64

OpenJDK8 をソースコードからビルド

参考:http://hg.openjdk.java.net/jdk/jdk/file/tip/doc/building.md

必要パッケージ導入

"開発者ツール"をグループインストール
(*) OSインストール時に"開発者ツール"にチェックをいれた場合は作業不要

# yum groupinstall -y "Development Tools"

openjdkビルドに必要な依存パッケージ導入
ブートストラップJDKは以前のメジャーリリースのJDKを使用する(OpenJDK7)
(参考)http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html#setup

# yum install -y java-1.7.0-openjdk-devel
# yum install -y libXtst-devel libXrender-devel cups-devel freetype-devel alsa-lib-devel libXt-devel fontconfig-devel

ソースコードDL

バージョン管理ツール Mercurial インストール

# yum install -y mercurial

### バージョンが 2.6.3 より古い場合は 本家 Mercurial から rpm 直 DL &インストール
# curl -OL https://www.mercurial-scm.org/release/centos7/RPMS/x86_64/mercurial-4.9-1.x86_64.rpm
# rpm -Uvh mercurial-4.9-1.x86_64.rpm

ビルド用のホームディレクトリを /usr/local/src/openjdk8 とする場合

# cd /usr/local/src
# hg clone http://hg.openjdk.java.net/jdk8u/jdk8u openjdk8u
# cd openjdk8u
# chmod +x get_source.sh
# ./get_source.sh

configureスクリプト実行

# cd /usr/local/src/openjdk8u
# chmod +x configure
# ./configure

makeスクリプト実行

# cd /usr/local/src/openjdk8u
# make images

ビルドされたJDKの検証

build/linux-x86_64-normal-server-release/images/j2sdk-image 配下にビルド成果物が生成される(JREは j2jre-image 配下)
生成された新たなjavaコマンドバイナリでバージョン確認して検証する

# cd /usr/local/src/openjdk8u
# cd ./build/linux-x86_64-normal-server-release/images/j2sdk-image
# ./bin/java -version
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

インフラエンジニアの教科書2 まとめ ~Part1~

今後アウトプットのために、技術書を簡単にまとめることにした。
今回は「インフラエンジニアの教科書2」をまとめてみました。
とりあえず2章までですが、質問や指摘等あれば遠慮なく!!

1章 プロトコル

インターネットに関するプロトコルとして、「TCP/IP参照モデル」と「OSI参照モデル」が簡単に紹介されていた。個人的には、この章の理解度が一番低いように思われる。
TCP/IP参照モデルの、TCP/UDP、IPについては個別の説明が書かれていた。(少しだけ)

トランスポート層

  • TCP
    • TCPはデータが相手に届いたかどうかを確認する
    • パケットを送る際に、都度シーケンスナンバーを発行。受取手も常に、受信確認パケットを返す。
    • データが相手に届かない or エラーが発生した時は、データの再送をする
    • シーケンス番号があるので、パケットの順番が異なった時に並び替える。また重複した時は、除去を行う
      • コネクション開始
      • 3ウェイハンドシェイク
        • SYN(クライアント→サーバ)
        • ACK+SYN(サーバ→クライアント)
        • ACK(クライアント→サーバ)
      • コネクション終了
        • FIN+ACK(クライアント→サーバ)
        • ACK(サーバ→クライアント)
        • FIN+ACK(サーバ→クライアント)
        • ACK(クライアント→サーバ)
      • SYN,ACK,FINなどは、TCPヘッダー内にある制御ビッドに含まれる。
  • UDP
    • 送信元は、受信先にコネクションを張らずに、いきなり一方的に送りつける。データは、送信先に届く保証はなく、また正常に届いても送信先から返答があるわけではない。
    • 低品質で高速なプロトコルと言われる。DNSやNTPといった早い応答が重要なサービスや、一部の情報がかけても問題のないアプリケーションなどで用いられる。

インターネット層

  • IP
    • IPアドレスについて
      • ネットワーク部とホスト部に分けられる
      • ネットワーク部は、各ネットワークに対して固有に割り振られる
      • ホスト部は各組織で自由に割り振ることが可能

2章 OS

結構長かった。OSについての基礎知識が書かれていたので、つらつらとまとめる。

プロセスとスレッド

  • プロセス
    • OSでの処理の最小実行単位
    • プロセスに含まれる要素
      • PID
      • 実行コード
      • 変数
      • ファイル記述子
      • コンテキスト(CPUの持つレジスタ情報、物理メモリのアドレッシング等)
      • (スレッド)
  • ファイル記述子
    • プロセスから開かれているファイルを識別するために割り当てられる0以上の整数値のこと
    • 0~2は、標準入力、標準出力、標準エラー出力としてデフォルトで割り当てられている
  • プロセスの親子関係と新しいプロセスの生成
    • 新しいプロセスを生成する場合は、すでにあるプロセスをコピーすることで生成する
    • この時、コピー元を親プロセス、新規作成されるプロセスを子プロセス呼ぶ
    • Linux系OSの場合、OS起動時に生成されるプロセスはinitプロセスであり、全てのプロセスはinitプロセスの子孫である
    • プロセスのコピーはfork()
    • プログラムの実行はexec()
    • 例えば、bashからlsを実行する時は、
    • 1.bashプロセスがforkされる2.子プロセスがlsをexecする3.親プロセスは子プロセスの実行を待つ(子プロセスは実行終了と同時になくなる)
  • プロセス間通信
    • いわゆるパイプといわれるものでデータを受け渡す
    • cat hoge | grep text|
  • プロセスの状態遷移
    • 様々な状態がある
      • 実行中
      • 実行待ち(実行待ちキューに登録して、CPUリソースが割り当てられるのを待っている状態)
      • 休止中
  • シグナル
    • ユーザーはシグナルを送ることでプロセスをコントロールできる
    • シグナルを受け取ったプロセスは現在実行中の処理を中断し、シグナルに応じた処理を実行する。
    • kill コマンドは、指定したシグナルを指定したプロセスまたはプロセスグループへ送る。 シグナルが指定されない場合、TERMシグナルを送る。
    • シグナルの例(https://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230806/)
      • SIGHUP(終了して再起動)
      • SIGINT(割り込み)
  • プロセスの終了
    • プロセスが終了すると、ゾンビプロセスになる
    • 親プロセスがwait()システムコールを呼ぶと、ゾンビプロセスが消滅する
  • スレッド
    • 並列処理を目的にして、プロセス内に作られるタスクの実行単位
    • スレッドは同じプロセス内にある各スレッドがメモリ空間を共有できる

OSによるプロセス処理の仕組み

  • タイムスライス
    • OSは実行待ちのプロセスに順次CPUリソースを割り当てていく
  • コンテキストスイッチ
    • CPUがあるプロセスから別のプロセスに割当先を変える時に発生する
    • プロセスに割り当てられた時間を使い切る or I/O待ちなどで、自発的にCPUを手放す際に発生する
    • CPUの各種レジスタ、プログラムカウント、スタックポイントがスタック領域に退避される
    • コンテキストスイッチはOSにとって、負荷の高い処理
    • 実行待ち状態のプロセスを減らすことが大切→コンテキストスイッチの数が減る
      • CPUのコア数を増やす
      • サーバを増加させて、プロセスを分散されるなど
    • Copy on Write(CoW)
      • 子プロセスを生成する時に、親プロセスをコピーするのは負荷が大きい
      • よって、生成された時点では、親プロセスへの参照リンクだけを貼る
      • 実際にプロセスに変更があった時に初めて、親プロセスをコピーしてくる
    • アフィニティ
      • プロセスごとに割り当て可能なCPUコアのグループを指定することができる
      • taskset コマンドというものがあるらしい

プロセス管理に当たって気をつけること

  • コンテキストスイッチの発生を抑える
    • 頻繁にコンテキストスイッチが発生する環境では応答速度が落ちる
    • 実行待ちのプロセスを減らすことで、コンテキストスイッチの発生を抑えることが好ましい

メモリ管理

  • 簡単まとめ
    • プロセスがメモリアクセスを行う場合は仮想メモリを通して。物理メモリに直接アクセスしない。
    • メモリの割り当てと解放を繰り返すと、メモリ空間内が徐々に断片化されていく
    • 空き物理メモリが不足していると、スワップアウトが発生する
    • 物理メモリが不足していなくても、断片化によってまとまった物理メモリ領域を確保できない場合もスワップアウトが発生する場合がある
    • 複数のCPUソケットを扱うサーバの場合、NUMAという仕組みでメモリを扱う
      • 同一NUMAノード内の物理メモリには高速でアクセスが可能
  • 物理メモリと仮想メモリ
    • プロセスがOSに対してメモリ割り当てを要求。OSは仮想メモリのアドレスを返す
    • 仮想メモリ取得時に、物理メモリと仮想メモリとがマッピングされる
      • 物理メモリの領域が確保できないときは、スワップ領域からマッピングされる。
      • 物理メモリと仮想メモリのマッピングはCPUに組み込まれたMMU(Memory Management Unit)によって行われる
      • アドレスマッピングのテーブルは物理メモリ上に置かれる
  • スワップ
    • スワップアウト
      • 確保しようとする仮想メモリと対応した物理メモリが確保できない場合、OSはすでに割り当てられている物理メモリをスワップ領域に追い出して、物理メモリを確保する。
    • スワップイン
      • 逆に、追い出したデータが必要になり、スワップ領域から物理メモリにデータが戻されること
  • ページング
    • ページと呼ばれる固定サイズでメモリ空間を分割する単位
    • 物理メモリとディスクデバイスとの間でページの出し入れが行われることをページングと呼ぶ
    • 一般的には4KB
    • ページアウト、メモリ領域を確保するために使われる
    • ページイン、直ちに使われるデータがディスクから物理メモリに呼ばれている(時間かかる)
  • NUMA(非対称メモリアクセス)
    • NUMA(Non-Uniform Memory Access)
    • 複数のCPUソケットを搭載したサーバは、NUMAノードと呼ばれるCPUとメモリが組み合わさったグループが構成される
    • 同一ノード内のメモリにアクセスするときは高速にアクセスできる。(アプリケーションがNUMAノード内に搭載されている物理メモリ量より大きなメモリを使うときは、別のNUMAノードのメモリを使わざるを得ず、性能が低下する)

OSによるメモリ処理の仕組み

  • ページキャッシュ
    • ディスクから読み込んだデータを捨てずに、メモリにキャッシュするOSの機能
    • OSはメモリをページ単位でキャッシュするため、ページキャッシュと呼ばれる
    • ページキャッシュが増えることで、ディスクI/Oがへり、一般的にはサーバのパフォーマンスは向上する
  • 空き物理メモリが足りなく見える
    • 物理メモリ量が数値上はパツパツに見えても、物理メモリのほとんどがキャッシュとして使われている場合もある
    • キャッシュは空きメモリとしてみなせる
    • キャッシュ
      • ページキャッシュ(ファイルのページ単位でのキャッシュ)
      • バッファキャッシュ(ディスクのブロック単位のキャッシュ)
$ free
             total       used       free     shared    buffers     cached
Mem:        713444     649936      63508      12320      36096     331528
-/+ buffers/cache:     282312     431132
Swap:       735228        120     735108

-/+ buffers/cache の欄が、実質的に考えて良いメモリ(usedが使われている、freeは空きメモリ)

ファイル管理

  • ファイルのメタデータ
    • OSでファイルを扱うためには各ファイルに対応したメタデータが必要
    • Linuxではinodeテーブルに保存される
    • メタデータ(一部)
      • ファイルサイズ
      • ファイルの種類
      • 保存先
      • 作成者
      • グループ
      • パーミッション情報
    • Linuxにおいては、inodeテーブルにはファイル名は保存されない
      • ディレクトリエントリの中に、ファイル名が記載される
  • ファイルシステム
    • ファイルシステムとはOS内でディスク管理を行う機能
      • ext4、NTFSなどのさまざまな種類が存在
    • 分散ファイルシステム
      • ファイルシステムはネットワーク経由でも利用できる
      • 他のサーバやストレージ上に構築されているファイルシステムをネットワーク越しに利用できるようにしたものを分散ファイルシステムという
      • 分散ファイルシステムはNFS(UNIX/Linux)プロトコルでマウントして使う

Linux/UNIXのファイル管理

  • ファイルのメタデータ
    • LinuxやUNIXではinodeと呼ばれるメタデータを用いる
    • statなどで、メタデータ確認可能
$ stat temp
  File: `temp'
  Size: 6           Blocks: 8          IO Block: 4096   通常ファイル
Device: 801h/2049d  Inode: 1579860     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/  hoge)   Gid: (  502/  hoge)
Access: 2019-08-11 16:04:35.534875269 +0900
Modify: 2019-08-11 16:03:57.240834953 +0900
Change: 2019-08-11 16:03:57.240834953 +0900
  • ディレクトリエントリ
    • inodeにはファイル名やディレクトリ名の情報が含まれない
    • ファイル名やディレクトリ名の情報はディレクトリエントリに含まれる
    • ディレクトリエントリとはディレクトリを作成した時に、ディレクトリ自体に書かれる情報
    • ディレクトリエントリは、inode番号とファイル名かディレクトリ名が含まれている
    • ls -iで確認可能
$ ls -i
1579879 a  1579980 b  1587159 c  1587165 d
  • 使用中ファイルの削除
    • ファイル削除
      • 1.ディレクトリエントリからの削除
      • 2.inodeテーブルからの削除
    • Linuxはファイルがプロセスからオープンされている状態であってもファイル削除の操作はできる
    • ただし、その場合1のみが行われる
    • 2は、全てのプロセスからファイルがクローズされた後に行われる
    • プロセスがファイルOPENするときは、inode番号で識別する
  • シンボリックリンクとハードリンク
    • シンボリックリンク
      • ファイル名でリンクを貼る
      • 元のファイル名やディレクトリ名が削除されると、シンボリックリンクは残るがリンク切れの状態になる
      • オリジナルファイルとシンボリックリンクでは異なるinode番号が付与される
    • ハードリンク
      • ファイルにのみ、ハードリンクが可能
      • オリジナルファイルとハードリンクでは同じinode番号が付与される

実際の挙動の違い

$ echo "hoge" > origin

$ ln -s origin symlink

$ ln origin hardlink

$ ls -i
1587166 hardlink  1587166 origin  1587167 symlink

$ stat symlink
File: `symlink' -> `origin'
Size: 6             Blocks: 0          IO Block: 4096   シンボリックリンク
Device: 801h/2049d  Inode: 1587167     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  501/  hoge)   Gid: (  502/   hoge)
Access: 2019-08-11 16:23:18.115096895 +0900
Modify: 2019-08-11 16:23:06.499174475 +0900
Change: 2019-08-11 16:23:06.499174475 +0900

$ stat origin
File: `origin'
Size: 5             Blocks: 8          IO Block: 4096   通常ファイル
Device: 801h/2049d  Inode: 1587166     Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  501/  hoge)   Gid: (  502/   hoge)
Access: 2019-08-11 16:22:54.311206857 +0900
Modify: 2019-08-11 16:22:54.311206857 +0900
Change: 2019-08-11 16:23:14.281792721 +0900

#ハードリンクは通常ファイルとして扱われる
$ stat hardlink
File: `hardlink'
Size: 5             Blocks: 8          IO Block: 4096   通常ファイル
Device: 801h/2049d  Inode: 1587166     Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  501/  hoge)   Gid: (  502/   hoge)
Access: 2019-08-11 16:22:54.311206857 +0900
Modify: 2019-08-11 16:22:54.311206857 +0900
Change: 2019-08-11 16:24:43.229857105 +0900

$ rm origin

#ハードリンクは参照可能(つまり、inodeはファイルなり、プロセスなり、参照されている場合は、inode tableから削除されないということ)
$ cat hardlink
hoge

$ cat symlink
cat: symlink: そのようなファイルやディレクトリはありません

$ ln hardlink origin

$ ls -i
1587166 hardlink  1587166 origin  1587167 symlink

#シンボリックリンクはファイル名でリンクしている
$ cat symlink
hoge

$ cat > hardlink
changed

$ cat origin
changed

$ cat symlink
changed
  • バインドマウント
    • Linuxではバインドマウントにより、ディレクトリのマウントが可能(細かいことはちょっとわかってない)
$ sudo mount --bind origin copy

$ touch origin/hoge

$ ls copy
hoge
  • ファイルシステムのマウント

    • ハードディスクやDVD-ROMなどの記録媒体へは、ファイルシステムとしてマウントすることでアクセスが可能になる
  • その他

    • ファイルを消しても空き容量が増えない
      • ファイルをopenしているプロセスがあるのかも
      • ファイルをopenしているプロセスIDを特定したい場合は、lsofコマンドを使う
$ sudo lsof temp
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
tail    22105 hoge    3r   REG    8,1        6 1579860 temp
  • ディスク容量に空きがあるのにファイルを生成できない
    • inodeの枯渇が原因かも

ディスクについての情報

$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda1       51473368 21692624  27159952  45% /

ディスクのinodeについての情報

$ df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1      3276800 410726 2866074   13% /
  • ログ出力でディスク容量を使い果たした

    • ログ出力をしているプロセスを停止してから、ログファイルを削除
    • 他の大きいパーティションにログファイルを移動してから、シンボリックリンクを貼る
    • プロセスを停止できない場合、既存のログファイルをコピーした後、 /dev/nill をログファイルにコピーしてログファイルをの中身をからにする方法もある
    • よくある失敗
      • ログファイルをmvで他のパーティションに退避した後に、同じファイル名でログファイルを作成すること
        • プロセスがオープンしているログファイルのinode番号と新しく生成したファイルのinodeが異なるので、プロセスは新しいファイルに書き込まない
        • また、古いファイルは解放されていないので、空きデスク量は増えない
  • 想定よりハードディスクの空き容量が少ない

    • ext3/4などのファイルシステムでは、リザーブ領域と呼ばれるrootしか使えない専用領域がデフォルトで5%確保されている
    • tune2fsコマンドでリザーブ領域を0%にすると、全ての領域が使えるようになる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Bashのコンソール上でよく使う操作まとめ[カーソル移動、文字の削除、履歴保管など ]

概要

 プログラミングやファイルの操作などでCUIでの操作をメインにするようになると、ターミナルでの操作を1日に数百回、数千回の単位で行うようになります。
 そのときに今まで限られたショートカットしか使っていなかったのですが、ショートカットを使って効率化できると、時間の節約になると思い、まとめていみました。

環境

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

 ターミナル(bash)上でman bash を入力することでbashの説明を見ることができます。
 今回は、キーバインドをみたかったので、
/key bindingsで検索すると目的の箇所を見ることができます。

カーソル移動、文字の削除

Ctrl+A,E,U,Kだけでもだいぶ楽になります。

man bash での説明
カーソル移動について
image.png

文字の削除、コピーについて
image.png

参考
https://qiita.com/odacoh/items/b94be0deecaaa27b0263
http://yonchu.hatenablog.com/entry/20110214/1297662332

よく使うキー 動作
Ctrl + A カーソルを先頭に移動
Ctrl + E カーソルを末尾に移動
ESC + F カーソルを1単語進める
ESC + B カーソルを1単語戻る
Ctrl + U カーソル位置から行頭までを削除
Ctrl + K カーソル位置から行末までを削除 
Ctrl + W カーソル位置から単語の先頭までを削除
ESC + D カーソルから単語の末尾まで削除

ESCを使う操作での注意

ESC + F,Bの操作で戸惑ったのは、連続で複数の単語間を移動したい場合に、

例えばこの例で、行末からcpまで移動したい場合

$ mv fileA dirB & cp fileC dirB

ESC を押しっぱなしにして、Bを2回連続でいくと、2回目のbは普通の入力とと判定されてしまうので、

mv fileA dirB & cp fileC bdirB

というように、1単語分戻ったあと、bが入力されてしまうことになります。 
 
 そのため、2単語分戻りたい場合は、Esc+b Esc+bともう一度Escキーから指を話してキーを押しなおす必要があります。

雑感:一文字の移動、操作について

また、僕は一文字進めるぐらいなら矢印キーを使ってもかわらない気もするので、Ctrl+B,Ctrl+Fなどは使っていませんが、常にホームポジションから動かずに全ての操作をしたいという人には一文字移動や、一文字削除のキーバインドも覚えるといいと思います。

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

Bashのコンソール上でよく使う操作まとめ[カーソル移動、文字の削除 ]

概要

 プログラミングやファイルの操作などでCUIでの操作をメインにするようになると、ターミナルでの操作を1日に数百回、数千回の単位で行うようになります。
 そのときに今まで限られたショートカットしか使っていなかったのですが、ショートカットを使って効率化できると、時間の節約になると思い、まとめていみました。

環境

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

 ターミナル(bash)上でman bash を入力することでbashの説明を見ることができます。
 今回は、キーバインドをみたかったので、
/key bindingsで検索すると目的の箇所を見ることができます。

カーソル移動、文字の削除

Ctrl+A,E,U,Kだけでもだいぶ楽になります。

man bash での説明
カーソル移動について
image.png

文字の削除、コピーについて
image.png

参考
https://qiita.com/odacoh/items/b94be0deecaaa27b0263
http://yonchu.hatenablog.com/entry/20110214/1297662332

よく使うキー 動作
Ctrl + A カーソルを先頭に移動
Ctrl + E カーソルを末尾に移動
ESC + F カーソルを1単語進める
ESC + B カーソルを1単語戻る
Ctrl + U カーソル位置から行頭までを削除
Ctrl + K カーソル位置から行末までを削除 
Ctrl + W カーソル位置から単語の先頭までを削除
ESC + D カーソルから単語の末尾まで削除

ESCを使う操作での注意

ESC + F,Bの操作で戸惑ったのは、連続で複数の単語間を移動したい場合に、

例えばこの例で、行末からcpまで移動したい場合

$ mv fileA dirB & cp fileC dirB

ESC を押しっぱなしにして、Bを2回連続でいくと、2回目のbは普通の入力とと判定されてしまうので、

mv fileA dirB & cp fileC bdirB

というように、1単語分戻ったあと、bが入力されてしまうことになります。 
 
 そのため、2単語分戻りたい場合は、Esc+b Esc+bともう一度Escキーから指を話してキーを押しなおす必要があります。

雑感:一文字の移動、操作について

また、僕は一文字進めるぐらいなら矢印キーを使ってもかわらない気もするので、Ctrl+B,Ctrl+Fなどは使っていませんが、常にホームポジションから動かずに全ての操作をしたいという人には一文字移動や、一文字削除のキーバインドも覚えるといいと思います。

Metaキーの変更

上にスクショしたbashのマニュアルをみて貰えばわかりますが、ESCキーを押しましょうと僕が書いているところは、マニュアルではM-と表記してあります。

これは、Metaキーの略です。

 Metaキーが標準ではESCに割り当てられているみたい(Altキーにも割り当て?)なので、説明ではESC+と書いていたのですが、ESCキーはキーボードの一番左上にあるので、押しにくいですよね。

 しかもESCを使う操作での注意 で書いたように連続しての入力の際に、いちいちキーを押しなおす必要があるという欠点があります。

 これらの問題は、Metaキーをoptionにも割り当てることで解決されます。

参考:http://playet.jugem.jp/?eid=167

ターミナル -> 環境設定 -> プロファイル -> キーボード で

メタキーとしてOptionキーを使用にチェックを入れるとOptionキーがMetaキーとして使えるようになります。

image.png

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

【新人向け】Linuxマシンの名前解決の仕組み

記事を書く目的

Virtualbox上にあるOracle DBにリスナーを登録するとき、なかなかうまくいかなかった。
うまくいかない原因を突き止めるには、Linuxでどのように名前解決を行っているかを理解する必要があったため、備忘録として記録しておく。

名前解決とは

ホスト名とIPアドレスを対応付けること。

名前解決とは、ソフトウェアなどが扱う対象の識別名と、その名前が指し示している実体を対応付ける処理や操作のこと。TCP/IPネットワークでドメイン名やホスト名と対応するIPアドレスを対応付けるDNS名前解決が特に有名。
- IT用語辞典より引用

例えば、Amazonを使って買い物をしようとするとき、
https://www.amazon.co.jp/
https://54.239.25.208
という2つのアドレスがあるとする。
私たち人間(ユーザ)にとってわかりやすいのは、間違いなく前者であろう。
しかし、コンピュータにとっては、後者の方がわかりやすい(というか前者はコンピュータにはわからない)。
よって、名前とIPアドレスを対応付ける必要がある。

Linuxで名前解決を行う仕組み

以下では、Linuxでどのように名前解決が行われているのかを明らかにするために、名前解決に関連するファイルをまとめた。

大まかな名前解決の流れは、以下の通り。

リゾルバ(resolver)がnsswitch.confで名前解決の順序を確認
             ↓
指定された順番通りにファイル/サーバの内容をチェックする

/etc/nsswitch.conf

nssとは、Name Service Switchの略。resolver(名前解決をするソフトウェア)が使用する設定ファイルで、名前解決に使用する順序が記されている。

[oracle@host01 ~]$ cat /etc/nsswitch.conf 

・・・(中略)・・・

#hosts:     db files nisplus nis dns
hosts:      files dns

・・・(中略)・・・

注目するのは、hostsの部分。
この場合、優先順位がfilesdnsとなっているので、
「まず/etc/hostsを見て、解決しなかったらDNSサーバに問い合わせてね」という順序を表している。

/etc/hosts

上記でも出てきたが、hostsは、IPアドレスとホスト名の対応付けをするテキストファイルである。

hosts(ホスツ)とは、TCP/IPを利用するコンピュータにおけるホスト名のデータベースで、IPアドレスとホスト名の対応を記述したテキストファイルである。
- wikipediaより引用

[oracle@host01 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.101 host01 host01.example.com

問題の切り分けを行う際、以下の事項を確認した。
1. tnsnames.oralistener.oraを確認
HOST名・ポート番号ともに一致していた。
2. ping host01.example.comを実施

届かない。どうやら、ホストの名前解決がうまくいっていないようだと判断。

hostsの編集

今回は仮想環境上でDBを動かしているので、ホストをlocalhostとする。
host01.example.comを以下のように修正した。

[oracle@host01 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 host01.example.com
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#192.168.56.101 host01 host01.example.com

リスナーの起動

[oracle@host01 ~]$ lsnrctl start


LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 11-8月 -2019 14:35:18

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

/u01/app/oracle/product/12.1.0/dbhome_1/bin/tnslsnrを起動しています。お待ちください...

TNSLSNR for Linux: Version 12.1.0.1.0 - Production
システム・パラメータ・ファイルは/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.oraです。
ログ・メッセージを/u01/app/oracle/diag/tnslsnr/host01/listener/alert/log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host01.example.com)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for Linux: Version 12.1.0.1.0 - Production
開始日                    11-8月 -2019 14:35:18
稼働時間                  0 日 0 時間 0 分 0 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
ログ・ファイル            /u01/app/oracle/diag/tnslsnr/host01/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
サービスのサマリー...
サービス"orcl.us.oracle.com"には、1件のインスタンスがあります。
  インスタンス"orcl"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

リスナーの登録がうまくいった!
やはり原因は、ホスト名の名前解決がうまくいっていなかったからだった。

192.168.56.***とは?

それでは、今回悪さをしていた192.168.56.***とは一体何か?
その正体は、Virtualboxのホストオンリーアダプターのネットワーク帯域(デフォルト)だった。
今回のエラーの根本的な原因は、Virtualbox上でいろいろといじっている間に、ホスト名のIPアドレスを変に設定してしまったことだと考える。

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

Linuxマシンの名前解決の仕組み

記事を書く目的

Virtualbox上にあるOracle DBにリスナーを登録するとき、なかなかうまくいかなかった。
うまくいかない原因を突き止めるには、Linuxでどのように名前解決を行っているかを理解する必要があったため、備忘録として記録しておく。

名前解決とは

ホスト名とIPアドレスを対応付けること。

名前解決とは、ソフトウェアなどが扱う対象の識別名と、その名前が指し示している実体を対応付ける処理や操作のこと。TCP/IPネットワークでドメイン名やホスト名と対応するIPアドレスを対応付けるDNS名前解決が特に有名。
- IT用語辞典より引用

例えば、Amazonを使って買い物をしようとするとき、
https://www.amazon.co.jp/
https://54.239.25.208
という2つのアドレスがあるとする。
私たち人間(ユーザ)にとってわかりやすいのは、間違いなく前者であろう。
しかし、コンピュータにとっては、後者の方がわかりやすい(というか前者はコンピュータにはわからない)。
よって、名前とIPアドレスを対応付ける必要がある。

Linuxで名前解決を行う仕組み

以下では、Linuxでどのように名前解決が行われているのかを明らかにするために、名前解決に関連するファイルをまとめた。

大まかな名前解決の流れは、以下の通り。

リゾルバ(resolver)がnsswitch.confで名前解決の順序を確認
             ↓
指定された順番通りにファイル/サーバの内容をチェックする

/etc/nsswitch.conf

nssとは、Name Service Switchの略。resolver(名前解決をするソフトウェア)が使用する設定ファイルで、名前解決に使用する順序が記されている。

[oracle@host01 ~]$ cat /etc/nsswitch.conf 

・・・(中略)・・・

#hosts:     db files nisplus nis dns
hosts:      files dns

・・・(中略)・・・

注目するのは、hostsの部分。
この場合、優先順位がfilesdnsとなっているので、
「まず/etc/hostsを見て、解決しなかったらDNSサーバに問い合わせてね」という順序を表している。

/etc/hosts

上記でも出てきたが、hostsは、IPアドレスとホスト名の対応付けをするファイル。

hosts(ホスツ)とは、TCP/IPを利用するコンピュータにおけるホスト名のデータベースで、IPアドレスとホスト名の対応を記述したテキストファイルである。
- wikipediaより引用

[oracle@host01 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.101 host01 host01.example.com

問題の切り分けを行う際、以下の事項を確認した。
1. tnsnames.oralistener.oraを確認
HOST名・ポート番号ともに一致していた。
2. ping host01.example.comを実施

届かない。どうやら、ホストの名前解決がうまくいっていないようだと判断。

hostsの編集

今回は仮想環境上でDBを動かしているので、ホストをlocalhostとする。
host01.example.comを以下のように修正した。

[oracle@host01 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 host01.example.com
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#192.168.56.101 host01 host01.example.com

リスナーの起動

[oracle@host01 ~]$ lsnrctl start


LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 11-8月 -2019 14:35:18

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

/u01/app/oracle/product/12.1.0/dbhome_1/bin/tnslsnrを起動しています。お待ちください...

TNSLSNR for Linux: Version 12.1.0.1.0 - Production
システム・パラメータ・ファイルは/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.oraです。
ログ・メッセージを/u01/app/oracle/diag/tnslsnr/host01/listener/alert/log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host01.example.com)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for Linux: Version 12.1.0.1.0 - Production
開始日                    11-8月 -2019 14:35:18
稼働時間                  0 日 0 時間 0 分 0 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
ログ・ファイル            /u01/app/oracle/diag/tnslsnr/host01/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
サービスのサマリー...
サービス"orcl.us.oracle.com"には、1件のインスタンスがあります。
  インスタンス"orcl"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

リスナーの登録がうまくいった!
やはり原因は、ホスト名の名前解決がうまくいっていなかったからだった。

192.168.56.***とは?

それでは、今回悪さをしていた192.168.56.***とは一体何か?
その正体は、Virtualboxのホストオンリーアダプターのネットワーク帯域(デフォルト)だった。
今回のエラーの根本的な原因は、Virtualbox上でいろいろといじっている間に、ホスト名のIPアドレスを変に設定してしまったことだと考える。

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

ラズパイ始めました (夏季限定)

はじめに

ラズパイに初めて出会った時に一体なんのことやら?どれを選べば??と思ったことをまとめておきます。

ラズパイを始める方は「とりあえずマウス&キーボードで動かしてみよう」と考える、という先入観で話を進めます。

具体的に以下を記します。

ラズパイ何が違うん?

以下にまとめました。
黄色は比較した結果、メリットが高い項目です。
下線のある項目は注意が必要です。
raspberry比較.png
※ほぼ4BとZeroの比較になってしまいました。。

「とりあえずラズパイ」なら4B、
目的がはっきりしている場合はZero
と考えた方がいいかもしれません。

例えば自動動画再生で「Zero W」を導入しました。
 平日8時半には自動で業務っぽい動画を再生(全自動)
 土日、夜はモニターの画面をOFF。(省電力)
 1台あたり~3000円(安い)
 OS:Raspbian。
 OSごとバックアップ&別のMicroSDへリストアして大量生産(楽)
 再生ビデオだけ入れ替え、モニターごとに違う動画を再生
 モニター画面の後ろに両面テープで張り付け(省スペース)

のような感じです。

サイズについて

サイズ感は以下です。
Zero,Zero W
 65mm × 30mm × 5mm
3B(4B)
 86mm × 57mm × 17mm
元ネタ:https://en.wikipedia.org/wiki/Raspberry_Pi
Raspberry.png
3B、4Bは同じサイズです。正確には「Aタイプ」サイズがありますが
旧機種でスペックも低いためここでは割愛します。

Zeroシリーズは細かく機能が分かれ、サイズが違います。
「W」が付くとWiFi通信ができます。
「h」が付くとヘッダピンが付いてます。(下図)
RaspberryPiZerow_Zerowh.png

ラズパイ型 WiFi ヘッダ 値段 備考
Zero × × 4.66ポンド(~¥700) 最安最軽量。ネットに繋がらないのでセットアップが難しい。
Zero h × 販売しているのは見たことない。
Zero W × 9.3ポンド(~¥1500) スリム。電子工作利用しない場合はお勧めかつ筆者はこれが欲しい。
Zero Wh 13.2ポンド(~¥1800) 良く売っているが値段が高い、スリムさに欠ける。電子工作&ネットワーク利用する方はお勧め

※参考サイト:https://shop.pimoroni.com/

CPU,メモリ,GPUについて

CPU、GPUについて

 工事中。※MIPS、PassMarkなどで定量的に比較したい・・・

メモリ量について

 搭載メモリはCPU,GPUどちらもシェアして使うらしく、
 多いに越したことはないです。
 筆者はラズパイ3Bにhashcatというアプリケーションの導入を目指しましたが
 メモリが足りずにエラーでまくり。
 USBをメモリswap先にしましたがUSB2.0は遅かった。。
 
 4BはUSB3.0なのでswap領域へのアクセス速度も改善されると思います。

画面出力、電源、電力、外部出力コネクタについて

ポイントは差し込み口です。
なんと3Bで使っていたコードが4Bでは使えない・・・!
悲しいです。
コード類がごちゃるの大嫌いな筆者はほんとに勘弁してほしいです。。

画面出力(HDMI)

Raspberry3B、Zero(HDMI).png
 4Bに必要なHDMIはMicroに対し、3Bは標準。
 ZeroはMiniHDMIとまったく統一感ありません。
 標準的なコードにMiniやMicroのアダプタを買う必要があります。
HDMI.png

電源(USB)

Raspberry3B、Zero(電源).png
 これも3Bと4Bで異なります。
 3B,ZeroはUSB Micro-B、4BはUSB Type-Cです。
usb_types.jpg

電力

 ラズパイは意外と電力を必要とします。
 Type-Bだとスマホ電源などにも採用していることもあり流用しがちです。
 スマホ電源&コード利用は3B、4Bは間違いなく落ちます。
 筆者も舐めてました。専用コードとアダプタを買った方が賢いです。

 消費電力の少ないZero Wの電源をiphoneアダプタにしてみたのですが
 こちらもデスクトップ環境(rasbian Buster)の時は突然落ちてしまいました。。

外部出力コネクタ(データ用USB)

Raspberry3B、Zero(データ).png
 3Bと4Bのデータ用USBは標準的なUSB差し込み口ですが、ZeroはMicro-Bです。
 ラズパイはデータ用と電源用で分かれていますので注意が必要です。
usb_types.jpg

 また、大量のメモリを使用するアプリを動かす際は
 swap領域として4BのUSB3.0×2口はとてもメリットがあります。
※USB2.0は500MB/秒(Mbps)
 USB3.0は5GB/秒(Gbps)
 約10倍の速度差があります。
usb_speed.jpg

まとめ

まずは4Bを買うで問題ないと思います。
海外直販サイトを利用すると安く買えます。
Amazonでも買えます。(多少高く設定されてます)
どこで買うにしろ、コードや冷却チップ込みで買うと最終的に安上がりで無駄がありません。

冷却チップは購入した方がよいです。
4Bは特にCPU熱が高騰し処理速度が下がる、という問題が指摘されています。
冷却は大事なようです。

ここでは割愛しましたが、有線LANも3B→4Bでレベルアップしており、
その辺のパソコンより良いEhternetコネクタ(ギガビットイーサ)です。
3B:100Mbps
4B:10Gbps ※100倍ですよ。。スループットはもう少し下がりますけれど

むしろ普通のノートパソコンにもう少しギガビットイーサ普及してくれないかな。。
周辺機器コネクタはもはやノートPCより良い装備がなされてる気がします。

というより昨今のノートPCはSSDでごまかしてる感が。。
USBとイーサコネクタ良くならないかな。。

おわり

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

今度こそopensslコマンドを理解して使いたい (2) 設定ファイル(openssl.cnf)を理解する

前回: 今度こそopensslコマンドを理解して使いたい (1) ルートCAをスクリプトで作成する

前回はスクリプトでルートCAを作成する際に、識別名などの重要な設定値をコマンドラインで指定しましたが、それ以外はノーマルの設定ファイル(openssl.cnf)の値をそのまま使用していました。

今回はOpenSSLの設定ファイルを理解して、適切な設定ファイルを作れるようになることを目指します。

openssl.cnf.png

設定ファイルの構成

以降の文書中の引用箇所は、以下のOpenSSL公式ドキュメントからの抜粋+和訳です。

デフォルトセクション

設定ファイルの先頭から最初の名前付きセクションの前までを「デフォルトセクション」と言う。

ノーマルのopenssl.cnfでは、ファイル先頭部分にある以下の3行が「デフォルトセクション」の内容になります。

/etc/pki/tls/openssl.cnf
HOME            = .
RANDFILE        = $ENV::HOME/.rnd
oid_section     = new_oids

名前付きセクション

コマンド(opensslのサブコマンド)がどの名前付きセクションを参照するかは、各コマンドのドキュメントに明記されています。例えばcaコマンドは[ ca ]セクションを、reqコマンドは[ req ]セクションを参照し、それらの中で別のセクションが指定されていればそちらも参照します。

以下はノーマルのopenssl.cnfで、caコマンドとreqコマンドが参照するセクションです。

caコマンドを実行
├──[ ca ]
│   └──[ CA_default ]
│       ├──[ usr_cert ]
│       └──[ policy_match ]
└── デフォルトセクション
    └──[ new_oids ]
reqコマンドを実行
├──[ req ]
│   ├──[ req_distinguished_name ]
│   ├──[ req_attributes ]
│   └──[ v3_ca ]
└── デフォルトセクション
    └──[ new_oids ]

上記はあくまでもノーマルのopenssl.cnfを使用した場合で、以下のような方法で自由にカスタマイズすることができます。

  • 名前付きセクションを任意の名前で作ることができる

  • 設定ファイル内の参照先セクションを変更することができる(例: [ ca ]セクション内のdefault_ca =

  • コマンドラインオプションで参照先セクションを指定することができる

    • 設定ファイルの定義をオーバーライドできる
    • コマンドによって、設定ファイルのどの定義をオーバーライドできるかが異なる(例: caコマンドの-nameオプションは設定ファイルのdefault_caをオーバーライドできる)

デフォルトセクションの値

名前付きセクションとデフォルトセクションに同じ名前の設定があった場合について、以下のように規定されています。

設定が参照される時、まず名前付きセクションが調べられ、見つからなければデフォルトセクションが調べられる。

例えば乱数ファイルRANDFILEは、デフォルトセクションで以下のように定義されています。

RANDFILE = $ENV::HOME/.rnd

しかし[ CA_default ]セクションでは以下の設定値が定義されているので、このセクションが参照された場合は下記の設定値が使用され、上記のデフォルト値は無視されます。

[ CA_default ]
RANDFILE = $dir/private/.rand

環境変数

$ENV::nameの書式を使うことで、環境変数を置き換えることがでる。

RANDFILE = $ENV::HOME/.rndという設定は、$ENV::HOMEの部分が環境変数$HOMEに置き換えられるので、RANDFILEのパスは$HOME/.rndになります。

この書式を利用すれば、設定ファイル中の任意の設定値を外部から注入することができます。

例えばCA(認証局)のパスdirの値は、以下のように[ CA_default ]セクションの中でハードコーディングされています。

/etc/pki/tls/openssl.cnf
[ CA_default ]
dir       = /etc/pki/CA     # 全体の保存場所
certs     = $dir/certs      # 発行した証明書をどこに保存するか

このdirの値を環境変数CA_DIRを参照するように変更すれば、1つの設定ファイルで複数のパスを使用できるようになります。

[ CA_default ]
dir       = $ENV::CA_DIR    # 全体の保存場所(環境変数)
certs     = $dir/certs      # 発行した証明書をどこに保存するか

以下は別々のCAのパスをCA_DIRに設定してからcaコマンドを実行する例です。

export CA_DIR="/etc/pki/CA/ca1.mydomain"
openssl ca ...

export CA_DIR="/etc/pki/CA/ca2.mydomain"
openssl ca ...

環境変数の安全な使い方

設定値に含めた環境変数が存在しないと、設定ファイルを読み込もうとした時にエラーが発生する。

上記の場合は、以下のようにデフォルトセクション内でデフォルト値をハードコーディングしておけば、環境変数CA_DIRがあればその値が、なけばデフォルト値が使用されるので、エラーの発生を回避することができます。

/etc/pki/tls/openssl.cnf
CA_DIR    = /etc/pki/CA     # 全体の保存場所(環境変数がない場合のデフォルト値)

[ CA_default ]
dir       = $ENV::CA_DIR    # 全体の保存場所(環境変数)
certs     = $dir/certs      # 発行した証明書をどこに保存するか

その他の書式

全般的な書式に関するトピックを以下に抜粋します。

使用可能文字

セクション名には英数字とアンダースコアを使用できる。

name=valuenameには、英数字と. , ; _などいくつかの記号を使用できる。

変数名の重複

同一セクション内に同じ名前の変数がある場合、最後の値以外は無視される。
識別名のように同じフィールドが複数回定義されるような特殊な場合、通常は名前の先頭から.までを無視することで回避している。以下の例はこの方法でフィールドOUを2つ定義している。
1.OU="My first OU"
2.OU="My Second OU"

ノーマルのopenssl.cnfでは以下の箇所がこれに相当します。

/etc/pki/tls/openssl.cnf
0.organizationName      = Organization Name (eg, company)
0.organizationName_default  = Default Company Ltd

# we can do this but it is not needed normally :-)
#1.organizationName     = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd

変数展開

$varまたは${var}の書式を含む値の文字列は変数展開され、同一セクション内の変数値で置き換えられる。また$section::name${section::name}の書式を使えば、他のセクションの変数値で置き換えることもできる。

環境変数の出力

ENV::nameの書式を使うことで、値を環境変数に割り当てることもできる。

これは$ENV::nameの逆で、設定ファイルの値を環境変数に出力することもできるようです。

エスケープ文字

引用符か\を使って特殊文字をエスケープすることができる。
行末を\にすれば複数行をまたぐことができる。
特殊文字\n \r \b \tが使用できる。

X509 V3 拡張設定

以降の文書中の引用箇所は、以下のOpenSSL公式ドキュメントからの抜粋+和訳です。

critical

拡張セクション内の各行は以下の書式を取る:
extension_name=[critical,] extension_options
criticalがあればその拡張設定は重要である。

criticalはプログラムが設定内容を厳守するように指定しますが、criticalがない場合の動作は各プログラムの実装に依存するようです。
厳密な運用を目指すなら積極的に指定するべきオプションですが、設定ファイルの[ v3_ca ]セクションに以下のコメントが書かれているように、プログラムによっては正常動作を妨げる場合もあるようです。

/etc/pki/tls/openssl.cnf
# PKIXはこれを推奨しているが、いくつかの壊れたソフトウェアが「critical」拡張設定で固まってしまう。
basicConstraints = critical,CA:true
# だから私たちは代わりにこうする。
basicConstraints = CA:true

Basic Constraints(基本制約)

これは証明書がCA証明書かどうかを示す多値の拡張設定で、最初にCA:{TRUE|FALSE}の設定が必須である。CA:TRUEの場合、pathlenに正の数を設定することができる。
例:
basicConstraints=CA:TRUE
basicConstraints=CA:FALSE
basicConstraints=critical,CA:TRUE,pathlen:0

CA証明書にはCA:TRUEの値を設定したbasicConstraintsが必須である。
エンドユーザー証明書はCA:FALSEとするか、またはこの拡張設定を完全に除外する必要があるが、中にはエンドエンティティ証明書にCA:FALSEbasicConstraintsを含むことを要求するソフトウェアもある。

pathlenは証明書チェーン内でこのCAに連なることができるCAの最大数を示す。したがって、pathlen:0のCAはエンドユーザー証明書への署名しかできず、他のCAに署名することはできない。

CA証明書にはbasicConstraints=CA:TRUEが必要で、中間認証局を作る可能性があるなら上位CAの証明書にpathlenオプションも必要です。

サーバー/クライアント証明書にはbasicConstraintsが必須ではないものの、上記の説明を読むと互換正のためにbasicConstraints=CA:FALSEを入れておいた方が無難なようです。

Key Usage(鍵の用途)

これは許可される鍵の使い方の配列を設定する多値の拡張設定である。
設定できる値: digitalSignature nonRepudiation keyEncipherment dataEncipherment keyAgreement keyCertSign cRLSign encipherOnly decipherOnly
例:
keyUsage=digitalSignature, nonRepudiation
keyUsage=critical, keyCertSign

ドキュメントには詳細が記されていませんが、ノーマルのopenssl.cnfには典型的な例として以下の記述があります。

  • クライアント証明書用([ usr_cert ]):
    • keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  • 証明書署名要求用([ v3_req ]):
    • keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  • CA証明書用([ v3_ca ]):
    • keyUsage = cRLSign, keyCertSign

Extended Key Usage(鍵の用途の拡張)

この拡張設定は、証明書の公開キーの用途を示す使用法(オブジェクトの短縮名かOUDのドット区切り数値)の配列で構成されている。以下のPKIX、NSおよびMSの値は特に意味がある。

 値                     意味
 -----                  -------
 serverAuth             SSL/TLS Webサーバ認証
 clientAuth             SSL/TLS Webクライアント認証
 codeSigning            コード署名
 emailProtection        Eメール保護 (S/MIME)
 timeStamping           Trusted Timestamping
 msCodeInd              Microsoft Individual Code Signing (authenticode)
 msCodeCom              Microsoft Commercial Code Signing (authenticode)
 msCTLSign              Microsoft Trust List Signing
 msSGC                  Microsoft Server Gated Crypto
 msEFS                  Microsoft Encrypted File System
 nsSGC                  Netscape Server Gated Crypto

例:
extendedKeyUsage=critical,codeSigning,1.2.3.4
extndedKeyUsage=nsSGC,msSGC

OpenVPNのサーバー/クライアントで試したところ、サーバー側の証明書にextndedKeyUsage = serverAuthがないと、クライアント側から接続することができませんでした。

Subject Key Identifier(サブジェクト鍵識別子)

サブジェクト鍵識別子: 証明書の所有者の公開鍵を識別する値(ハッシュ値)

文字列値でhashを指定すれば、RFC3280のガイドラインに自動的に従う。これ以外の設定は推奨されない。
例:
subjectKeyIdentifier=hash

Authority Key Identifier(認証局鍵識別子)

認証局鍵識別子: 証明書に署名したCAの公開鍵を識別する値(ハッシュ値)

keyidissuerの2つのオプションが使用可能で、どちらもオプション値alwaysを取ることができる。
keyidオプションがある場合、サブジェクト鍵識別子を親証明書からコピーしようとする。 値alwaysがある場合、オプションが失敗するとエラーが返される。
issuerオプションは、発行者の証明書から発行者とシリアル番号をコピーする。これはalwaysフラグが常に値を含まない限り、keyidオプションが失敗するか含まれない場合にのみ行われる。
例:
authorityKeyIdentifier=keyid,issuer

非推奨の拡張設定

これらはNetscape用の非標準設定で、すでにほぼ廃止されている。

Netscape文字列拡張

例:
nsComment = "Some Random Comment"
このカテゴリの他の拡張設定: nsBaseUrl nsRevocationUrl nsCaRevocationUrl nsRenewalUrl nsCaPolicyUrl nsSslServerName

Netscape証明書タイプ

これは証明書の使用目的を示すフラグの配列を設定する多値の拡張設定だが、現在はこれに代わってbasicConstraintskeyUsageおよびextendedKeyUsageの拡張設定が使用されている。
nsCertTypeに使用可能な値: client server email objsign reserved sslCA emailCA objCA

これらの設定を使用する例がよく紹介されていますが、上記の説明を読む限り、よほど古いソフトウェアを使わない限り必要なさそうです。

今後の予定

  • 今回の内容を踏まえ、設定ファイルと前回作成したスクリプトを見直してルートCAを再作成する

  • 作成したCAでサーバー/クライアント証明書を発行し、OpenVPNでの動作を確認する

  • 証明書失効処理

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

おれのLinuxは適当すぎる

当たり前の事ができるようになりたい!と思い記事化しました。
内容はバリバリ基本レベルです。

Linux標準教科書とLPICの参考書で理解しつつ、手を動かしながら覚えます。
環境はmac。

ファイルを作ってコピーしたりディレクトリも作ったり移動したり消したりします(雑)

やってみる

まずはvi testlinuxで適当にファイルを作成。デスクトップに作りました。

vi testlinux ~/Desktop

コピーする前にmkdirでフォルダを作成。
mkdirのオプションはアクセス権を指定する-m、親ディレクトリを同時に作成する-p。
親ディレクトリを同時に作成って要は階層構造にしたいとき、ですね。

mkdir -p ~/Desktop/testdir/okome/chan

cpコマンドを適当に叩きましたが結果は同じ。
実行権はコピーできないんですね。たぶん。

cp testlinux testlinux2
cp -p testlinux testlinux2
cp -a testlinux testlinux2

cpでコピーしてchmodで実行権を与えます。
+で指定するのは結構忘れがち。

chmod +x testlinux2
chmod 755 testlinux2

ついでにchownとchgrp。どちらも-Rで配下の全ファイルの所有者とグループを変更できます。
いつもchownでまとめてやっています。

chown okome:okome testlinux2

ディレクトリのコピーには-rが必須とのこと。
ファイルと同じようにやったらエラーが出ました。なんかすまん。

cp -r testdir testdir2

移動!mvのオプションは2つだけで、同名のファイルやディレクトリが存在するときに
強制上書きするか・上書きする?て聞くかを選択できるようです。
オプション付けなくて同名のファイルやディレクトリが存在するなら
エラーがでる感じだろう。。と思いオプションなしでmvしたら普通に上書きされました。
-iを指定するとちゃんと聞かれたので、業務を意識して-iとセットと覚えた方がよさそうですね。

mv -i testlinux testdir

rmはよく使うので-iとセットで覚えてます。備忘録。
-i 本当に削除していいと?て聞く
-f 強制削除
-r 再帰的にディレクトリ全体を削除

rm -i testlinux2
rm -rf testdir

rmdirは空のディレクトリを削除する。結構忘れがち。

rmdir testdir

gzipでのファイル圧縮はよくわからないまま今日まで来たのでこの機会に。。
何も考えずにgzip。.gz化に成功しますが元のファイルは消えるようです。

gzip testlinux2

元ファイルを残して圧縮したい場合は-cオプションを利用して標準出力を利用するとのこと。

gzip -c testlinux2 > testlinux2.gz

echo

引数で与えた文字列を標準出力に出力する。標準出力。。

echo testlinux

export

環境変数を定義・代入する。

export X
export X=testlinux

time

スクリプトやプログラムの実行時間を知るときに使用する。
下記記事がスーパーわかりやすかったです。
最近Linux楽しいなーとよく思います。

https://qiita.com/tossh/items/659e5934e52b38183200:embed:cite

本日はここまで!
次回以降調べることリストを以下に。
tar
環境変数
標準入出力
curl
wget

参考文献

Linux標準教科書

入門UNIXシェルプログラミング

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