ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

Ubuntu Server 16.04のコンソールがたまに表示されない場合の対応方法

Ubuntu Server 16.04のコンソールがたまに表示されない問題。 起きるときは頻繁に起きるし、起きないときは全く起きないのでかなり謎。

ちなみに再現するときは物理マシンだろうが仮想マシンだろうが再現します。 とりあえず「Alt」+「F1」を連打すると画面が出ます。たまに文字色がおかしくなります。

Bashのコマンド補完「bash-completion」を忘れずに入れようと思った

Bashでコマンドの補完をするのはBash Completionを利用すると便利。 CentOS 7をminimalインストールした場合はBash Completionパッケージが入っていないので入れると良い。 これで長い名前のサービス名を手打ちする必要がなくなる。

bash-completionパッケージは標準リポジトリーにあるのでインストールする。 bash-completionパッケージをインストール後もコマンドの補完ができないと思ったら、「インストール後は一旦ログアウト&ログインが必要」であることをすっかり忘れていた。

再ログイン後はコマンドの補完が[tab]キーで行えるようになっていた。

~]# yum install bash-completion
~]# complete
~]# logout

~]# complete
complete -F _minimal
complete -F _filedir_xspec oodraw
complete -F _filedir_xspec elinks
...

~]# systemctl s [tabキーを2回叩いてみる]
set-default       show              start             suspend
set-environment   show-environment  status            switch-root
set-property      snapshot          stop

~]# systemctl restart ht [tabキーを2回叩いてみる]
htcacheclean.service  httpd.service

なんでこんな基本的なことを今更書いたかというと、最近は自分しか触らない環境は真っ先にzshを入れて切り替えてしまうので、すっかり忘れていたのでまた忘れないように書いた訳である。

疎通確認に関するTips

サーバーにリモートアクセスできるかを確認するためにまず使われるのがpingというコマンドだと思います。 かつてはそれでも問題なかったのですが、最近はpingを許可しないようにファイアーウォールでブロックしていることもあるようです。

例えばWindows Serverはデフォルトの設定でpingによる通信(ICMP)を許可していません。LinuxでもICMPをブロックしている環境がたまにあったりします。

一方で、リモート管理の観点からWindowsの場合リモートデスクトップ用のポートをを、Linuxの場合SSH通信用のポートを許可している場合があります。こんな時に使えるのがnpingというコマンドです。

pingはICMPプロトコルを使って疎通確認を行うことができるコマンドです。実はSolarisのようにpingでポート指定できるようなOSもあるのですが、一般的にはpingコマンドではポートを指定できません。ところがnpingコマンドではIPアドレスとともにポートを指定することができます。使い勝手はpingコマンドとほとんど一緒です。

次のように使いことができます。 オプションはcオプションで試行回数、eオプションでインターフェイス、pオプションでポートを指定できます。 実行のログはvオプションでより詳細に出すことができますし、qオプションを指定すると結果だけを出力できます。

非常に便利なコマンドですね。利用するにはnmapパッケージをyumやaptなどのコマンドでインストールします。

$ sudo nping -c3 192.168.57.102 -p22 --tcp

Starting Nping 0.7.01 ( https://nmap.org/nping ) at 2017-06-03 14:49 UTC
SENT (0.0032s) TCP 192.168.57.101:54361 > 192.168.57.102:22 S ttl=64 id=15854 iplen=40  seq=1589366271 win=1480
RCVD (0.1975s) TCP 192.168.57.102:22 > 192.168.57.101:54361 SA ttl=64 id=0 iplen=44  seq=3687439332 win=29200 <mss 1460>
SENT (1.0040s) TCP 192.168.57.101:54361 > 192.168.57.102:22 S ttl=64 id=15854 iplen=40  seq=1589366271 win=1480
RCVD (1.1980s) TCP 192.168.57.102:22 > 192.168.57.101:54361 SA ttl=64 id=0 iplen=44  seq=3703078323 win=29200 <mss 1460>
SENT (2.0053s) TCP 192.168.57.101:54361 > 192.168.57.102:22 S ttl=64 id=15854 iplen=40  seq=1589366271 win=1480
RCVD (2.1979s) TCP 192.168.57.102:22 > 192.168.57.101:54361 SA ttl=64 id=0 iplen=44  seq=3718724257 win=29200 <mss 1460>

Max rtt: 194.180ms | Min rtt: 192.381ms | Avg rtt: 193.479ms
Raw packets sent: 3 (120B) | Rcvd: 3 (138B) | Lost: 0 (0.00%)
Nping done: 1 IP address pinged in 2.20 seconds

Ubuntu MATE 16.04.2(32bit)がAcer Aspire ONE AOA 150-Bbで動作しました

ネットブック。 それは、2007年頃から各PCメーカーから発売され、2012年に市場から消えたノートPCでもなく、タブレット型コンピューターでもない小型PC。

私もその軽さや小ささに惹かれて購入したものの、数ヶ月使ってキーボードや画面の小ささから操作しづらく、次第に使わなくなったのを覚えています。 さらにOSもWindows XPしか公式サポートしていないので、新しいバージョンのWindowsへのアップグレードも簡単にできないし、いろいろあって最後は妹が数年使って、気がついたら手元に戻ってきていました。

それからまた数年経って、先日部屋の掃除をしていたらAcer Aspire ONE AOA 150-Bb(ZG5)を見つけました。 起動してみるとXPのロゴ。懐かしいような嫌な思い出が蘇るような。

昔と比べて(多少)気が長くなったのか、割とサクサク動いているような気がしました。 じゃあ、このマシンを何かに使えないかと思ったところ、Ubuntuの16.04が動作するような情報を発見。

早速、32bit版のUbuntu Desktopをダウンロードすることに。 今回は私の好みでUbuntu MATEをインストールすることにしました。

f:id:ytooyama:20170530115521j:plain

Ubuntu MATE 16.04.2 32bit + Acer Aspire ONE AOA 150-Bbが動作しました。無線LANも利用できました(ただし無線の2.4GHzのみ対応)。ちなみにちょっと体感で遅いかなと思う程度の操作感です。あのころのNTFSよりもEXT4の方が読み書きか速いから結果、体感速度で速く感じるってことなのだろうか。

インストール方法は

と簡単でした。久しぶりに電源を入れる場合はBIOSの時刻が初期化されている場合があるので、そちらもチェックした方がいいと思います。

作業端末にする予定ですがこのマシン、無線LANが繋がらなくなることがたまにあるようで、電源を切ったあと、ACとバッテリーを取り外して数分放置してバッテリー、電源を入れ直すと右下の無線LANスイッチがうまく動くようになるとか…なんだそりゃ。

ちなみに、MacBook Proもびっくりなほど爆熱です。Windows XPで動いていた時もこんな感じだったので、このころのAtom CPUってそんなもんなんでしょう。多分

CentOS7でNICのBondingを行うには

重要なこと

CentOS7はNetworkManagerが標準で実行されています。ここは元となっているRed Hat Enterprise Linux 7でも同様です。もしNetworkManagerを有効の状態でBondingを行なってもよければ、NetworkManager GUI、nmcliコマンド、nmtuiコマンドなどで設定を実行できて便利なので、NetworkManagerを生かしたまま、お好みの方法でBondingをした方がいいと思います。詳細はRHEL7のマニュアル「ネットワークガイド第4章 ネットワークボンディングの設定」をご覧ください。OVSでBondingをする場合はNetworkManager/networkサービスのいずれかが正常に動いていれば、どちらでも構いません。

さて、LinuxでBondingを行うには2つの方法があります。一つはKernelのbondingモジュールを使ってカーネルレベルでBondingするという方法です。もう一つはOpenvSwitchを使ってBondingするという方法です。

前者は追加でインストールするものはないのですぐに使えます。OpenvSwitchを使う方法はLinuxにOpenvSwitchをインストールするという手間が追加で発生します。LinuxでBondingをした場合はLinuxの様々なコマンドで状態を確認します。例えばパケットが送受信されているかはtcpdumpコマンドを使うなど。一方、OVSを使ったBondingの方がステータスの確認をするコマンドが充実しているので便利だったりします。

はじめに

実際の手順に入る前に、今回の構成を以下に書いてみます。 サーバーには3つのNICを用意して、うち2つはbonding用、1つは管理用に使います。作業するときは管理用のNIC経由でサーバーにアクセスします。今回の例はeth0とeth2は同じVLANで、eth1はeth0,2とは別のVLANに接続されているのを想定しています。

  • eth0–bonding用
  • eth2–bonding用
  • eth1–管理用(別VLAN)

家庭でBondingを試したい場合は、Linux KVMを使うといいと思います。eth0と2をLinux Bridgeとつなぎ、eth1をKVM標準のNATにつなげば良いと思います。

今回は上に載せるアプリケーションの都合でNetworkManagerを無効化して、従来のnetworkサービスを使う方法について説明します。NetworkManagerが使えるならもっと楽ができるし情報もたくさんあるのですが、そこはまあ仕方ないですね。

LinuxのBondingモジュールで構成する

1) まず、yum updateでシステムを最新の状態に更新します。新しいKernelが追加された場合は再起動します。

2) 次にeth0とeth2の設定を記述します。

HWADDRはNICMACアドレスを記述します。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
MASTER=bond0
SLAVE=yes
# vi /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
BOOTPROTO=none
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
MASTER=bond0
SLAVE=yes

3) bond0というデバイスを作るため、次のように設定を記述します。

# vi /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
BONDING_OPTS="mode=1 miimon=100"

bondingのモードを切り替えるには上記ネットワーク設定にあるBONDING_OPTSにモードを指定します。設定を反映するにはmodprobe -r bonding &&modprobe bondingなどと実行するか、ホストを再起動しましょう。

4) ifcfg-bond0 にローカルIPを設定します。

...
IPADDR=172.17.14.224
NETMASK=255.255.255.0
GATEWAY=172.17.14.1
DNS1=172.17.14.3

5) デフォルトゲートウェイを設定します。

# vi /etc/sysconfig/network
GATEWAY=172.17.14.1

ここまでできたら再起動すると、次回起動時にbond0が作られてネットワーク通信できる状態になります。cat /proc/net/bonding/bond0コマンドでbondingの状態を確認できます。

OVSでBondingを構成する

1) まず、yum updateでシステムを最新の状態に更新します。新しいKernelが追加された場合は再起動します。

2) openvswitch パッケージをインストールします。CentOSの場合はOpenStack用のリポジトリーに比較的新し目のopenvswitchパッケージが用意されているのでyum list|grep centos-release-openstackを実行して可能な限り新しいOpenStackバージョンを確認して、メタパッケージをインストールします。これでOpenStackパッケージリポジトリ〜が有効になるので、そのあとyum install openvswitchを実行してOVSをインストールします。

2017/6/10追記

centos-openstack-ocata/x86_64で公開されているopenvswitch-2.6.14.1.git20161206.el7ですが、本手順を実施してもまともに動きません。パッケージにバグがあるのかも。以下で公開したsrpmを使ってrpmをビルドしたものを使ってください。そのバージョンでは問題なく動作するのを確認しています。

github.com

3) 次にeth0とeth2の設定を記述します。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
IPADDR=0.0.0.0
# vi /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
BOOTPROTO=none
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
IPADDR=0.0.0.0

「ONBOOT=yes」と「IPADDR=0.0.0.0」を書いて、NICのstateがUPになるようにします。ここら辺はNetworkManagerだとよしなにやってくれるのですが、networkサービスではちょっと工夫する必要があります。

4) OVSではブリッジポートに自身のポートとbondingのポートをくっつけることでNICのbondingを実現します。そのために、まずOVSのブリッジ設定を記述します。

# vi /etc/sysconfig/network-scripts/ifcfg-ovsbr0
DEVICE=ovsbr0
DEVICETYPE=ovs
TYPE=OVSBond
OVS_BRIDGE=ovsbr0
ONBOOT=yes
BOOTPROTO=none
IPADDR=172.17.14.224
NETMASK=255.255.255.0
GATEWAY=172.17.14.1
DNS1=172.17.14.3
BOND_IFACES="eth0 eth2"
OVS_OPTIONS="bond_mode=active-backup"

5) デフォルトゲートウェイを設定します。

# vi /etc/sysconfig/network
GATEWAY=172.17.14.1

6) コマンドを実行して、ブリッジとポートの割り当てを行います。

# systemctl start openvswitch && systemctl enable openvswitch
# ovs-vsctl add-br ovsbr0
# ovs-vsctl add-bond ovsbr0 bond0 eth0 eth2
# ovs-vsctl set port bond0 bond_mode=active-backup

7) 次のコマンドを実行することで様々な情報を引き出すことができます。

# ovs-appctl bond/list
(bondingデバイスとモード、スレーブデバイスを一覧で表示)
# ovs-appctl bond/show
(上記をもう少し詳細に表示)
# ovs-ofctl dump-flows ovsbr0
(パケットの送受信の状態の表示)
# ovs-vsctl show
(ブリッジとポートの状態と構成を一覧表示)

今回OpenStackを動かすにあたり、OpenStackではNetworkManagerはまだ利用できないので、NetworkManagerをオフにした上でBondingする方法を調べたら割と苦労したので、今後のためを思ってブログに書いてみました。誰か一人にでも役立つことがあれば幸いです。

リンク集

今回の記事を書くにあたり、参考にしたサイト一覧です。

Linux Bonding

OVS Bonding

docker-composeやWSLのサポート、いくつかのバグ修正がされたVagrant 1.9.5がリリース

Vagrant 1.9.5が5/15にリリースされていたので更新。OS X版は特に問題なし。

VagrantはOSやアプリケーションのデプロイメントツールで、Vagrantプラグインにより、様々な機能を追加したり、ハイパーバイザー、コンテナーに対応できる。標準ではVirtualBoxをサポートするほか、プラグインの追加により、Linux KVM、Docker、Hyper-V、ESXiなどに対応できる。

ダウンロードは公式サイトから可能。

CentOS 7でVanilla Kernelを使う方法

追記 (2017/5/14)
* make prepareを追加
* 同じ方法で4.9.27をビルド完了 

最近のLinuxなら、なんらかのパッケージ管理システムがあって、yumとかdnfとかaptといったようなパッケージ管理用のコマンドがあり、パッケージをコマンドを使うなどで簡単に導入したり、アップデートができると思います。Linuxディストリビューションによっては自分でビルドすることを主眼においているものも存在します。

普段はLinuxディストリビューションが用意するパッケージを使っていればインストールが楽ですし、パッチの迅速な適用ができるので良いのですが、時に自らの手で欲しいバージョンのパッケージを作成して使いたいと思う時があります。

ちなみにVanilla KernelとはオリジナルのLinuxカーネルの事です。Linux KernelはThe Linux Kernel Organizationのコミュニティグループが開発、管理をしています。

さて、主題の「CentOS 7でVanilla Kernelを使う方法」ですが、下記のサイトの手順にあるように実行するだけです。 make rpmを実行したらすぐインストールできるrpmパッケージを生成することができます。簡単ですね。

…とだけ書いて終わりだと不親切すぎますし、実際その通りやろうとしてみると、いろいろと事前に準備するものもあったりするので、ブログにまとめようと思います。

必要なパッケージをインストールする

今回はソースインストールではなく、インストールや設定を容易にするためにrpmパッケージを作ってみます。その場合に必要なパッケージは次の通りです。

# yum groupinstall "Development Tools"
# yum install openssl-devel bc ncurses ncurses-devel rpmdevtools yum-utils rpm-build

カーネルソースをダウンロード

Linuxカーネルを次の手順に従ってダウンロードします。

# git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
# cd linux-stable
# git checkout v4.9.26 <-目的のバージョンのソースに切り替え

もしくは次のサイトを開いて、目的のバージョンのtar.gzのファイルをダウンロードしたあと、展開してください。

カーネルのビルド

次のコマンドをそれぞれ実行してカーネルのビルドを行います。

# make oldconfig   #現在のカーネルと同じ設定を適用
# make menuconfig    #ビルドするカーネルのオプションを定義する
# make prepare

# make rpm                 #rpmパッケージを作る

カーネルのビルドには多くの時間がかかります。最後のmake rpmを実行したあとは、しばしなんらかの方法で時間を潰しましょう。 ビルドが完成すると~/rpmbuild/RPMSディレクトリーにrpmパッケージが、~/rpmbuild/SRPMSディレクトリーにソースRPMパッケージが展開されます。

ビルドしたrpmパッケージをインストー

f:id:ytooyama:20170513011414p:plain

~/rpmbuild/RPMSディレクトリーに移動して、yum localinstall "packagename"コマンドを使ってrpmパッケージをインストールします。

ビルドしたカーネルをデフォルトに設定する

インストールしたらCentOS 7を再起動します。GRUBの画面で新しいカーネルを選択するとそのカーネルでOSが起動します。起動したらログインしてdmesgコマンドを使って起動ログを閲覧し、変なログ、エラーが出ていないか確認します。

ちなみに新しいカーネルを標準のカーネルに設定したい場合は、次のようにしてデフォルトのカーネルを設定します。grep ^menuent /boot/grub2/grub.cfg | awk -F\' '{ print $2 }'コマンドでインストール済みのカーネル一覧を出力します。

# grep ^menuent /boot/grub2/grub.cfg | awk -F\' '{ print $2 }'
CentOS Linux (4.9.26) 7 (Core)
CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-9541e782676048f19421d05ff8b295a1) 7 (Core)

上から0,1,2…番と数えます。/etc/default/grubGRUB_DEFAULTに起動するkernelの番号を設定します。今回はビルドしたカーネル4.9.26を標準としたいので、0を設定します。

# vi /etc/default/grub
...
GRUB_DEFAULT=0

GRUB2はデフォルト設定を定義するファイルの設定を書き換えた後、起動時に読み込まれる新しいgrub.cfgファイルを生成する必要があります。CentOS 7ではupdate-grubといったコマンドはないので、次のように実行してください。最後に再起動して新しいカーネルを読み込んでみましょう。以降はGRUBカーネルを選択しなくてもカーネル4.9.28を使ってCentOS 7.3が起動するはずです。

# grub2-mkconfig -o /boot/grub2/grub.cfg
# reboot

無事に起動したようです。

f:id:ytooyama:20170513011355p:plain

以上、CentOS 7でVanilla Kernelを使う方法でした。

さてここまでやってみるとこう思うと思います。なんてパッケージのビルドって時間や手間暇がかかるんだと。昔はソースビルドするのが当たり前でしたが、ビルド済みパッケージがあるおかげで普段、色々ラクをさせてもらっているのです。その裏にいるのは人なのか機械なのかはわかりませんが、パッケージのメンテナーに感謝しましょう。

情報源へのリンク

今回の情報源のリンクを最後にまとめます。