hardware, linux, 小ネタ

おはようございます。ライトノベル好きのツチノコです。ヒマワリの季節が近づいてきましたね。

さて、タイトルの通り、ONIEをbuildしました(というか何回かしている)ので日本語で手順をまとめておきます。
公式のドキュメントは https://github.com/opencomputeproject/onie/wiki/Building-ONIE です。

5月のJapan ComCamp meets de:codeでLTした、例のブンチンカッコカリからのリカバリの時にも利用しました(スライド中ではONIE関連は省略)。

前の記事はここです。間があいてしまってもうしわけないです(夏休みの宿題はためるタイプでした)

環境はDockerで作ってしまうことにします。Dockerfileは https://gist.github.com/wataken44/e5e6c7f94b257c15196d50bab9a9a2de にあります。

まずはimageをbuildします。

Dockerfileの中身は以下のようになってます。

コンテナを走らせてbuildします。

<vendor>,<model>のところにはお手元の機種名を入れます。DellのS6000-ONだとそれぞれdell, s6000_s1220になります。一覧は ~/onie/machine 以下にあります。

1時間くらいでbuildが終わり、isoイメージやpxe用のイメージができます。

あとはUSBメモリに焼くなりなんなりしてセットアップすればONIEのインストールができるようになります。
ご活用ください。

BIOS
上はDell S6000-ONのBIOS画面です。AMIのBIOSが動いていて、8GBのメモリが乗っていることがわかります。
シリアル経由ですがツチノコブログの読者には見慣れた画面ではないでしょうか。

S6000のBIOS
Boot orderを変更できる画面です。

ネットワークスイッチのBIOS画面が見れて、そこらへんのPCと同じようにOSをインストールしたりできるようになりました。すごい時代ですね。

p.s. このテンプレ展開のせいで、おれのラブコメが鬼畜難易度がすごい

linux, コラム

連休直前にノートPCのバッテリーが充電できなくなった。
故障した機材は、ThinkPad X1 Carbon 3rd Generation + Ubuntu 15.10。
ちょうど Ubuntu 16.04 LTS が出たばかりだよねえ。
さらに我々の部署の新しい標準PC(4th Generation)が入荷してきたぞ、ということでセットアップしてみたよ。

BIOSの設定

ThinkPadは電源を入れた直後に、F1キーを押せばBIOSセットアップ、F12キーでboot元を選択できる。
まずは、F1キーを押して、BIOSの設定変更。

  • USB接続機器からbootできる設定になっていることを確認
  • 仮想化テクノロジーが標準だとdisableになってるので、enableにする
  • Secure Boot をdisableにする

インストールメディアの準備

USBキーからインストールするのがお手軽。
ISOイメージをダウンロードしてきて、ブータブルUSBキーを作るツールで書きこんでやればOK。
Ubuntuで使えるツールでは以下なんだけど、、、、、、

  • usb-creator-gtk(ブータブルUSBキーの作成)
  • unetbootin
  • mkusb

usb-creator-gtk は、ここ数年バグってて使いものにならないんだよね。
案の定今回もうまく起動できるUSBキーは作れなかった模様。

unetbootin で作ったUSBは起動できたけど、起動直後に、「SYSLINUX 6.03 EDO …. Boot Error」 というメッセージが出て途中で止まっちゃう。
調べてみると、今のunetbootinに含まれているSYSLINUXに問題があって、機種によってこういうエラーが出るんだとか。

mkusbで作ったUSBキーでも起動できず。

さあ困った。
WindowsとかでUSBキーを作れば良いのかなあ。

あきらめて素直にDVD-Rに焼いて、DVDドライブから起動したら問題なく起動したよ。
なんかすごく時間を無駄にしたけど結果オーライ。

インストール

インストールメディアから起動できてしまえば後は素直にインストールできる。
今回はハードディスクを全部使う設定でGo。

ノートPCによっては無線LANのドライバーがなかったりすることもあるけど、X1 Carbonではインストール直後から問題なく無線LANは使えた。
Bluetooth、音量コントロール、画面の輝度コントロールなんかも問題なし。

インストールの後は生活環境を整えていく。

Aの横をCtrlキーにする

gnome-tweak-tool をインストール。

sudo apt-get install gnome-tweak-tool

Caps Lock を Ctrl として扱う、にチェックを入れる。

zsh

まずはシェルを変更。zshがどう良いかはググってくださいませ。

sudo apt-get install zsh
chsh

以前の環境から設定ファイルとhistoryファイルをホームディレクトリ以下にコピー。

日本語環境整備

zipアーカイブ中に日本語ファイル名があると、素のunzipコマンドだと変なファイル名になってしまうので、Japanese Teamによる追加パッケージを追加。
以下のURLを参考に。

https://www.ubuntulinux.jp/japanese

wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -
sudo wget https://www.ubuntulinux.jp/sources.list.d/xenial.list -O /etc/apt/sources.list.d/ubuntu-ja.list
sudo apt-get update
sudo apt-get upgrade
sudo apt-get ubuntu-defaults-ja

SKK

SKKがあまりにも手に馴染んでしまっていて他の日本語入力を使えないんだよねえ。
SKKを使うやり方はいろいろあるけど、最近のUbuntu的には fcitx-skk を使うのがお勧めかしら。

sudo apt-get install fcitx-skk

インストール後は fcitx の再起動。
右上のキーボードをクリック→再起動。

skkを追加。
右上のキーボードをクリック→現在の入力メソッドの設定。
「+」ボタンを押して、skk を追加。

以前使ってたユーザー辞書をコピー。具体的には以下のファイルをコピーすればOK。

~/.config/fcitx/skk/user.dict

Emacs

世の中的にはvimなのかもしれないが、おじさんはemacsが慣れてるのよ。
w3mモードもついでに入れとく。

sudo apt-get install emacs
sudo apt-get install w3m-el

以前の環境から、 .emacs や自前の elisp ファイルをコピー。

Atom

markdown を読み書きするときは、Emacs より Atom のほうがプレビューできて便利。

sudo add-apt-repository ppa:webupd8team/atom
sudo apt-get update
sudo apt-get install atom

以前の環境から ~/.atom ディレクトリをコピー。

Firefox

以前の環境から ~/.mozilla ディレクトリをコピー。

Chromium

艦これは、Chromiumでやるほうが便利。
flashのプラグインもインストール。

sudo apt-get install chromium-browser

sudo apt-get install pepperflashplugin-nonfree
sudo update-pepperflashplugin-nonfree --install

以前の環境から、 ~/.config/chromium ディレクトリをコピー。
艦これが動くことも一応確認。

Skype

Ubuntuソフトウェアセンターのソフトウェアソースから「Canonicalパートナー」をソースに追加。

sudo apt-get update
sudo apt-get install Skype

以前の環境から、 ~/.Skype ディレクトリをコピー。

ScudCloud

Slackクライアントも追加。

https://launchpad.net/~rael-gc/+archive/ubuntu/scudcloud
sudo apt-add-repository -y ppa:rael-gc/scudcloud
sudo apt-get update
sudo apt-get install scudcloud

以前の環境から、 ~/.config/scudcloud ディレクトリをコピー。

指紋認証

以下のURLを参考にインストール。

http://zecheru.com/thinkpad-fingerprint-ubuntu-14-04/?v=24d22e03afb2

sudo apt-add-repository ppa:fingerprint/fingerprint-gui
sudo apt-get update
sudo apt-get install libbsapi policykit-1-fingerprint-gui fingerprint-gui

インストールしたら、fingerprint-gui を起動して、Fingerタブから指紋登録、、、、、と思ったら、4th Generation の指紋デバイスがうまく認識されてないな。
3rd Generation のときは、ログイン、スクリーンロック解除、sudo、なんかで普通に使えて便利だったんだけどなあ。
継続課題ってことで。。。。

gpointing-device-setting

ThinkPad の TackPad や TrackPoint の微調整をするときに便利に使えるツールなんだけど 16.04 では標準パッケージから外れてるっぽい。

マウストタッチパッドの設定で、ポインターの速度を速くして、タッチパッドをオフにしただけど、そんなに困ってないので、継続課題ってことで。
真ん中のボタンも正常に動作はしている。

4Kディスプレイ接続

3rd Generationと同じように普通に4Kディスプレイに表示できた。
手元のDELLのモニタだと、SSTモードだと駄目で、MSTを有効にする必要はあった。

ただ、起動時に接続していれば問題なく使えて、その状態からケーブルを抜いても問題ないんだけど、起動した後で4Kディスプレイに接続すると画面が固まることもある。
これも前と一緒の症状だな。

使ってみた感想

以前の環境の画面は 1920×1080 で、文字が小さいけど画面が広くて便利、と思ってたんだけど、今度の環境は 2560×1440。
さらに画面が広くなって、文字もすごーくちっちゃい!!
目が大変か、と思ったけど、意外と慣れるね。
でも画面が広いとマウスでのカーソル移動が大変。
タイル型ウィンドウマネージャーとか使ってみたほうが良いのかもなあ。

細かいソフトウェアのアップデートはあるので注意しなきゃいけないこともありそう。
たとえば、OpenSSHは、バージョンが7.2になって、ssh-dss のような Legacy なプロトコルは標準だと使えないようになってる。
まあ設定ファイルを書くか、コマンドラインで -oHostKeyAlgorithms=+ssh-dss のような指定をすれば大丈夫だけどね。

とりあえず生活環境が整ったので、連休後半はサーバをいじるよ!!

(参考)インストールの後のその他の設定

このへんを見るのがお勧め!!

Ubuntu 16.04 LTSをインストールした直後に行う設定 & インストールするソフト

linux, 失敗談

おはようございます。ライトノベル好きのツチノコです。トクシュー!は読みましたか?

さて、先日SONiCをbuildした記事を書きました。
当然、次のステップとしてS6000-ONにインストールしたところ、見事に失敗しました!!!
その顛末記を書こうと思います。
文鎮2

USBメモリ上に acs-generic.bin を置いて、 onie-installer に remane して、Dell S6000-ON に挿してbootしました。するとPartition #4の作成に失敗してました。

ONIE:/ # down.
ONIE: eth0: link down.  Skipping configuration.
ONIE: Failed to configure eth0 interface
ONIE: Starting ONIE Service Discovery
ONIE: Executing installer: file://dev/sdb1/onie-installer
Verifying image checksum ... OK.
Preparing image archive ... OK.
ONIE Installer: platform: x86_64-generic-r0
Partition #1 is in use.
Partition #2 is in use.
Partition #3 is in use.
Partition #4 is available
Creating new ACS-OS partition /dev/sda4 ...
Could not create partition 4 from 882688 to 67991551
Unable to set partition 4's name to 'ACS-OS-e39d3b8'!
Error encountered; not saving changes.

再起動後、DEL or F2押してと言われたところで止まります。

Version 2.15.1236. Copyright (C) 2012 American Megatrends, Inc.                 BIOS Date: 06/16/2015 21:34:20 Ver: 0ACAH015                                    Press <del> or  to enter setup. </del>

(全文はgist)

ONIEも上がってこないし、DELキー or F2キーにも反応なし。文鎮ができたように思われました。
以下は当時の状況になります。twitterでホワイトボックススイッチの相談に載ってもらえました!鈴木様ありがとうございました!!!

その後いろいろ相談に載ってもらった結果、Dellサポートに電話しました。

サポートの方「Tera Term使ってるとのことなので、”設定”→”キーボード”で”DELを送信するキー”のDeleteキーのチェックを外してください」
わたなべ  「BIOSの青い画面出たー」
サポートの方「ONIEのリカバリーしましょう」

コンソールとかキーボードとかについて勉強が足りないようです(*/∇\*)。別途調べます。。。

話を戻して、文鎮だと思ったものが実はブンチンカッコカリだったことがわかったので、ONIEを入れて初期状態に戻れるー!と思ったらまだ山がありました。ONIEはバイナリが配布されていないのでビルドが必要でした。(ビルド手順は別の機会に)

ビルドすると、リカバリ用のイメージ(isoもしくはpxe boot用のファイル)ができます。
今回はisoをUSBメモリに焼いてbootすることにしました。

sudo dd if=onie-recovery-x86_64-dell_s6000_s1220-r0.iso of=/dev/sdb bs=10M

USBメモリを挿してbootして、一端BIOSに入ります。
“Advanced” → “USB configuration” → “Mass Storage Devices” のところを”Hard Disk”に。
“Boot” から Boot Order を変更。
Save & ExitするとGRUBが起動します。”ONIE: Embed ONIE”を選ぶとあっさりインストールが終わって(USBメモリ抜く間もなく)Rebootします。途中でBIOSに入ってUSBメモリ抜きましょう。

ONIE:/ #

わーい。

(この後もう1回SONiCのbuildをしたらやっぱりブンチンカッコカリした)
次回につづく!!

p.s. V系バンドの王子様をはじめ講談社ラノベ文庫の新刊が気になってます。

linux, 負荷分散装置, 運用管理

社内では少ないZabbix派のshinonomeです。お久しぶりでございます。

Zabbix派なんですが、実は今までローレベルディスカバリ(以下LLD)を自分で書いたことがなかったので、書いてみることにしました。

LLDとは
Zabbix 2.0から追加された機能で、マシンの構成により変更されることが多いものに対してアイテムやグラフ、トリガーを自動的に構成してくれる機能です。
デフォルトでFilesystemやNIC、SNMPに対して有効化できます。v2.4からはCPUにも対応しました。

そして、今回書いた対象が

LVS – Linux Virtual Server

です。

ツチノコでは一部サーバにLVSを利用してロードバランシングを行っているところがあります。
そのサーバの状況を監視するべく、LLDでやってみようという魂胆です。
LLDにしたのは、LVS配下にあるサーバが頻繁に変更されるためです。

カスタムLLDは、zabbix_agentdに対してUserParameterを設定することで作成します。
たいていはわかりやすいように XXXXXXXX.discovery というキー名を利用するようです。

Zabbixの値取得の基本は、Zabbix ServerがZabbix Agentに対しキー名を叩いた時に、Zabbix AgentはUserParameterのスクリプトを実行、
スクリプトが返した値を、そのキーの値としてZabbix Serverへ返す様になっています。
カスタムLLDを作成するときは、その返り値をテンプレートに渡すJSONとすることで実現できます。
https://www.zabbix.com/documentation/2.2/jp/manual/discovery/low_level_discovery#カスタムlldルールの作成

今回はipvsadm.discoveryをキーとし、VIP、TCP/UDP、Real IPのマクロ化を行いました。
そして、https://www.zabbix.com/forum/showthread.php?t=12086 こちらのPythonスクリプトを叩ける形のテンプレートを用意しました。

LVSをバックエンドとして使っているLdirectordやKeepalivedでも使えますので、ぜひご利用ください。
また、プルリク等もお待ちしております!

コードはこちら:https://github.com/shinonome/zabbix_ipvsadm

hardware, linux, 小ネタ, 運用管理

艦これ」といえばDMMのゲームと言われるほどにまでなりましたが、「城コレ」が今度は控えているようです。約30万人の方が事前登録してくださったという嬉しい悲鳴がところどころで聞かれます。そしてツチノコ部隊も全体の安定稼働へ向けて色々と対応しています。ところで、こういうオンラインゲームは、可愛いキャラクターもさることながら、ブラウザの裏でインターネット越しに必死に動いている「黒子」のようなものたちがいます。いわゆる「ゲームサーバ」と呼ばれるものです。

ゲームサーバは、その基本構成としておおまかに「アプリ(フロント)サーバ」と「データベース(バックエンド)サーバ」に分かれます。今日はその中でも「データベースサーバ」についてのお話です。

DMMでは大抵のデータベースサーバにLinuxとMySQLを使っています。そのデータベースエンジンにInnoDBというのがありまして、設定項目としてメモリ上にバッファをするという設定を行うことができます。

例えば、メモリを128GB搭載したサーバでバッファ用に100GBのメモリを割り当てるとします。さて、実際のメモリの割当はどのようになるでしょうか。最近のXeonを搭載したサーバとして考えてみます。実はCPUの個数により、そのメモリの割り当てられ方が変わってきます。というのも、昔と違い今はメモリのコントローラがCPUに内蔵されているからなのです。

  • シングルCPU構成の場合

すべてのメモリがCPUと直接つながっているので、特に気にする事はありません。

  • マルチCPU構成の場合

CPU0とCPU1…とにそれぞれメモリがつながっています。例えば先ほど128GBとしたメモリが2CPU環境にあるとしましょう。そうするとCPUにごとに64GBのメモリがつながっている事になります。標準ではLinuxはプロセス毎にそのプロセスが動いているCPUにつながったメモリを利用しようとします。つまり、先ほどの100GB割り当てが、MySQLのプロセスが動いている片方のCPUに偏ってしまうのです。その結果、片方のメモリがMySQLに食いつぶされ、そこにもともといたデータがSWAPに吐き出されます。もう片方のCPUにつながっているメモリに空きがあっても、です。

少し詳しい話にしましょう。最近の共有型のマルチプロセッサシステムアーキテクチャは、NUMA(Non-Uniformed Memory Access)というものです。これは、CPUとメモリのまとまりを「ノード」と呼びます。先の例では、CPUと64GB分のメモリのまとまりが”ノード”です。

Linux OS上でプロセスが起動すると、そのプロセスはCPUに割り当てられます。CPUとメモリがまとまっているので、プロセス自体のデータは同じNUMAノードのメモリに置かれます。
先の例の2CPUの環境MySQLが起動したあとメインスレッドがCPU0に割り当てられたとして、そのCPUにぶら下がる64GBのメモリにMySQLのデータが置かれます。しかし、バッファデータのサイズだけで100GBあるので、NUMAノードの64GBをいずれ食いつぶします。そうなると、同じNUMAノード上にある他プロセスのデータがメモリから溢れます。他NUMAノードのメモリはデフォルトではOSが割り当てをしない状態になっているため、あふれたものはスワップへ送られます。もともと64GBのメモリ上にあるものなのでスワップアウトするデータ量も大きくなる傾向があります。なので実際のところスワップが埋まってしまう可能性が非常に高いです。

では、どうすればこの偏りやスワップアウトを抑えることができるのか。

NUMAをOSからコントロールするnumactlというコマンドがあります。
–interleaveオプションは割り当てるNUMAノードを指定します。上記の例では”all”となっているため、すべてのNUMAノードに割り当てを行うことを意味します。

こちらのコマンドで、NUMAに対するプロセスの状況が見られます。
とはいえ、見るのは大変なので、下記のページを参考に、Perlスクリプトを使ってみましょう。
http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/
numa-maps-summary.pl というスクリプトです。って、実はこれ2010年の記事なんですよね。知りませんでした。

実際にスワップアウトしてスワップを喰い潰してしまったサーバがこちら

同じサーバで、numactlを設定したのがこちら

設定前はNUMAノード分の64GBに近く偏っていたものが、設定後は分散されているのがわかります。
上記のようにプロセスがどかっと大きなメモリを割り当てることでスワップアウトしてしまう現象を”Swap Insanity”といいます。
そして先のブログ記事にもありますが、mysqldのinitスクリプトを改造して、numactlを埋め込んでしまうという手を使うことで、回避ができます。

PAGE TOP