Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

標準出力にタイムスタンプを付与する@Linux

シェルスクリプトの実行結果をファイルに保存する時など、タイムスタンプが欲しい時があります。いくつか方法はあると思いますが、ここではLinuxに標準でインストールされてるawk使って簡単に実現してみます。

$ ping 172.16.0.1 | awk '{print strftime("%F %T ") $0; fflush();}'
2017-07-02 21:34:29 PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.
2017-07-02 21:34:29 64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=2.44 ms
2017-07-02 21:34:30 64 bytes from 172.16.0.1: icmp_seq=2 ttl=64 time=2.01 ms
2017-07-02 21:34:31 64 bytes from 172.16.0.1: icmp_seq=3 ttl=64 time=1.95 ms
2017-07-02 21:34:32 64 bytes from 172.16.0.1: icmp_seq=4 ttl=64 time=2.09 ms

 

簡単ですね。スクリプト内で毎回awkを呼び出すのは面倒な場合は、coproc コマンドやexecを組み合わせてみましょう。

#!/bin/bash

TTY=`tty`
coproc awk '{print strftime("%F %T ") $0; fflush();}' > $TTY
exec >&${COPROC[1]} 2>&1

ping 172.16.0.1

 

coproc で awk コマンドをバックグラウンドで起動し、awkの標準出力を自分のttyにリダイレクトします。さらに、exec スクリプト内の全標準出力・標準エラー出力をcoprocで起動したawkの標準入力にリダイレクトしています。

結果、ping の出力結果が全てがawk経由で自分のターミナル上に出力されます。

シェルスクリプト内のコマンドのエラー出力をファイルに一括リダイレクト

通常、シェルスクリプトのエラー出力をファイルに保存したい場合、以下のように、「コマンド 2>ファイル名」 でファイルに追記でリダイレクトすることがあります。

ファイル名 : myscript.sh

#!/bin/bash

ls /hoge 2>> err.log
cat /hoge 2>> err.log

上記スクリプトを実行し、err.logを確認します。

$ ./myscript.sh
$ cat err.log
ls: '/hoge' にアクセスできません: No such file or directory
cat: /hoge: No such file or directory

ただし、シェルスクリプトが長くなってくると、全てのコマンドにリダイレクトを記述するのは面倒です。そういった場合は、exec を使って一括でリダイレクトすることが可能です。

#!/bin/bash

exec 2> err2.log
ls /hoge
cat /hoge

$ ./myscript.sh
$ cat err2.log
ls: '/hoge' にアクセスできません: No such file or directory
cat: /hoge: No such file or directory

noRoot Firewall に広告ブロック用のドメインリストをインポート

root なしでAndroidのアプリのNW通信を遮断できる便利なアプリ noRoot Firewallを使っているのですが、広告表示を抑えるためにドメイン名を登録するのは手動でしかできず、大量のドメイン登録は骨が折れます。

そこで、それを自動化できるスクリプト norootfirewallAdsFilterConverter.sh を使ってみました。

このスクリプトを使うには、PC に adb がインストールされている必要があります。また bash や tar pax 等の Unix 系コマンドや sqlite が使える必要があり、今回は Windows + Cygwin を使ってみました。 ※ Cygwin のインストール、使い方ははここでは説明しません。

ブロックドメインリストのインポートの仕組みは、PC 上の adb コマンドを使って、スマホ上の noRoot Firewall のデータベースをバックアップし、リストをこのデータベースにメージして、スマホにこのデータベースをリストアするというものです。

このスクリプト、使うのは簡単で、zipファイルをダウンロードし、展開しておきます。また展開先のフォルダには、abe.jar ファイルが必要なので、こちらからダウンロードして配置しておきます。

スマホをUSBデバックモードにし、PCにつなぎます。

Cygwinのコンソールを開き、adb コマンドが使えるようにしておきます。そして、このスクリプトを実行します。するとこのようなメニューが出てきます。

$ ./norootfirewallAdsFilterConverter.sh

Select option:
-------------------------------------------
Run once for setup
1 Create example primary custom filter file
2 Create example filter url file
-------------------------------------------
Run in sequence to update filters, or run only one option
3 Download filter
4 Get backup.ab from device
5 Unpack backup.ab
6 Convert filter
7 Pack backup_new.ab
8 Save backup_new.ab to device
9 Exit
  -------------------------------------------
Option:

 

あとは、上から順番に実行していくだけです。

デフォルトでは、スクリプト内で以下のリストをダウンロードするように書かれており、これらのリストがそのまま適用されます。(6を実行時に選択することも可能です)

urls="https://easylist-downloads.adblockplus.org/easylist.txt
https://easylist-downloads.adblockplus.org/easylistgermany.txt
https://easylist-downloads.adblockplus.org/fanboy-social.txt
https://easylist-downloads.adblockplus.org/easyprivacy.txt
https://easylist-downloads.adblockplus.org/fanboy-annoyance.txt
https://secure.fanboy.co.nz/r/fanboy-complete.txt
https://secure.fanboy.co.nz/r/fanboy-ultimate.txt
https://raw.githubusercontent.com/Hubird-au/Adversity/master/Adversity.txt
https://raw.githubusercontent.com/Hubird-au/Adversity/master/Antisocial.txt"

 

自分専用のカスタムリストを使用したい場合は、list_primary_custom_in.txt というファイル名でリストを作成しておけばOKです。

noRoot Firewall は、ワイルドカードが使えるので、ファイルには、

*.xxxxxx.jp
*.hogehoge.jp

 

のように書けます。

変更後は、6,7,8 を再実行すれば、カスタムリストを反映できます。

 

PS デフォルトフィルタを全部適用すると、かなり動作が重たくなってしまうので、厳選した方がよいかも

wuzzを使ってHTTPベースのAPIを手軽に実行@Linux with Docker

wuzz というAPIを手軽に叩きながら動作を確認するツールを使ってみた。

ちょっとAPIを叩きたいとき、curl のようなコマンドを使うことも多いが、このツールはAPI のURLを設定し、インタラクティブにAPIのpらメータを変更しながら実行できるツール。APIを叩くアプリを作りたい時に、APIの応答などを手軽に確認したい時に便利。

ツールはGo言語製で、GO言語がインストールされていれば、インストール自体は簡単。

$ go get github.com/asciimoo/wuzz

 

これだけです。通常は、~/go/bin/wuzz にインストールされるので、これを実行するだけです。

$ ~/go/bin/wuzz

 

CLIベースで、こんな画面が出てきます

ためしに、localhost で起動しているDockerのAPI (TLS未使用) を叩いて、Dockerイメージのリストを確認してみます。

このような感じで、Response body の欄に応答が表示されます。欄の移動はTABで可能です。実行したAPIは、Ctrl+h で履歴を遡ることも可能です。

screenからtmuxに乗り換えてみる

screenからtmuxに乗り換えた時のメモ。

まずは、ネットの情報を参考に、~/.tmux.conf を以下のように設定。

# Prefixを "Ctrl-o" に変更
set-option -g prefix C-o
unbind-key C-b
bind-key C-o send-prefix

# Ctrlを押しっぱなし(Prefix + Ctrl+c) で新しいWindowを作成
bind ^c new-window
# Ctrlを押しっぱなしでもWindowを移動
bind ^o last-window
bind ^n next-window
bind ^p previous-window

# exmacからviモードに変更
set-window-option -g mode-keys vi


# Windowを分割している時、Ctrl+h, Ctrl+j, Ctrl+k, Ctrl+lでPaneを移動
bind ^h select-pane -L
bind ^j select-pane -D
bind ^k select-pane -U
bind ^l select-pane -R


# Windowを分割している場合、H, J, K, Lでサイズを変更
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5


# | でタテ分割, - で横分割
bind | split-window -h
bind - split-window -v

 

screenでは、Prefix+k がWindow削除 → tmuxでは、Prefix+& Pane削除は、Prefix+x Pane間移動は、Prefix+o だが、上記設定でPrefix+h,j,k,l で移動できるように。

既存セッションへのアタッチは、tmux a デタッチは、Prefix+d セッション一覧は、tmux ls

Prefix+t で時刻表示される機能にちょっと笑った。

WSL1のプロセスのfork性能を測ってみた

Windows上では今までCygwinを使っていたのですが、Cygwinはプロセスのforkの性能が遅く、全体的に遅かった。そこで、2016/8 にリリースされたWindows 10のbash (win-bashと略す)のfork性能がCygwinと較べてどのくらい早いのか比較してみた。

使用CPU : Core i5 6200U

まずはCygwin。1秒間にdateコマンドを20回ぐらい起動できた。(最初の1秒間は7回とかなり遅い)

$ while (true); do date; done | uniq -c
      7 2016年 8月 11日 木曜日 00:35:32 JST
     18 2016年 8月 11日 木曜日 00:35:33 JST
     24 2016年 8月 11日 木曜日 00:35:34 JST
     19 2016年 8月 11日 木曜日 00:35:35 JST
     20 2016年 8月 11日 木曜日 00:35:36 JST
     20 2016年 8月 11日 木曜日 00:35:37 JST
     20 2016年 8月 11日 木曜日 00:35:38 JST
     21 2016年 8月 11日 木曜日 00:35:39 JST
     18 2016年 8月 11日 木曜日 00:35:40 JST
     23 2016年 8月 11日 木曜日 00:35:41 JST

次はwin-bash。dateコマンドは30回程度とCygwinより若干性能はよい。

$ while (true); do date; done | uniq -c
     30 2016年  8月 11日 木曜日 00:36:06 DST
     34 2016年  8月 11日 木曜日 00:36:07 DST
     33 2016年  8月 11日 木曜日 00:36:08 DST
     33 2016年  8月 11日 木曜日 00:36:09 DST
     33 2016年  8月 11日 木曜日 00:36:10 DST
     32 2016年  8月 11日 木曜日 00:36:11 DST
     32 2016年  8月 11日 木曜日 00:36:12 DST
     33 2016年  8月 11日 木曜日 00:36:13 DST
     32 2016年  8月 11日 木曜日 00:36:14 DST
     33 2016年  8月 11日 木曜日 00:36:15 DST

同PC上のVirtualBox上のUbuntu 14.04 上でも計測してみた。

$ while (true); do date; done | uniq -c
    281 2016年  8月 11日 木曜日 14:20:38 JST
    518 2016年  8月 11日 木曜日 14:20:39 JST
    438 2016年  8月 11日 木曜日 14:20:40 JST
    415 2016年  8月 11日 木曜日 14:20:41 JST
    340 2016年  8月 11日 木曜日 14:20:42 JST
    340 2016年  8月 11日 木曜日 14:20:43 JST
    319 2016年  8月 11日 木曜日 14:20:44 JST
    275 2016年  8月 11日 木曜日 14:20:45 JST
    258 2016年  8月 11日 木曜日 14:20:46 JST
    255 2016年  8月 11日 木曜日 14:20:47 JST

桁が違う・・・ やっぱりネイティブなLinuxと比べると、win-bashはかなり遅そうだ。

2017/4/16追記

Windows 10 Creators update にアップデートして計測してみたが、差異なし

$ while (true); do date; done | uniq -c
      9 2017年  4月 16日 日曜日 22:37:40 DST
     32 2017年  4月 16日 日曜日 22:37:41 DST
     30 2017年  4月 16日 日曜日 22:37:42 DST
     31 2017年  4月 16日 日曜日 22:37:43 DST
     31 2017年  4月 16日 日曜日 22:37:44 DST
     30 2017年  4月 16日 日曜日 22:37:45 DST
     30 2017年  4月 16日 日曜日 22:37:46 DST

Windows bashを使ってみた

Windows10 の Anniversary Updateで、Ubuntu が使えるようになったとのことなので、早速使ってみた。

インストール方法は、いろいろと記事があるので割愛。早速中身を漁ってみる。

コマンドプロンプトで "bash" を起動

C:\>bash
user@PC:/mnt/c$

 

どうやらbashを起動すると、コマンドプロンプトのカレントフォルダが、bashのカレントフォルダ(Linuxなのでカレントディレクトリ??) になるようだ。ユーザはbashインストール時に作ったユーザ(ここではuserというユーザ)で、sudo権限を持ってます。

/mnt に、Windowsのドライブが割り当てられており、/mnt/c がCドライブで、ユーザのホームディレクトリは普通のLinux同様、/home/配下になっていた。

user@PC:~$ echo $HOME
/home/user

 

Ubuntuのディストリビューションを確認

user@PC:~$ cat /etc/issue
Ubuntu 14.04.4 LTS \n \l

14.04 LTS が入っていた。

Linux上では必ず使う、screenコマンドを叩いてみる。

user@PC:~$ screen
[screen is terminating]

 

screenコマンドは動かないようだ。ネットを少し調べてみたが解決方法もわからず、一旦諦めることに。ちなみにtmuxコマンドは動いた。私はscreen派なのだが、これを期にtmuxに乗り換えるのもありかと考え中。

次に、Ubuntuのパッケージ管理コマンド apt-get を叩いてみる。

user@PC:~$ apt-get update
E: ロックファイル /var/lib/apt/lists/lock をオープンできません - open (13: 許可がありません)
E: ディレクトリ /var/lib/apt/lists/ をロックできません
E: ロックファイル /var/lib/dpkg/lock をオープンできません - open (13: 許可がありません)
E: 管理用ディレクトリ (/var/lib/dpkg/) をロックできません。root 権限で実行していますか?

 

一般ユーザなので、apt-get が叩けなかった・・・ 気を取り直してrootユーザでapt-get

user@PC:~$ sudo apt-get update

応答が返ってこない。  (追記 : 実際は応答が返ってこないのではなく、非常に応答時間がかかっていることが後で判明)

user@PC:~$ sudo su -

というか、そもそもsudoの応答が返ってこない・・  (追記 : これも応答に時間がかかっているだけであることが後で判明)

Windowsのコマンドプロンプトが管理者権限で動いてないからかな?と思い、コマンドプロンプトを右クリックして、管理者として実行し、bashを起動して、リトライ。

user@PC:~$ sudo su -
root@PC:~# apt-get update
無視 http://archive.ubuntu.com trusty InRelease
ヒット http://archive.ubuntu.com trusty-updates InRelease
ヒット http://archive.ubuntu.com trusty Release.gpg
ヒット http://archive.ubuntu.com trusty-updates/main amd64 Packages
~ 略 ~

動いた! root権限が必要な場合は、コマンドプロンプトも管理者として実行しておけばスムーズに作業ができそうなのがわかった。

試しに、unzipコマンドを入れてみる。

root@PC:~# apt-get install unzip
パッケージリストを読み込んでいます... 完了%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了%
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
 libfreetype6 os-prober
これを削除するには 'apt-get autoremove' を利用してください。
提案パッケージ:
 zip
以下のパッケージが新たにインストールされます:
 unzip
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 48 個。
157 kB のアーカイブを取得する必要があります。
この操作後に追加で 395 kB のディスク容量が消費されます。
警告: 以下のパッケージは認証されていません!
 unzip
検証なしにこれらのパッケージをインストールしますか? [y/N] y
取得:1 http://archive.ubuntu.com/ubuntu/ trusty-updates/main unzip amd64 6.0-9ubuntu1.5 [157 kB]
157 kB を 3秒 で取得しました (50.1 kB/s)
以前に未選択のパッケージ unzip を選択しています。
(データベースを読み込んでいます ... 現在 25209 個のファイルとディレクトリがインストールされています。)
.../unzip_6.0-9ubuntu1.5_amd64.deb を展開する準備をしています ...
unzip (6.0-9ubuntu1.5) を展開しています...
man-db (2.6.7.1-1ubuntu1) のトリガを処理しています ...
mime-support (3.54ubuntu1.1) のトリガを処理しています ...
unzip (6.0-9ubuntu1.5) を設定しています ...

問題なさそう。

/proc ファイルシステムを覗いてみたが、ちゃんと見れた。

root@PC:~# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 78
model name : Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
stepping : 3
microcode : 0xffffffff
cpu MHz : 2400.000
cache size : 256 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 6
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse
sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm
pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave osxsave avx f16c rdrand
bogomips : 4800.00
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
~ 略 ~

 

mountコマンド。

root@PC:~# mount
rootfs on / type rootfs (rw,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204320k,mode=755)
none on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
none on /run/shm type tmpfs (rw,nosuid,nodev,relatime)
none on /run/user type tmpfs (rw,nosuid,nodev,noexec,relatime,size=102400k,mode=755)

 

今日はこのあたりまで。

VirtualBox 5.0上のUbuntuの時間がずれる@Windows10

Windows 10 上にVirtualBox 5.0をインストールして、Ubuntu 14.04をインストールしたところ、Ubuntuの時刻が大幅にずれる事象が発生してしまったので、対処方法をメモ。

現在のクロックソースを確認

# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
kvm-clock

 

kvm-clockは誤差が大きいようなので、acpi_pm に変更

# echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource

 

これで、時刻の変化を確認すると、正確になりました。

再起動すると元に戻ってしまうので、/etc/default/grub に以下を設定

GRUB_CMDLINE_LINUX="clocksource=acpi_pm"

 

設定を反映

# update-grub2

 

参考 : http://kzlog.picoaccel.com/post-805/

OpenStack LibertyをRDOを使ってインストール on CentOS7(KVM)

ホストOS(CentOS7)に直接OpenStackを入れると、失敗した時が面倒なので、KVM上のCentOS7にOpenStackをRDOを使ってインストールしてみました。構成は最も単純な、NIC 1枚のall-in-one構成です。

CentOS 7をKVM上にインストール

ホストOSにはKVM環境がインストールされている状態を前提とし、今回は、virt-intall コマンドを使ってGUIを使わずに一気にOSをインストールします。

CentOS 7のインストールメディア(ISOファイル)を/tmp/にダウンロードしておきます。

# ls /tmp/
CentOS-7-x86_64-DVD-1511.iso

 

Kickstartを使って自動インストールするために、以下のファイルを/tmp/centos7.ks.cfgとして作成します。

#version=RHEL7

install
cdrom
text
cmdline
skipx

lang en_US.UTF-8
keyboard --vckeymap=jp106 --xlayouts=jp
timezone Asia/Tokyo --isUtc --nontp

network --activate --bootproto=dhcp --noipv6

zerombr
bootloader --location=mbr

clearpart --all --initlabel
part / --fstype=xfs --grow --size=1 --asprimary --label=root

rootpw --plaintext password
auth --enableshadow --passalgo=sha512
selinux --disabled
firewall --disabled
firstboot --disabled

reboot

%packages
%end

 

virt-installコマンドをインスールします。

# yum install -y virt-install

 

virt-install実行するためのスクリプト/root/virt-install-centos7.shを作成します。(ファイルには実行権限をつけてください) --ram はホストのメモリに応じて適切に変更してください。以下は約20Gを割り当てています。

# virt-install \
  --name centos7 \
  --hvm \
  --virt-type kvm \
  --ram 20480 \
  --vcpus 4 \
  --cpu host
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel7 \
  --boot hd \
  --disk pool=default,size=120,format=qcow2 \
  --network network=default \
  --graphics none \
  --serial pty \
  --console pty \
  --location /tmp/CentOS-7-x86_64-DVD-1511.iso \
  --initrd-inject /tmp/centos7.ks.cfg \
  --extra-args "inst.ks=file:/centos7.ks.cfg console=ttyS0"

 

インストールを開始します。

# /root/virt-install-centos7.sh

 

数十分でインストールが完了し、ログインプロンプトが出てくるので、rootでログインします。パスワードはpasswordです。

※ ホストに戻りたい場合は Ctrl + ] で抜けられます。VMのコンソールに入りたい場合は virsh console centos7 で入れます。

インストール完了後、VMのIPを固定します。今回私が使ったKVMのNATは192.168.122.0/24セグメントで、GWは192.168.122.1でした。よって、VMには192.168.122.2を割り当てることにします。

/etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを以下のように設定しました。HWADDRやUUID等は環境依存なので、以下とあわせる必要はありません。

NAME="eth0"
HWADDR=52:54:00:AA:AA:AA
ONBOOT=yes
NETBOOT=yes
UUID="38b16985-2ee6-485c-9558-118877711111"
IPV6INIT=no
BOOTPROTO=static
IPADDR=192.168.122.2
NETMASK=255.255.255.0
GATEWAY=192.168.122.1
TYPE=Ethernet
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
PEERDNS=yes
PEERROUTES=yes

 

ネットワークを再起動します。

# systemctl restart network

 

OSをアップデートします。カーネルもアップデートされると思うので、一旦再起動します。

# yum update
# shutdown -r now

 

OpenStackのインストール

※/etc/hosts に自ホスト名の登録がないとインストール後にうまく動かないので注意してください。

RDOを使ってインストールしていきます。

# yum install https://repos.fedorapeople.org/repos/openstack/openstack-liberty/rdo-release-liberty-2.noarch.rpm
# yum install openstack-packstack
# systemctl disable NetworkManager
# systemctl stop NetworkManager

 

packstackの設定ファイル(answerファイル)を作成する。

# packstack --gen-answer-file=answers.txt --allinone --default-password=hogehoge --nagios-install=n --os-ceilometer-install=n --os-swift-install=n --provision-demo=n --os-neutron-ovs-bridge-mappings=extnet:br-ex --os-neutron-ovs-bridge-interfaces=br-ex:eth0 --os-neutron-ml2-type-drivers=vxlan,flat,vlan,gre --os-neutron-ml2-tenant-network-type=vxlan,vlan,gre

 

OpenStackをインストールする

# packstack --answer-file=answers.txt
~省略~
Applying Puppet manifests                            [ DONE ]
Finalizing                                           [ DONE ]

 **** Installation completed successfully ******

Additional information:
 * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack component
s.
 * File /root/keystonerc_admin has been created on OpenStack client host 192.168.122.2. To use the command line tools you need to source the file.
 * To access the OpenStack Dashboard browse to http://192.168.122.2/dashboard .
Please, find your login credentials stored in the keystonerc_admin in your home directory.
 * The installation log file is available at: /var/tmp/packstack/20160124-221929-25cjdB/openstack-setup.log
 * The generated manifests are available at: /var/tmp/packstack/20160124-221929-25cjdB/manifests

 

上記のように表示されれば完了です。ホストOSから192.168.122.2にブラウザでアクセスすれば、Horizonの画面が表示されます。admin/hogehoge でログインできます。

ネットワークの作成

VMが外部と通信できるように、最低限のネットワークを作成していきます。Horizonだと画面キャプチャが面倒なので、ここではコマンドラインでやります。

まずは、OpenStack API にアクセスするために、/root/keystonerc_admin を読み込みます。

# source /root/keystonerc_admin

 

コマンドプロンプトは以下のように変わりますが、本文では省略します。引き続きrootで作業していきます。

[root@localhost ~(keystone_admin)]#

 

外部(192.168.122.0/24)に接続するためのネットワークを作成します。

# neutron net-create external_network --name public --provider:network_type flat --provider:physical_network extnet --router:external --shared
Created a new network:
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | dc9b4e69-fe9f-4e51-95bb-993e920c539f |
| mtu                       | 0                                    |
| name                      | public                               |
| provider:network_type     | flat                                 |
| provider:physical_network | extnet                               |
| provider:segmentation_id  |                                      |
| router:external           | True                                 |
| shared                    | True                                 |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tenant_id                 | b6f4124545c74c49b34d01d2bee0d8a6     |
+---------------------------+--------------------------------------+

 

続けてサブネットを作ります。サブネットは外部NWで使っている192.168.122.0/24、floating IPの範囲は、192.168.122.50~250 とします。

# neutron subnet-create public 192.168.122.0/24 --name public_subnet --enable_dhcp=False --allocation-pool=start=192.168.122.50,end=192.168.122.250 --gateway=192.168.122.1

Created a new subnet:
+-------------------+-------------------------------------------------------+
| Field             | Value                                                 |
+-------------------+-------------------------------------------------------+
| allocation_pools  | {"start": "192.168.122.50", "end": "192.168.122.250"} |
| cidr              | 192.168.122.0/24                                      |
| dns_nameservers   |                                                       |
| enable_dhcp       | False                                                 |
| gateway_ip        | 192.168.122.1                                         |
| host_routes       |                                                       |
| id                | ba164dd2-adae-4032-92ff-c0dde2d39698                  |
| ip_version        | 4                                                     |
| ipv6_address_mode |                                                       |
| ipv6_ra_mode      |                                                       |
| name              | public_subnet                                         |
| network_id        | dc9b4e69-fe9f-4e51-95bb-993e920c539f                  |
| subnetpool_id     |                                                       |
| tenant_id         | b6f4124545c74c49b34d01d2bee0d8a6                      |
+-------------------+-------------------------------------------------------+

 

publicネットワークに繋げるルータを作成します。

# neutron router-create router-public
Created a new router:
+-----------------------+--------------------------------------+
| Field                 | Value                                |
+-----------------------+--------------------------------------+
| admin_state_up        | True                                 |
| distributed           | False                                |
| external_gateway_info |                                      |
| ha                    | False                                |
| id                    | f327752b-ff18-4407-ae5d-6359b859af6e |
| name                  | router-public                        |
| routes                |                                      |
| status                | ACTIVE                               |
| tenant_id             | b6f4124545c74c49b34d01d2bee0d8a6     |
+-----------------------+--------------------------------------+

 

ルータをpublicネットワークにつなげます。

# neutron router-gateway-set router-public public
Set gateway for router router-public

 

次にプライベートネットワーク/サブネット(192.168.200.0/24(任意))を作成し、上記ルータに接続します。

# neutron net-create private_network --name private
Created a new network:
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | efc08ebd-b37d-4044-8bde-0c9bbe0ec9bc |
| mtu                       | 0                                    |
| name                      | private                              |
| provider:network_type     | vxlan                                |
| provider:physical_network |                                      |
| provider:segmentation_id  | 42                                   |
| router:external           | False                                |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tenant_id                 | b6f4124545c74c49b34d01d2bee0d8a6     |
+---------------------------+--------------------------------------+
# neutron subnet-create private 192.168.200.0/24  --name private_subnet
Created a new subnet:
+-------------------+------------------------------------------------------+
| Field             | Value                                                |
+-------------------+------------------------------------------------------+
| allocation_pools  | {"start": "192.168.200.2", "end": "192.168.200.254"} |
| cidr              | 192.168.200.0/24                                     |
| dns_nameservers   |                                                      |
| enable_dhcp       | True                                                 |
| gateway_ip        | 192.168.200.1                                        |
| host_routes       |                                                      |
| id                | 1b843ed8-d09f-4421-a994-7801ae0330c0                 |
| ip_version        | 4                                                    |
| ipv6_address_mode |                                                      |
| ipv6_ra_mode      |                                                      |
| name              | private_subnet                                       |
| network_id        | efc08ebd-b37d-4044-8bde-0c9bbe0ec9bc                 |
| subnetpool_id     |                                                      |
| tenant_id         | b6f4124545c74c49b34d01d2bee0d8a6                     |
+-------------------+------------------------------------------------------+
#  neutron router-interface-add router-public private_subnet
Added interface 8e97fd0f-60c8-4232-a453-a641edb1f7fa to router router-public.

 

あとは、必要なイメージをglanceにアップロードし、キーペアを作成すれば、VMが起動できます。なお、デフォルトのセキュリティグループでは、VMへsshログインできないので、注意してください。

参考

 

リモートデスクトップのWindows10のシャットダウン

デスクトップ画面でAlt + F4 を押すと、シャットダウンメニューが出てきます。以上!

DockerHubのイメージのタグ一覧をコマンドで取得する

docker コマンドでタグを指定せずにコンテナイメージをpullすると、latestタグのイメージがDockerHubからダウンロードされますが、他のタグのイメージをダウンロードしようとした場合、存在するタグ一覧をdockerコマンドで確認できず不便です。

そのため、curlコマンドを使ってDockerHubのレジストリのAPIを直に叩いて情報を取得する方法を紹介します。以下は、centosのタグ取得例です。

$ curl -s https://registry.hub.docker.com/v1/repositories/centos/tags | sed "s/,/\n/g" | grep name | cut -d '"' -f 4
latest
5
5.11
6
6.6
6.7
7
7.0.1406
7.1.1503
7.2.1511
centos5
centos5.11
centos6
centos6.6
centos6.7
centos7
centos7.0.1406
centos7.1.1503

 

毎回コマンドを叩くのは大変ならば、.bashrc 等に以下を記述しておけば、運用が楽になります。

function docker-taglist {
    curl -s https://registry.hub.docker.com/v1/repositories/$1/tags | sed "s/,/\n/g" | grep name | cut -d '"' -f 4
}

 

もちろん実行結果は同じです。

$ docker-taglist centos
latest
5
5.11
6
6.6
6.7
7
7.0.1406
7.1.1503
7.2.1511
centos5
centos5.11
centos6
centos6.6
centos6.7
centos7
centos7.0.1406
centos7.1.1503

dockerのストレージドライバーをdevicemapperに変更する@Ubuntu 14.04

Ubuntu 14.04(desktop)にdockerを入れて、docker infoを見たら、バックエンドのストレージドライバーがaufsだったので、これをdevicemapperに変更してみた。 ※ 変更するとローカルにあるイメージは削除されますので、必要ならバックアップしておいてください。

変更前の状態

# docker info
Containers: 1
Images: 5
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 7
 Dirperm1 Supported: true
Execution Driver: native-0.2
Kernel Version: 3.16.0-30-generic
Operating System: Ubuntu 14.04.3 LTS
CPUs: 1
~ 略 ~

 

/etc/default/docker に以下を設定します。

DOCKER_OPTS="--storage-driver=devicemapper"

 

dockerを再起動

# restart docker

 

設定反映を確認 (既存イメージを消しているのか、少し時間がかかります。)

# docker info
Containers: 0
Images: 5
Storage Driver: devicemapper
 Pool Name: docker-8:1-2493613-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 500.7 MB
 Data Space Total: 100.4 GB
 Data Space Available: 50.54 GB
 Metadata Space Used: 946.2 kB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.147 GB
 ~略~

LXDEのスタートメニューのカスタマイズ@Ubuntu 14.04

menulibreというツールがあるので、これをリポジトリに追加してインストールすればカスタマイズできます。

$ sudo add-apt-repository ppa:menulibre-dev/devel
$ sudo apt-get update
$ sudo apt-get install menulibre

linuxのSWAPパーティッションにUUIDを指定する

ext3とかext4のパーティッションはtune2fsでUUIDを指定できますが、同様にSWAP用のパーティッションにもUUIDを指定できます。

~# mkswap -U 00000000-1111-2222-3333-444444444444 /dev/sda5 スワップ空間バージョン1を設定します、サイズ = 2996220 KiB ラベルはありません, UUID=00000000-1111-2222-3333-444444444444 ~# blkid /dev/sda5 /dev/sda5: UUID="00000000-1111-2222-3333-444444444444" TYPE="swap"

VirtualBox 5で、USBメモリ全体をディスクとして使う@Windows 10

管理者権限でWindowsのコマンドプロンプトを起動し、以下のようにUSBメモリをrawディスクとして使うためのショートカットみたいなファイルを作成し、これをVirtualBoxのディスクとして使用するだけです。なお、VirtualBoxを起動するときも管理者権限で起動しないと、USBメモリへのアクセス権限がないというエラーが出ますので注意してください。

C:\>"C:\Program Files\Oracle\Virtualbox\VBoxManage.exe" internalcommands createrawvmdk -filename c:\vmdir\ubuntu\rawdisk.vmdk -rawdisk \\.\PhysicalDrive1
RAW host disk access VMDK file c:\vmdir\ubuntu\rawdisk.vmdk created successfully.

 

\.\PhysicalDrive1 は、USBメモリのデバイス番号で、Windowsのディスクの管理画面で確認できます。c:\vmdir\ubuntu\rawdisk.vmdk が作成するrawディスクへのショートカットみたいなファイル名です。中身はこんな感じです。

# Disk DescriptorFile
version=1
CID=a9ffdc06
parentCID=ffffffff
createType="fullDevice"

# Extent description
RW 123437056 FLAT "\\.\PhysicalDrive1" 0

# The disk Data Base 
#DDB

ddb.virtualHWVersion = "4"
ddb.adapterType="ide"
ddb.geometry.cylinders="16383"
ddb.geometry.heads="16"
ddb.geometry.sectors="63"
ddb.uuid.image="eff4828b-c4db-4235-9953-6a753d18b55e"
ddb.uuid.parent="00000000-0000-0000-0000-000000000000"
ddb.uuid.modification="78e95b87-a838-4f0c-9ddc-05afb04e96f1"
ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000"
ddb.geometry.biosCylinders="1024"
ddb.geometry.biosHeads="255"
ddb.geometry.biosSectors="63"

sphinxのPDF出力環境を構築する@Ubuntu 14.04

pythonはすでにインストールされているはずなので、pipをインストール

# apt install python-pip

 

Sphinxのインストール

# pip -v install sphinx

 

LaTeX関連のパッケージのインストール

# apt-get install texlive texlive-lang-cjk

 

これで、SphinxのMakefileにデフォルトで入っているPDF作成コマンド(日本語対応)が使えます。

#  make latexpdfja

Windows 10の強制アップデート・再起動を無効にする

Windows 10 Proでは、Windowsが強制的にアップデートされ、ほったらかしていると再起動されるため、かなり不便です。そこで、これを無効にし、Windows 7の時のように、手動でダウンロードする方法の紹介です。

まずは、グループポリシーエディター画面を開きます。開き方がわからない場合は、Ctrl + x を押して、「ファイル名を指定して実行」を選択し、gpedit.msc と入力すれば起動できます。

そこから、ローカルコンピューターポリシー → 管理用テンプレート → Windowsコンポーネント → Windows Update をたどります。

「自動更新を構成する」をダブルクリックし、下記画面のように設定します。今回は、ダウンロードも手動にしたいので、「2. ダウンロードとインストールを通知」を設定しました。

auto-update

このように設定することで、Windows Update の画面はこのようにダウンロードボタンが表示されるようになります。

win-update-download

ちなみに、アップデート後の再起動を強制されたくない場合は、同じく、ローカルコンピューターポリシー → 管理用テンプレート → Windowsコンポーネント → Windows Update  にある、「スケジュールされた時刻に常に自動的に再起動する」を無効にしておけばOKだと思います。

このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ