- 投稿日:2019-08-11T23:58:10+09:00
【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]
- 投稿日:2019-08-11T22:36:53+09:00
チートシートまとめ
yum コマンド チートシート
https://access.redhat.com/sites/default/files/attachments/rh_yum_cheatsheet_1214_jcs_print-ja.pdfip コマンド チートシート
https://access.redhat.com/sites/default/files/attachments/rh_ip_command_cheatsheet_1214_jcs_print_ja4.pdfsystemd コマンド チートシート
https://access.redhat.com/sites/default/files/attachments/12052018_systemd_6.pdf
- 投稿日:2019-08-11T21:38:57+09:00
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.shconfigureスクリプト実行
# cd /usr/local/src/openjdk8u # chmod +x configure # ./configuremakeスクリプト実行
# 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
- 投稿日:2019-08-11T18:27:14+09:00
インフラエンジニアの教科書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.親プロセスは子プロセスの実行を待つ(子プロセスは実行終了と同時になくなる)
- このリンクが参考になった: http://x68000.q-e-d.net/~68user/unix/pickup?exec
- 例えば、bashから
exec ls
を打つと、プログラム実行終了後にプロセスはなくなる- プロセス間通信
- いわゆるパイプといわれるものでデータを受け渡す
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%にすると、全ての領域が使えるようになる
- 投稿日:2019-08-11T17:22:04+09:00
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だけでもだいぶ楽になります。
参考
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 dirBESC を押しっぱなしにして、Bを2回連続でいくと、2回目のbは普通の入力とと判定されてしまうので、
mv fileA dirB & cp fileC bdirBというように、1単語分戻ったあと、bが入力されてしまうことになります。
そのため、2単語分戻りたい場合は、Esc+b Esc+bともう一度Escキーから指を話してキーを押しなおす必要があります。雑感:一文字の移動、操作について
また、僕は一文字進めるぐらいなら矢印キーを使ってもかわらない気もするので、Ctrl+B,Ctrl+Fなどは使っていませんが、常にホームポジションから動かずに全ての操作をしたいという人には一文字移動や、一文字削除のキーバインドも覚えるといいと思います。
- 投稿日:2019-08-11T17:22:04+09:00
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だけでもだいぶ楽になります。
参考
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 dirBESC を押しっぱなしにして、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キーとして使えるようになります。
- 投稿日:2019-08-11T16:34:38+09:00
【新人向け】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
の部分。
この場合、優先順位がfiles
→dns
となっているので、
「まず/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.ora
、listener.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アドレスを変に設定してしまったことだと考える。
- 投稿日:2019-08-11T16:34:38+09:00
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
の部分。
この場合、優先順位がfiles
→dns
となっているので、
「まず/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.ora
、listener.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アドレスを変に設定してしまったことだと考える。
- 投稿日:2019-08-11T15:06:41+09:00
ラズパイ始めました (夏季限定)
はじめに
ラズパイに初めて出会った時に一体なんのことやら?どれを選べば??と思ったことをまとめておきます。
ラズパイを始める方は「とりあえずマウス&キーボードで動かしてみよう」と考える、という先入観で話を進めます。
具体的に以下を記します。
ラズパイ何が違うん?
以下にまとめました。
黄色は比較した結果、メリットが高い項目です。
下線のある項目は注意が必要です。
※ほぼ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
3B、4Bは同じサイズです。正確には「Aタイプ」サイズがありますが
旧機種でスペックも低いためここでは割愛します。Zeroシリーズは細かく機能が分かれ、サイズが違います。
「W」が付くとWiFi通信ができます。
「h」が付くとヘッダピンが付いてます。(下図)
ラズパイ型 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)
4Bに必要なHDMIはMicroに対し、3Bは標準。
ZeroはMiniHDMIとまったく統一感ありません。
標準的なコードにMiniやMicroのアダプタを買う必要があります。
電源(USB)
これも3Bと4Bで異なります。
3B,ZeroはUSB Micro-B、4BはUSB Type-Cです。
電力
ラズパイは意外と電力を必要とします。
Type-Bだとスマホ電源などにも採用していることもあり流用しがちです。
スマホ電源&コード利用は3B、4Bは間違いなく落ちます。
筆者も舐めてました。専用コードとアダプタを買った方が賢いです。消費電力の少ないZero Wの電源をiphoneアダプタにしてみたのですが
こちらもデスクトップ環境(rasbian Buster)の時は突然落ちてしまいました。。外部出力コネクタ(データ用USB)
3Bと4Bのデータ用USBは標準的なUSB差し込み口ですが、ZeroはMicro-Bです。
ラズパイはデータ用と電源用で分かれていますので注意が必要です。
また、大量のメモリを使用するアプリを動かす際は
swap領域として4BのUSB3.0×2口はとてもメリットがあります。
※USB2.0は500MB/秒(Mbps)
USB3.0は5GB/秒(Gbps)
約10倍の速度差があります。
まとめ
まずは4Bを買うで問題ないと思います。
海外直販サイトを利用すると安く買えます。
Amazonでも買えます。(多少高く設定されてます)
どこで買うにしろ、コードや冷却チップ込みで買うと最終的に安上がりで無駄がありません。冷却チップは購入した方がよいです。
4Bは特にCPU熱が高騰し処理速度が下がる、という問題が指摘されています。
冷却は大事なようです。ここでは割愛しましたが、有線LANも3B→4Bでレベルアップしており、
その辺のパソコンより良いEhternetコネクタ(ギガビットイーサ)です。
3B:100Mbps
4B:10Gbps ※100倍ですよ。。スループットはもう少し下がりますけれどむしろ普通のノートパソコンにもう少しギガビットイーサ普及してくれないかな。。
周辺機器コネクタはもはやノートPCより良い装備がなされてる気がします。というより昨今のノートPCはSSDでごまかしてる感が。。
USBとイーサコネクタ良くならないかな。。おわり
- 投稿日:2019-08-11T11:34:06+09:00
今度こそopensslコマンドを理解して使いたい (2) 設定ファイル(openssl.cnf)を理解する
前回: 今度こそopensslコマンドを理解して使いたい (1) ルートCAをスクリプトで作成する
前回はスクリプトでルートCAを作成する際に、識別名などの重要な設定値をコマンドラインで指定しましたが、それ以外はノーマルの設定ファイル(openssl.cnf)の値をそのまま使用していました。
今回はOpenSSLの設定ファイルを理解して、適切な設定ファイルを作れるようになることを目指します。
設定ファイルの構成
以降の文書中の引用箇所は、以下のOpenSSL公式ドキュメントからの抜粋+和訳です。
- 設定ファイル manpage(1.0.2): https://www.openssl.org/docs/man1.0.2/man5/config.html
デフォルトセクション
設定ファイルの先頭から最初の名前付きセクションの前までを「デフォルトセクション」と言う。
ノーマルの
openssl.cnf
では、ファイル先頭部分にある以下の3行が「デフォルトセクション」の内容になります。/etc/pki/tls/openssl.cnfHOME = . RANDFILE = $ENV::HOME/.rnd oid_section = new_oids名前付きセクション
コマンド(
openssl
のサブコマンド)がどの名前付きセクションを参照するかは、各コマンドのドキュメントに明記されています。例えばca
コマンドは[ ca ]
セクションを、req
コマンドは[ req ]
セクションを参照し、それらの中で別のセクションが指定されていればそちらも参照します。
ca
コマンド manpage(1.0.2): https://www.openssl.org/docs/man1.0.2/man1/openssl-ca.htmlreq
コマンド manpage(1.0.2): https://www.openssl.org/docs/man1.0.2/man1/openssl-req.html以下はノーマルの
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.cnfCA_DIR = /etc/pki/CA # 全体の保存場所(環境変数がない場合のデフォルト値) [ CA_default ] dir = $ENV::CA_DIR # 全体の保存場所(環境変数) certs = $dir/certs # 発行した証明書をどこに保存するかその他の書式
全般的な書式に関するトピックを以下に抜粋します。
使用可能文字
セクション名には英数字とアンダースコアを使用できる。
name=value
のname
には、英数字と.
,
;
_
などいくつかの記号を使用できる。変数名の重複
同一セクション内に同じ名前の変数がある場合、最後の値以外は無視される。
識別名のように同じフィールドが複数回定義されるような特殊な場合、通常は名前の先頭から.
までを無視することで回避している。以下の例はこの方法でフィールドOU
を2つ定義している。
1.OU="My first OU"
2.OU="My Second OU"ノーマルの
openssl.cnf
では以下の箇所がこれに相当します。/etc/pki/tls/openssl.cnf0.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公式ドキュメントからの抜粋+和訳です。
- X509 V3 拡張設定 manpage(1.0.2): https://www.openssl.org/docs/man1.0.2/man5/x509v3_config.html
critical
拡張セクション内の各行は以下の書式を取る:
extension_name=[critical,] extension_options
critical
があればその拡張設定は重要である。
critical
はプログラムが設定内容を厳守するように指定しますが、critical
がない場合の動作は各プログラムの実装に依存するようです。
厳密な運用を目指すなら積極的に指定するべきオプションですが、設定ファイルの[ v3_ca ]
セクションに以下のコメントが書かれているように、プログラムによっては正常動作を妨げる場合もあるようです。/etc/pki/tls/openssl.cnf# PKIXはこれを推奨しているが、いくつかの壊れたソフトウェアが「critical」拡張設定で固まってしまう。 basicConstraints = critical,CA:true # だから私たちは代わりにこうする。 basicConstraints = CA:trueBasic Constraints(基本制約)
これは証明書がCA証明書かどうかを示す多値の拡張設定で、最初に
CA:{TRUE|FALSE}
の設定が必須である。CA:TRUE
の場合、pathlen
に正の数を設定することができる。
例:
basicConstraints=CA:TRUE
basicConstraints=CA:FALSE
basicConstraints=critical,CA:TRUE,pathlen:0CA証明書には
CA:TRUE
の値を設定したbasicConstraints
が必須である。
エンドユーザー証明書はCA:FALSE
とするか、またはこの拡張設定を完全に除外する必要があるが、中にはエンドエンティティ証明書にCA:FALSE
のbasicConstraints
を含むことを要求するソフトウェアもある。
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,msSGCOpenVPNのサーバー/クライアントで試したところ、サーバー側の証明書に
extndedKeyUsage = serverAuth
がないと、クライアント側から接続することができませんでした。Subject Key Identifier(サブジェクト鍵識別子)
サブジェクト鍵識別子: 証明書の所有者の公開鍵を識別する値(ハッシュ値)
文字列値で
hash
を指定すれば、RFC3280のガイドラインに自動的に従う。これ以外の設定は推奨されない。
例:
subjectKeyIdentifier=hashAuthority Key Identifier(認証局鍵識別子)
認証局鍵識別子: 証明書に署名したCAの公開鍵を識別する値(ハッシュ値)
keyid
とissuer
の2つのオプションが使用可能で、どちらもオプション値always
を取ることができる。
keyid
オプションがある場合、サブジェクト鍵識別子を親証明書からコピーしようとする。 値always
がある場合、オプションが失敗するとエラーが返される。
issuer
オプションは、発行者の証明書から発行者とシリアル番号をコピーする。これはalways
フラグが常に値を含まない限り、keyid
オプションが失敗するか含まれない場合にのみ行われる。
例:
authorityKeyIdentifier=keyid,issuer非推奨の拡張設定
これらはNetscape用の非標準設定で、すでにほぼ廃止されている。
Netscape文字列拡張
例:
nsComment
= "Some Random Comment"
このカテゴリの他の拡張設定:nsBaseUrl
nsRevocationUrl
nsCaRevocationUrl
nsRenewalUrl
nsCaPolicyUrl
nsSslServerName
Netscape証明書タイプ
これは証明書の使用目的を示すフラグの配列を設定する多値の拡張設定だが、現在はこれに代わって
basicConstraints
、keyUsage
およびextendedKeyUsage
の拡張設定が使用されている。
nsCertType
に使用可能な値:client
server
objsign
reserved
sslCA
emailCA
objCA
これらの設定を使用する例がよく紹介されていますが、上記の説明を読む限り、よほど古いソフトウェアを使わない限り必要なさそうです。
今後の予定
今回の内容を踏まえ、設定ファイルと前回作成したスクリプトを見直してルートCAを再作成する
作成したCAでサーバー/クライアント証明書を発行し、OpenVPNでの動作を確認する
- OpenVPN コミュニティ Wiki: https://community.openvpn.net/openvpn
証明書失効処理
- 投稿日:2019-08-11T10:20:36+09:00
おれのLinuxは適当すぎる
当たり前の事ができるようになりたい!と思い記事化しました。
内容はバリバリ基本レベルです。Linux標準教科書とLPICの参考書で理解しつつ、手を動かしながら覚えます。
環境はmac。ファイルを作ってコピーしたりディレクトリも作ったり移動したり消したりします(雑)
やってみる
まずはvi testlinuxで適当にファイルを作成。デスクトップに作りました。
vi testlinux ~/Desktopコピーする前にmkdirでフォルダを作成。
mkdirのオプションはアクセス権を指定する-m、親ディレクトリを同時に作成する-p。
親ディレクトリを同時に作成って要は階層構造にしたいとき、ですね。mkdir -p ~/Desktop/testdir/okome/chancpコマンドを適当に叩きましたが結果は同じ。
実行権はコピーできないんですね。たぶん。cp testlinux testlinux2 cp -p testlinux testlinux2 cp -a testlinux testlinux2cpでコピーして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 testdirrmはよく使うので-iとセットで覚えてます。備忘録。
-i 本当に削除していいと?て聞く
-f 強制削除
-r 再帰的にディレクトリ全体を削除rm -i testlinux2 rm -rf testdirrmdirは空のディレクトリを削除する。結構忘れがち。
rmdir testdirgzipでのファイル圧縮はよくわからないまま今日まで来たのでこの機会に。。
何も考えずにgzip。.gz化に成功しますが元のファイルは消えるようです。gzip testlinux2元ファイルを残して圧縮したい場合は-cオプションを利用して標準出力を利用するとのこと。
gzip -c testlinux2 > testlinux2.gzecho
引数で与えた文字列を標準出力に出力する。標準出力。。
echo testlinuxexport
環境変数を定義・代入する。
export X export X=testlinuxtime
スクリプトやプログラムの実行時間を知るときに使用する。
下記記事がスーパーわかりやすかったです。
最近Linux楽しいなーとよく思います。https://qiita.com/tossh/items/659e5934e52b38183200:embed:cite
本日はここまで!
次回以降調べることリストを以下に。
tar
環境変数
標準入出力
curl
wget参考文献