20190323のLinuxに関する記事は12件です。

Trusted Platform ModuleでSSH鍵を作る

SSHする際の秘密鍵は、ssh-keygenコマンドなどで生成します。
ただ、最近のマザーボードには、TPMと呼ばれるハードウェア生成器がついているので使ってみましょう。

Trusted Platform Module とは

TPMとは、Trusted Platform Moduleの略で、耐タンパー性があるチップです。
つまり、物理的な分解、ノイズ解析や、攻撃に耐性があります。
通常のCPUで行う演算の一部を、TPMに委託することで、ある程度安全に暗号計算やハッシュ計算を行えます。

TPMにはバージョンがあり、1.2と2.0が主流です。
機能は以下となります(wikipediaより引用

TPM 1.0 / 1.2

  • RSA演算
  • RSA鍵生成
  • RSA鍵格納
  • SHA-1ハッシュ
  • ハッシュ値計算
  • ハッシュ値保管
  • 乱数生成

TPM1.2から以下の機能が追加された。

  • カウンタ
  • 単純増加カウンタ
  • ティックカウンタ
  • オーナー権委任(パスワードは公開しない)
  • 不揮発性ストレージ保存機能

TPM 2.0

  • TPM 1.2の機能
  • シードとオブジェクトの概念
  • 認証形式の追加(KDFによるセッション鍵生成、Policy認証)
  • 認証と秘密通信の高速化
  • アルゴリズムの大幅な追加
  • 各種ハッシュ演算(SHA256、SM3、HMAC、KDFなど)
  • 楕円曲線暗号(NIST curve P-256、SM2など)
  • AES(128bit~256bit、OFB、CTRなどの各種モード)
  • グループの複製(Key duplication)
  • 不揮発性カウンタ
  • 不揮発性ビットフィールド

TPMでSSH鍵生成

ツール/ライブラリのインストール

$ sudo modprobe tpm
$ sudo pacman -S  tpm2-tools tpm2-tss

これで、/dev/tpm[0-9]*/dev/tpmrm[0-9]*とコマンド類が手に入ります。
udevでルールが追加されているので、一回再起動しましょう。

おわりに

ここまで書いてなんですが、Linuxカーネルでのtpm2は十分にサポートされていないらしく、実際自分の手元でも動作が不安定なため、いつかtpm2がちゃんと動くときまで保留しておきます

参考:

https://blog.hansenpartnership.com/tpm2-and-linux/
https://wiki.archlinux.org/index.php/Trusted_Platform_Module

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

文字コードをコマンドで切り替える(iTerm2 )

環境、ファイルごとに文字コードがeuc, utf-8と混在しており、頻繁に日本語が文字化けしていました。
毎回iTerm2の設定画面で切り替えていましたが、面倒なのでコマンドで切り替えれるようにします。

プロファイルを文字コードの数だけ作る

iTermを開いている状態でcmd + ,でPreferencesを開き、
+ボタンから必要な数だけプロファイルを作成します。
名前は文字コード名がよいでしょう。
スクリーンショット 2019-03-23 21.16.04.png

Terminal設定で実際の文字コードを設定する
スクリーンショット 2019-03-23 21.22.34.png

コマンドでプロファイルを切り替える

$ echo '\033]1337;SetProfile=プロファイル名\a'で任意のプロファイルに切り替えることができます。

utf-8に切り替えてみる

$ echo '\033]1337;SetProfile=utf-8\a'
$ cat test.txt
aaa
あああ

eucに切り替えてみる

$ echo '\033]1337;SetProfile=euc\a'
$ cat test.txt
aaa
秧???????

参考:https://www.iterm2.com/documentation-escape-codes.html

シェルに切り替えコマンドを登録する

毎回コマンドを打つのは面倒なのでbash_profileや.zshrcに登録しておきます。

zshrcを更新後、source .zshrcコマンドやログインし直して設定値を読み込み直します。

alias utf="echo -e '\033]1337;SetProfile=utf-8\aencording:utf-8'"
alias euc="echo -e '\033]1337;SetProfile=euc\aencourding:euc'"

簡単に文字コードを切り替えることができるようになりました。

$ utf
encoding:utf-8
$ cat test.txt
aaa
あああ
$ euc
encoding:euc
$ cat test.txt
aaa
秧???????
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【vim入門】vimtutorはいいぞ

先日Twitterで「Lpic持ってるのにvim(vi)が使えない人がいて困った」という内容のツイートを見ました。
最初はそんな事あるのか?と思ったんですが、実機操作はせずに完全にping-t等で問題を丸暗記して受験に受かったらそうなるか…
と納得しました(偉そうな事を言っていますが僕はLpic-1すら持っていません)

※因みにLpic-1では「103.8基本的なファイル編集」の部分でviによるファイル操作を学習することになります。
LPIの公式HP↓
https://www.lpi.org/ja/our-certifications/exam-101-objectives

個人的にですが、基本的なvimの習得という観点で言うならLpicよりも"vimtutor"コマンドで学習するのが
学習コストも少なく学べるのではないかと思ったので、"vimtutor"について紹介記事を書く事にしました。

対象者

・vimなんもわからん
・lpicの学習でviは勉強したけどもう忘れた
・vimの学習したいけど文字読むだけだとつまらん

前提条件

PC上(Linux)でvimが使える状態である事。

やり方

$ vimtutor

このコマンドを打つだけで以下のようなチュートリアルが起動します。

===============================================================================
=    V I M 教 本 (チュートリアル) へ よ う こ そ        -    Version 1.7      =
===============================================================================

     Vim は、このチュートリアルで説明するには多すぎる程のコマンドを備えた非常
     に強力なエディターです。このチュートリアルは、あなたが Vim を万能エディ
     ターとして使いこなせるようになるのに十分なコマンドについて説明をするよう
     になっています。

     チュートリアルを完了するのに必要な時間は、覚えたコマンドを試すのにどれだ
     け時間を使うのかにもよりますが、およそ25から30分です。

     ATTENTION:
     以下の練習用コマンドにはこの文章を変更するものもあります。練習を始める前
     にコピーを作成しましょう("vimtutor"したならば、既にコピーされています)。

     このチュートリアルが、使うことで覚えられる仕組みになっていることを、心し
     ておかなければなりません。正しく学習するにはコマンドを実際に試さなければ
     ならないのです。文章を読んだだけならば、きっと忘れてしまいます!

     さぁ、Capsロック(Shift-Lock)キーが押されていないことを確認した後、画面に
     レッスン1.1 が全部表示されるところまで、j キーを押してカーソルを移動しま
     しょう。

大体30分~45分くらいで全部終わると思います。

カーソルの移動やvimの起動、終了など、本当に初歩の部分から教えてくれるので
このチュートリアルを1週間ほど毎日実施していれば、かなりvimの操作は上達するはずです。
※少なくとも現場でvi(vim)の使い方が分からなくて怒られたり、マウントを取られたりすることは無くなると思います。

最後に

これはvimの操作に限った事ではないのですが、何か技術的な勉強する際には文章を読むだけではなく、
実際に手を動かしてやる方が圧倒的に効率が良いです。
実際に手を動かして、苦労しながらやった事の方が記憶には残りやすいですね。

     このチュートリアルが、使うことで覚えられる仕組みになっていることを、心し
     ておかなければなりません。正しく学習するにはコマンドを実際に試さなければ
     ならないのです。文章を読んだだけならば、きっと忘れてしまいます!

vimtutorのATTENTIONからの抜粋、めっちゃ良い事言ってますね:grinning:

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

vimtutorはいいぞ

先日Twitterで「Lpic持ってるのにvim(vi)が使えない人がいて困った」という内容のツイートを見ました。
最初はそんな事あるのか?と思ったんですが、実機操作はせずに完全にping-t等で問題を丸暗記して受験に受かったらそうなるか…
と納得しました(偉そうな事を言っていますが僕はLpic-1すら持っていません)

※因みにLpic-1では「103.8基本的なファイル編集」の部分でviによるファイル操作を学習することになります。
LPIの公式HP↓
https://www.lpi.org/ja/our-certifications/exam-101-objectives

個人的にですが、基本的なvimの習得という観点で言うならLpicよりも"vimtutor"コマンドで学習するのが
学習コストも少なく学べるのではないかと思ったので、"vimtutor"について紹介記事を書く事にしました。

対象者

・vimなんもわからん
・lpicの学習でviは勉強したけどもう忘れた
・vimの学習したいけど文字読むだけだとつまらん

前提条件

PC上(Linux)でvimが使える状態である事。

やり方

$ vimtutor

このコマンドを打つだけで以下のようなチュートリアルが起動します。

===============================================================================
=    V I M 教 本 (チュートリアル) へ よ う こ そ        -    Version 1.7      =
===============================================================================

     Vim は、このチュートリアルで説明するには多すぎる程のコマンドを備えた非常
     に強力なエディターです。このチュートリアルは、あなたが Vim を万能エディ
     ターとして使いこなせるようになるのに十分なコマンドについて説明をするよう
     になっています。

     チュートリアルを完了するのに必要な時間は、覚えたコマンドを試すのにどれだ
     け時間を使うのかにもよりますが、およそ25から30分です。

     ATTENTION:
     以下の練習用コマンドにはこの文章を変更するものもあります。練習を始める前
     にコピーを作成しましょう("vimtutor"したならば、既にコピーされています)。

     このチュートリアルが、使うことで覚えられる仕組みになっていることを、心し
     ておかなければなりません。正しく学習するにはコマンドを実際に試さなければ
     ならないのです。文章を読んだだけならば、きっと忘れてしまいます!

     さぁ、Capsロック(Shift-Lock)キーが押されていないことを確認した後、画面に
     レッスン1.1 が全部表示されるところまで、j キーを押してカーソルを移動しま
     しょう。

大体30分~45分くらいで全部終わると思います。

カーソルの移動やvimの起動、終了など、本当に初歩の部分から教えてくれるので
このチュートリアルを1週間ほど毎日実施していれば、かなりvimの操作は上達するはずです。
※少なくとも現場でvi(vim)の使い方が分からなくて怒られたり、マウントを取られたりすることは無くなると思います。

最後に

これはvimの操作に限った事ではないのですが、何か技術的な勉強する際には文章を読むだけではなく、
実際に手を動かしてやる方が圧倒的に効率が良いです。
実際に手を動かして、苦労しながらやった事の方が記憶には残りやすいですね。

     このチュートリアルが、使うことで覚えられる仕組みになっていることを、心し
     ておかなければなりません。正しく学習するにはコマンドを実際に試さなければ
     ならないのです。文章を読んだだけならば、きっと忘れてしまいます!

vimtutorのATTENTIONからの抜粋、めっちゃ良い事言ってますね:grinning:

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

コマンドラインのショートカット

コマンド 内容
Ctrl+b 後方に一文字分移動する
Ctrl+f 前方に一文字分移動する
Ctrl+a 行頭に移動する
Ctrl+e 行末に移動する
Alt+b 後方に単語一つ分移動する
Alt+f 前方に単語一つ分移動する
BS, Ctrl+h カーソル位置の後方に一文字削除する
Delete, Ctrl+d カーソルの位置の一文字を削除する
Ctrl+w 後方にスペース区切りで1単語ぶんを削除する
Ctrl+k カーソル位置から行末までを削除する
Ctrl+u カーソル位置から行頭までを削除する
Ctrl+y 最後に削除した内容を挿入する
Ctrl+s 画面表示をロックする
Ctrl+q 画面表示のロックを解除する
Ctrl+l 画面を消去する
Ctrl+p, ↑ 一つ前のコマンド履歴に移動する
Ctrl+n, ↓ 次のコマンド履歴に移動する
Ctrl+r 履歴をさかのぼってインクリメンタル検索する
(インクリメンタル検索時)文字の入力 検索語を追加して再検索
(インクリメンタル検索時)Ctrl+r 一つ前の検索結果へ移動
(インクリメンタル検索時)Enter 現在の検索結果をそのまま実行
(インクリメンタル検索時)Esc 現在の検索結果を表示したまま、コマンドラインに戻る
(インクリメンタル検索時)Ctrl+g 検索結果を破棄し、プロンプトに戻る
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rでdhcpd.leasesを読み込んでみた

昔rubyで作った dhcpd.leases を読み込むスクリプトを眺めていたところ「そういえばRでこの手のCSVとかじゃないファイルを処理したことないな」と意味もなく思ったので、じゃあ試しに作ってみよっかていう話です。

使用用途は全く考えていないです。dhcpサーバーにRがインストールされているなんていう場面は想像できないので、scpコマンドやrsyncコマンドでローカルにして処理するって話になるかなと思うんですが、それでも何に使うんだ?ってな話です。

dhcpd.leasesの中身と攻略方法

dhcpd.leasesはの中身は以下のようなフォーマットとなります。これをどうやって変換しようかという話なんですが、今回は「{}」で囲まれているからというか私が好きだからという理由でJSON形式に整形してパースすることとしました。JSON形式のパースはライブラリまかせなので dhcpd.leases をJSON形式に整形するスクリプトを書けば良いという話になります。

dhcpd.leases
lease 192.168.0.126 {
  starts 5 2019/02/01 09:31:09;
  ends 6 2019/02/02 01:31:09;
  binding state active;
  next binding state free;
  hardware ethernet b8:08:cf:e4:11:11;
  uid "\001\270\010\317\344\021\021";
  client-hostname "foo";
}
lease 192.168.0.130 {
  starts 5 2019/02/01 05:40:01;
  ends 6 2019/02/02 03:40:01;
  binding state active;
  next binding state free;
  hardware ethernet 9c:e3:3f:b5:22:22;
  uid "\001\234\343?\265\042\042";
  client-hostname "bar";
}

作ってみたスクリプト

スクリプトの流れとしては攻略方法のとおりで、 dhcpd.leases を読み込んでJSON形式に整形して、それを fromJSON() でパースして data frame形式に変換するという流れです。
ある程度使ったこのある書き方で書きたいなと思ったので、data.tableとかとか、そのライブラリ使わなくてもできるんじゃない?っていうライブラリも私好みで使いまくっています。
それと「binding state」みたいにスペースが入っていたりすると扱いにくかったので「state」みたいに名前を変えていたり、ターゲットを「starts」「ends」「binding state」「hardware」「client-hostname」のみを絞っちゃったりしています。

dhcpd_leases.R
library(dplyr)
library(stringr)
library(data.table)
library(lubridate)
library(jsonlite)

dhcpd_leases <- fread("dhcpd.leases", sep=NULL, header=FALSE, data.table=FALSE, col.names="t") %>%
    mutate(t=str_trim(t)) %>%
    mutate(t=str_replace(t,'^(starts|ends) [0-9] (.+);', '"\\1":"\\2"')) %>% #対象とする行の末尾は;を入れない
    mutate(t=str_replace(t,'^binding state (.+);', '"state":"\\1"')) %>%
    mutate(t=str_replace(t,'^hardware ethernet (.+);', '"ethernet":"\\1"')) %>%
    mutate(t=str_replace(t,'^client-hostname (.+);', '"hostname":\\1')) %>%
    mutate(t=str_replace(t,'^lease ([0-9.]+) \\{', '{"ip":"\\1"')) %>%
    filter(!str_detect(t,";$")) %>% #今回対象としない行(末尾が;)は削除
    filter(!str_detect(t,"^#")) %>%
    filter(!str_detect(t,"^$")) %>%
    `[[`("t") %>%
    str_flatten(",") %>%
    str_replace_all(",\\}", '}') %>%
    str_replace("\\},$", '}') %>%
    sprintf("[%s]", .) %>%
    fromJSON() %>%
    mutate(starts=parse_date_time(starts,"%y/%m/%d %H:%M:%S",tz="GMT")) %>%
    mutate(ends=parse_date_time(ends,"%y/%m/%d %H:%M:%S",tz="GMT")) %>%
    mutate(starts=with_tz(starts,"Asia/Tokyo")) %>% #タイムゾーンを日本に変更
    mutate(ends=with_tz(ends,"Asia/Tokyo"))

実行結果

変換後は以下のような感じとなります。

実行結果
> # テスト(内容確認)
> options(width=120)
> dhcpd_leases %>% head
             ip              starts                ends  state          ethernet hostname
1 192.168.0.126 2019-02-01 18:31:09 2019-02-02 10:31:09 active b8:08:cf:e4:11:11      foo
2 192.168.0.130 2019-02-01 14:40:01 2019-02-02 12:40:01 active 9c:e3:3f:b5:22:22      bar
3 192.168.0.250 2018-05-24 11:36:50 2018-05-25 03:36:50   free 4c:57:ca:18:cc:cc     <NA>
4 192.168.0.146 2019-02-01 18:16:56 2019-02-02 10:16:56 active 00:1e:33:28:aa:aa      baz
5 192.168.0.145 2019-02-01 18:19:34 2019-02-02 10:19:34 active 9c:b7:0d:72:dd:dd      qux

元のデータは以下のような感じ

dhcpd.leases
lease 192.168.0.126 {
  starts 5 2019/02/01 09:31:09;
  ends 6 2019/02/02 01:31:09;
  binding state active;
  next binding state free;
  hardware ethernet b8:08:cf:e4:11:11;
  uid "\001\270\010\317\344\021\021";
  client-hostname "foo";
}
lease 192.168.0.130 {
  starts 5 2019/02/01 05:40:01;
  ends 6 2019/02/02 03:40:01;
  binding state active;
  next binding state free;
  hardware ethernet 9c:e3:3f:b5:22:22;
  uid "\001\234\343?\265\042\042";
  client-hostname "bar";
}
lease 192.168.0.250 {
  starts 4 2018/05/24 02:36:50;
  ends 4 2018/05/24 18:36:50;
  tstp 4 2018/05/24 18:36:50;
  binding state free;
  hardware ethernet 4c:57:ca:18:cc:cc;
  uid "\001LW\312\030\314\314";
}
lease 192.168.0.146 {
  starts 5 2019/02/01 09:16:56;
  ends 6 2019/02/02 01:16:56;
  binding state active;
  next binding state free;
  hardware ethernet 00:1e:33:28:aa:aa;
  uid "\001\000\0363(\252\252";
  client-hostname "baz";
}
lease 192.168.0.145 {
  starts 5 2019/02/01 09:19:34;
  ends 6 2019/02/02 01:19:34;
  binding state active;
  next binding state free;
  hardware ethernet 9c:b7:0d:72:dd:dd;
  uid "\001\234\267\015r\335\335";
  client-hostname "qux";
}

思ったよりもするするっと書けた

最初はどうかなーって思っていたんですが思ってた以上に気持よく書くことができました。あと試しに10万行くらいのデータを作って読み込ませてみましたがストレスなく動きましたので速度的にも問題なさそうです。

R使う機会増やしてみようかなって思う今日このごろです。

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

【root on ZFS】Ubuntu 18.04.2 LTSをLet's noteにインストールする

この記事は何か

Ubuntu 18.04.2のrootをZFS+LUKS上に構築した実録である。

ZFSに至るまで

個人的に最近Linux熱が高まっているのだが、筆者の萌えポイントはZFSである。Solarisに実装された時には非常に興奮したことを覚えているが、当時悩んだ末に、グラフィック性能が必要だったため結局SUNではなくSilicon GraphicsのIndigoを購入した。

そんなわけでZFSを利用する機会は失ったのだが、つい最近、LinuxのカーネルモジュールとしてZFSが使えるようになっていることを知った。

参考にした記事

この記事は以下のドキュメントを参考に筆者が実際にノートPCにインストールした実録記事である。タイトルにあるとおりroot、すなわちシステム全体をZFSに乗せることを目的としている。
またLUKS(Linux Unified Key Setup)を組み合わせてファイルシステムを暗号化している。

上記記事は英語である上に非暗号化、暗号化の両方について説明しているので、ストレートに暗号化ZFSのHOWTOが、それも日本語で必要な人に参考としてもらえればありがたい。

環境及び前提条件

この記事は全てのPCへのインストール方法を記述したものでは無い。筆者の環境及びインストール要件、前提とした条件を整理する。

インストール環境

インストールした環境は以下のようなものである。

Item Configuration
PC Let's note CF-SZ6
CPU Intel Core™ i5-7300U vPro™ 2.60GHz
Memory 8GB LPDDR3 SDRAM
Disk 256GB SSD
System Software UEFI
OS Ubuntu 18.04.2 LTS Desktop
Encryption LUKS

インストールの前提条件

  • ディスク(SSD)全体をZFSでフォーマットする。デュアルブートは一切考慮していない。
  • ディスクは1台でミラーリングやRAIDZは考慮していない。
  • 起動OSはUbuntuのDesktop版を用いる。Server版ではないので注意のこと。

暗号化について

オリジナルのZFSはそれ自体に暗号化機能を含んでいるが、Linux版はまだ暗号化機能は実装途中で正式版としてはリリースされていない。
このため本記事ではLinuxで広く用いられているLUKSを利用してディスク全体を暗号化した。このチュートリアルでは、ブートローダー、カーネル、initrd以外の全て、すなわちOS、スワップ、ホームディレクトリなど全てを暗号化する。
なおLUKSでは起動時に復号のためのパスワードを求められるため、コンソールを操作できないリモート環境では利用できない。

インストール手順

インストール環境の準備

1.1. UbuntuのLiveイメージからブートする。筆者はUSBメモリにインストールしたイメージから起動した。メニューが現れたらインストールではなくTry Ubuntuを選択する。デスクトップが起動したらCtrl-Alt-Tを押下してターミナルを開く。

1.2. リポジトリを設定する。

$ sudo apt-add-repository universe
$ sudo apt update

1.3. 他の端末からインストール操作を行うためSSHのインストールを行う。

$ passwd
$ sudo apt install --yes openssh-server

コンソールで# ip a | grep inetとしてIPアドレスを調べ、他の端末から# ssh ubuntu@IPADDRESSで接続する。

1.4. ルートになってLive環境にZFS関連のツールのインストールを行う。

$ sudo -i
# apt install --yes debootstrap gdisk zfs-initramfs

ディスクのフォーマット

2.1. ディスクが再利用の場合には既存のパーティションを削除しておく。

# sgdisk --zap-all /dev/sda

2.2. ディスクのUUIDを調べ、環境変数にセットする。

# ls -la /dev/disk/by-id | grep sda
# export DISK=ata-SAMSUNG_MZNLN256HMHQ-XXXXXX

2.3. パーティションを切る。

# sgdisk     -n2:1M:+512M   -t2:EF00 /dev/disk/by-id/$DISK
# sgdisk     -n3:0:+512M    -t3:BF01 /dev/disk/by-id/$DISK
# sgdisk     -n4:0:0        -t4:8300 /dev/disk/by-id/$DISK

2.4. boot用のプールを作成する。

# zpool create -f -o ashift=12 -d \
       -o feature@async_destroy=enabled \
       -o feature@bookmarks=enabled \
       -o feature@embedded_data=enabled \
       -o feature@empty_bpobj=enabled \
       -o feature@enabled_txg=enabled \
       -o feature@extensible_dataset=enabled \
       -o feature@filesystem_limits=enabled \
       -o feature@hole_birth=enabled \
       -o feature@large_blocks=enabled \
       -o feature@lz4_compress=enabled \
       -o feature@spacemap_histogram=enabled \
       -o feature@userobj_accounting=enabled \
       -O acltype=posixacl -O canmount=off -O compression=lz4 -O devices=off \
       -O normalization=formD -O relatime=on -O xattr=sa \
       -O mountpoint=/ -R /mnt \
       bpool /dev/disk/by-id/$DISK-part3

2.5. root用のプールを作成する。

# cryptsetup luksFormat -c aes-xts-plain64 -s 256 -h sha256 \
       /dev/disk/by-id/$DISK-part4
# cryptsetup luksOpen /dev/disk/by-id/$DISK-part4 luks1
# zpool create -o ashift=12 \
       -O acltype=posixacl -O canmount=off -O compression=lz4 \
       -O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa \
       -O mountpoint=/ -R /mnt \
       rpool /dev/mapper/luks1

システムのインストール

3.1. コンテナとなるデータセットを作成する。

# zfs create -o canmount=off -o mountpoint=none rpool/ROOT
# zfs create -o canmount=off -o mountpoint=none bpool/BOOT

3.2. ルートとブートファイルシステムのためのデータセットを作成する。

# zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/ubuntu
# zfs mount rpool/ROOT/ubuntu

# zfs create -o canmount=noauto -o mountpoint=/boot bpool/BOOT/ubuntu
# zfs mount bpool/BOOT/ubuntu

3.3. 各ディレクトリ用のデータセットを作成する。

# zfs create                                 rpool/home
# zfs create -o mountpoint=/root             rpool/home/root
# zfs create -o canmount=off                 rpool/var
# zfs create -o canmount=off                 rpool/var/lib
# zfs create                                 rpool/var/log
# zfs create                                 rpool/var/spool

スナップショット作成から除外するデータセットの作成。

# zfs create -o com.sun:auto-snapshot=false  rpool/var/cache
# zfs create -o com.sun:auto-snapshot=false  rpool/var/tmp
# chmod 1777 /mnt/var/tmp

3.4. 最小システムをインストールする。

# debootstrap bionic /mnt
# zfs set devices=off rpool

システムの設定

4.1. ホストネームを設定する。HOSTNAME、FQDNはそれぞれホストネーム、ドメインネームとする。

# echo $HOSTNAME > /mnt/etc/hostname
# echo "127.0.1.1 $FQDN $HOSTNAME" >> /mnt/etc/hosts

4.2. ネットワークインタフェースの設定を行う。# ip aとしてインタフェース名を調べる。以下、INTERFACEは調べたインタフェース名とする。

# nano /etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    $INTERFACE:
      dhcp4: true

4.3. パッケージ取得のソースリストを設定する。

# nano /mnt/etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu bionic main universe
deb-src http://archive.ubuntu.com/ubuntu bionic main universe

deb http://security.ubuntu.com/ubuntu bionic-security main universe
deb-src http://security.ubuntu.com/ubuntu bionic-security main universe

deb http://archive.ubuntu.com/ubuntu bionic-updates main universe
deb-src http://archive.ubuntu.com/ubuntu bionic-updates main universe

4.4. ライブ環境から新しいシステムの環境へ移行する。

# mount --rbind /dev  /mnt/dev
# mount --rbind /proc /mnt/proc
# mount --rbind /sys  /mnt/sys
# chroot /mnt /bin/bash --login

4.5. 基本的な環境を設定する。

# ln -s /proc/self/mounts /etc/mtab
# apt update

# dpkg-reconfigure locales
# dpkg-reconfigure tzdata

日本語ロケールを選択するにしても、必ずen_US.UTF-8も選択する。
viは辛いのでnanoをインストールしておいた。

# apt install --yes nano

4.6. chrootした新しい環境にZFS関連のツールをインストールする。

# apt install --yes --no-install-recommends linux-image-generic
# apt install --yes zfs-initramfs

4.7. LUKSのセットアップを行う。

# apt install --yes cryptsetup
# echo luks1 UUID=$(blkid -s UUID -o value \
      /dev/disk/by-id/$DISK-part4) none \
      luks,discard,initramfs > /etc/crypttab

4.8. ブートローダーをインストールする。

# apt install dosfstools
# mkdosfs -F 32 -s 1 -n EFI /dev/disk/by-id/$DISK-part2
# mkdir /boot/efi
# echo PARTUUID=$(blkid -s PARTUUID -o value \
      /dev/disk/by-id/$DISK-part2) \
      /boot/efi vfat nofail,x-systemd.device-timeout=1 0 1 >> /etc/fstab
# mount /boot/efi
# apt install --yes grub-efi-amd64-signed shim-signed

4.9. ルートパスワードを設定する。

passwd

4.10. bpoolが常に読み込まれることを確実にする。

# cat >> /etc/systemd/system/zfs-import-bpool.service << EOF
    [Unit]
    DefaultDependencies=no
    Before=zfs-import-scan.service
    Before=zfs-import-cache.service

    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/sbin/zpool import -N -o cachefile=none bpool

    [Install]
    WantedBy=zfs-import.target
EOF
    # systemctl enable zfs-import-bpool.service

4.11. tmpfs(RAMファイルシステム)を/tmpにマウントする。

# cp /usr/share/systemd/tmp.mount /etc/systemd/system/
# systemctl enable tmp.mount

ブートローダーのインストール

5.1. ZFSがブートシステムとして認識されていることを確認する。

# grub-probe /boot
zfs

5.2. initrdファイルをリフレッシュする。

# update-initramfs -u -k all

このときWARNINGがでるが、気にしなくて良い。

5.3. デバッグしやすくするためにGRUBの設定を変更する。

Set: GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/ubuntu"
Comment out: GRUB_TIMEOUT_STYLE=hidden
Set: GRUB_TIMEOUT=5
Below GRUB_TIMEOUT, add: GRUB_RECORDFAIL_TIMEOUT=5
Remove quiet and splash from: GRUB_CMDLINE_LINUX_DEFAULT
Uncomment: GRUB_TERMINAL=console

5.4. GRUBの設定をアップデートする。

# update-grub

5.5. GRUBをインストールする。

# grub-install --target=x86_64-efi --efi-directory=/boot/efi \
      --bootloader-id=ubuntu --recheck --no-floppy

5.6. ZFSモジュールがインストールされていることを確認する。

ls /boot/grub/*/zfs.mod

5.7. ファイルシステムのマウント順序を修正する。

# umount /boot/efi
# zfs set mountpoint=legacy bpool/BOOT/ubuntu
# echo bpool/BOOT/ubuntu /boot zfs \
       nodev,relatime,x-systemd.requires=zfs-import-bpool.service 0 0 >> /etc/fstab
# zfs set mountpoint=legacy rpool/var/log
# echo rpool/var/log /var/log zfs nodev,relatime 0 0 >> /etc/fstab
# zfs set mountpoint=legacy rpool/var/spool
# echo rpool/var/spool /var/spool zfs nodev,relatime 0 0 >> /etc/fstab
# zfs set mountpoint=legacy rpool/var/tmp
# echo rpool/tmp /tmp zfs nodev,relatime 0 0 >> /etc/fstab

最初の起動

6.1. これまでの状態のスナップショットを取っておく。

# zfs snapshot bpool/BOOT/ubuntu@install
# zfs snapshot rpool/ROOT/ubuntu@install

6.2. chroot環境から抜ける。

# exit

6.3. 全てのファイルシステムをアンマウントする。

# mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {}
# zpool export -a

6.4. リブート!

# reboot
A dependency job for reboot.target failed. See 'journalctl -xe' for details.

ところが筆者の環境では上のようなメッセージが表示されリブートが止まってしまった。journalctl -xeで詳細を見てもよくわからなかったので、電源長押しで強制的にシャットダウンを行ったが何事もなくブートしてくれた。

6.5. LUKSのパスワードを入力して起動後、rootでログインする。

6.6. ユーザーアカウントを作成する。$YOURUSERNAMEはアカウント名である。

# zfs create rpool/home/$YOURUSERNAME
# adduser $YOURUSERNAME
# cp -a /etc/skel/.[!.]* /home/$YOURUSERNAME
# chown -R $YOURUSERNAME:$YOURUSERNAME /home/$YOURUSERNAME

6.7. アカウントを管理者グループに追加する。グループはお好みで。

# usermod -a -G adm,cdrom,dip,lpadmin,plugdev,sambashare,sudo YOURUSERNAME

スワップの設定

7.1. スワップのためのデータセットを作成する。

# zfs create -V 4G -b $(getconf PAGESIZE) -o compression=zle \
      -o logbias=throughput -o sync=always \
      -o primarycache=metadata -o secondarycache=none \
      -o com.sun:auto-snapshot=false rpool/swap

7.2. スワップを設定する。

# mkswap -f /dev/zvol/rpool/swap
# echo /dev/zvol/rpool/swap none swap defaults 0 0 >> /etc/fstab
# echo RESUME=none > /etc/initramfs-tools/conf.d/resume

7.3. スワップを有効化する。

# swapon -av

7.4. 設定したZFSはファイルシステムそのものが圧縮を行っているため、logrotateが圧縮を行わないように設定する。

# for file in /etc/logrotate.d/* ; do
    if grep -Eq "(^|[^#y])compress" "$file" ; then
        sed -i -r "s/(^|[^#y])(compress)/\1#\2/" "$file"
    fi
done

7.5. リブートする。

# reboot

最後のクリーンアップ

8.1. インストール時に作成したスナップショットを削除する。

$ sudo zfs destroy bpool/BOOT/ubuntu@install
$ sudo zfs destroy rpool/ROOT/ubuntu@install

8.2. rootのパスワードを無効化する。

sudo usermod -p '*' root

8.3. GRUBのグラフィカルインタフェースを有効にする。

$ sudo nano /etc/default/grub
Uncomment: GRUB_TIMEOUT_STYLE=hidden
Add quiet and splash to: GRUB_CMDLINE_LINUX_DEFAULT
Comment out: GRUB_TERMINAL=console
Save and quit.

$ sudo update-grub

おわりに

とても長い道のりだったがこれで最小構成のubuntu on ZFSがインストールできたことになる。あとはサーバー系のソフトウェアを入れるなり、デスクトップ環境を構築するなり、各自でカスタマイズして欲しい。

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

【勝手に毎日投稿祭り】物理サーバなくてもBIOS設定をいじってサーバを動かすことできます

※1週間限定で、「勝手に毎日投稿祭り」と題して毎日投稿しています。
ぜひぜひ、皆さんも便乗して下さい。

サーバの電源投入は自動化出来るのか?

1269310.jpg

最近、調査した問題で、電源を落としても勝手にまた起動しているサーバがあり、サーバの自動電源ONの仕組みってどう設定がされているのかを調べる機会がありました。
電源が落ちてたら、いくらcronでスケジューリングしても、実行される事はないし、外部機器とかを使わないと自動で電源がつくことはないと考えていました。

が、しかし!

自動化は、サーバだけで実現できることに気づきました!

方法としては、BIOSを使用します。
BIOSの種類によって、Auto Power Onで設定したり、Power On By RTC Alarmを使ったりと設定方法は、多々ありますが、BIOSに電源設定機能が備わっている場合は、設定できます(私のPCは出来ませんでしたが、Windows等でも出来るようです)。

ですが、サーバのBIOSって敷居が高いというか物理のサーバを使わなくちゃなかなか操作できないから覚えられないって思いませんか?

実は、仮想サーバでもBIOSはいじれました!
VMwareを使って仮想サーバのBIOS表示する場合は、以下のようにします。

仮想マシン起動時にF2キーを押下

vmwareマークが出ている間に押下しなくては、いけないのだが、この時間が、非常に短く、上手くできない場合は、仮想マシンの[マシン名].vmxファイルに以下を追加すれば、BIOSに入れる時間を延ばすことができる。
bios.bootDelay="10000"←例では、10秒に設定。

Image from Gyazo

BIOSにアクセス出来れば、以下のように表示される。
Image from Gyazo

これで、仮想サーバしかいじれない環境でもBIOSをいじってサーバを動かしてみることが出来る。
是非、使ってみて下さい。

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

無線網(Wi-Fi) 空中線(Antenna)(101) FullMAC/SoftMAC

Linux Wi-FiドライバのFullMAC/SoftMAC
https://qiita.com/eggman/items/461cefea5ba254cbbf7d

Do Access points use softMAC or hardMAC?
https://stackoverflow.com/questions/28343384/do-access-points-use-softmac-or-hardmac

The term 'SoftMAC' refers to a wireless network interface device (WNIC) which does not implement the MAC layer in hardware, rather it expects the drivers to implement the MAC layer.
'HardMAC' (also called 'FullMAC') describes a WNIC which implements the MAC layer in hardware.
The advantages of SoftMAC are:
Potentially lower hardware costs
Possibility to upgrade to newer standards by updating the driver only
Possibility to correct faults in the MAC implementation by updating the driver only

https://wireless.wiki.kernel.org/en/developers/documentation/glossary
FullMAC

FullMAC is a term used to describe a type of wireless card where the MLME is managed in hardware. You would not use mac80211 to write a FullMAC wireless driver.

SoftMAC

SoftMAC is a term used to describe a type of WNIC where the MLME is expected to be managed in software. mac80211 is a driver API for SoftMAC WNIC, for example.

About mac80211
https://wireless.wiki.kernel.org/en/developers/documentation/mac80211

A Modular, Flexible and Virtualizable Framework for IEEE 802.11
Pablo SALVADOR, Stefano PARIS, Claudio PISA, Paul PATRAS, Yan
GRUNENBERGER, Xavier PEREZ-COSTA, Janusz GOZDECKI, 2012
http://homepages.inf.ed.ac.uk/ppatras/pub/funems12.pdf

References
[1] “IEEE Standard for Information Technology-Telecommunications and Information Exchange Between Systems-Local and Metropolitan Area Networks-Specific Requirements - Part 11: Wireless LAN MAC and Physical Layer (PHY) Specifications,” IEEE Std 802.11-2007 (Revision of IEEE Std 802.11-1999).
[2] Linuxkernelmac80211frameworkforwirelessdevicedriver. http://linuxwireless.org/en/developers/Documentation/mac80211.
[3] FLAVIA Project (Flexible Architecture for Internet Access). http://www.ict-flavia.eu/.
[4] “IEEE Standard for Information technology–Telecommunications and information exchange between systems–Local and metropolitan area networks–Specific requirements Part 11: Wireless LAN MAC and PHY Specifications Amendment 5: Enhancements for Higher Throughput,” IEEE Std 802.11n-2009.
[5] G.Bhanage,D.Vete,I.Seskar,andD.Raychaudhuri,“SplitAP:LeveragingWirelessNetworkVirtualiza- tion for Flexible Sharing of WLANs,” in IEEE GLOBECOM, pp. 1 –6, dec. 2010.
[6] T. Hamaguchi, T. Komata, T. Nagai, and H. Shigeno, “A Framework of Better Deployment for WLAN Access Point Using Virtualization Technique,” in IEEE WAINA, pp. 968 –973, Apr. 2010.
[7] L. Xia, S. Kumar, X. Yang, P. Gopalakrishnan, Y. Liu, S. Schoenberg, and X. Guo, “Virtual WiFi: bring virtualization from wired to wireless,” in Proc. of the 7th ACM SIGPLAN/SIGOPS, VEE ’11, (Newport Beach, California, USA), pp. 181–192, 2011.
[8] G.AljabariandE.Eren,“VirtualizationofwirelessLANinfrastructures,”inIEEEIDAACS,vol.2,pp.837 –841, Sept. 2011.
[9] D.Camps-Mur,X.Pe ́rez-Costa,andS.Sallent-Ribes,“Designingenergyefficientaccesspointswithwi-fi direct,” Elsevier Comput. Netw., vol. 55, pp. 2838–2855, Sept. 2011.
[10] K.Huang,K.R.Duffy,andD.Malone,“H-RCA:802.11Collision-awareRateControl,”Technicalreport, Hamilton Institute, 2011.

Wiki

Wireless network interface controller
https://en.wikipedia.org/wiki/Wireless_network_interface_controller

Comparison of open-source wireless drivers
https://en.wikipedia.org/wiki/Comparison_of_open-source_wireless_drivers

Linux

https://github.com/torvalds/linux/tree/v5.0

driver

Realtek https://github.com/lwfinger/rtlwifi_new
rtl8188ee, rtl8192c, rtl8192ce, rtl8192cu, rtl8192de, rtl8192ee, rtl8192se, rtl8723ae, rtl8723be, rtl8723com, rtl8723de, rtl8821ae, rtl8822be

Mediatek (from Ralink)
https://github.com/terence-deng/mt7601u

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

CentOSにmysql 5.7をインストールする

インストール。

$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm

$ sudo yum install mysql mysql-devel mysql-server mysql-utilities

mysqlを起動。

$ sudo service mysqld start

初回パスワードを確認。

$ grep 'temporary password' /var/log/mysqld.log
2019-03-22T15:55:51.996547Z 1 [Note] A temporary password is generated for root@localhost: O=XXXXXXXXX

初回パスワードはXXXXXXXXXだとわかる。

初期設定を行う。

$ mysql_secure_installation

指示に従いパスワードと初期設定を行って終了。
念の為mysqlにrootでログインできるか確認。

$ mysql -uroot -p先程設定したパスワード

できたらOK。

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

CentOSでnginxを起動する

まずはインストール。

$ sudo yum install nginx

確認。

$ nginx -v
nginx version: nginx/1.10.2

少しバージョンが古いけど一旦これでOKとする。
起動。

$ sudo nginx

80ポートを開ける。

$ sudo vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPTを追記する。
iptablesを再起動する。

$ sudo service iptables restart

ブラウザでサーバのIPを叩いてみる。

スクリーンショット 2019-03-23 0.17.56.png

成功。

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

CentOSでnginxをインストールして起動する

まずはインストール。

$ sudo yum install nginx

確認。

$ nginx -v
nginx version: nginx/1.10.2

少しバージョンが古いけど一旦これでOKとする。
起動。

$ sudo nginx

80ポートを開ける。

$ sudo vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPTを追記する。
iptablesを再起動する。

$ sudo service iptables restart

ブラウザでサーバのIPを叩いてみる。

スクリーンショット 2019-03-23 0.17.56.png

成功。

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