カテゴリー別アーカイブ: FreeBSD

NFSでマウントしているホスト一覧を取得

こんにちは。

秋口もずいぶんと涼しくなってきて肌寒いぐらいになってきました。

さて現在、うちではファイルサーバの移行を行っています。
今までFreeNASを使ってきたのですがそろそろNFSv4とかも欲しいのでUbuntuへ移行することになりました。

NFSサーバの構築も終わり一通りファイルもコピーし終わりましたが、次の重要な作業が待っています。

各ホストではfstabを使って旧サーバをマウントしていますが、これを新サーバに書き換える必要があります。

ホストにログインしてfstabを書き換える…、この作業も重要ですが、何より既にマウントして使っているホスト一覧を調べ上げるということが重要です。
どのホストが利用しているかを把握できないと移行がうまくいっているかという確認すらできず、気がついたらサービスが停止していました,ということになりかねませんからね。

NFSでマウントさせているおおよその台数は20台ぐらいです。
なのでつい漏らしてしまうことがあるんですね。

こういうときにはNFSサーバ側でshowmount -aを使うとその一覧を取得することができます。

shell> showmount -a
All mount points on localhost:
192.168.1.36:/path/to/home
192.168.1.37:/path/to/home
192.168.1.45:/path/to/home

簡単ですね!

zfsのプールを他のサーバに効率よく移設する

zfsのプールを他のサーバに効率よく移設してみた。

現在zfsで構築されているファイルサーバから、新規に作成されたzfsのファイルサーバへzpoolを転送してみた。

 

流れとしては元サーバでsnapshotを取り、その後にsshで転送して受け側で展開するというもの。

zfs snapshot tank/[email protected]`date +%Y%m%d`;

zfs send tank/[email protected]`date +%Y%m%d` | ssh -c arcfour256 [email protected]_to_transfer zfs recv tank/[email protected]`date +%Y%m%d`


気をつけるのはdateを使って転送しているのでスナップショット作成から転送開始までに日をまたぐと失敗する。(スナップショットの作成はだいたい早いので大丈夫なハズ…)

またsshは-cで軽い暗号化方式を選ぶことで転送速度が上がるらしい。

ちなみに今回のテストでは標準のもの(aes128-cbc)だと8.1MB/sでしたが、arcfour256では でした。

 

一瞬でのバックアップを実現するSolaris ZFS (3/4)

http://www.atmarkit.co.jp/ait/articles/0804/08/news138_3.html

大容量ファイルのSCP転送を高速にする方法

http://d.hatena.ne.jp/rx7/20101025/p1

 

UNIX/Linux環境でFTPを再帰的に拾ってくる方法

こんにちは、岡田洋一です。

UNIX/Linux環境でFTPのディレクトリをまるごと取りたかったんです。が、ftpコマンドだとディレクトリを取ろうとしてもダメなんですね。

get somedirectoryってやるとNot a regular fileって怒られます。

shell> ftp ftp.example.com
Connected to ftp.example.com.
220 ::ffff:192.0.2.1 FTP server ready
Name (ftp.example.com:user): user
331 Password required for user
Password:
230 User user logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> get tmp
local: tmp remote: tmp
550 tmp: Not a regular file

ディレクトリを再帰的に取りたい、っていう場合にはwgetを使うと良いようです。

shell> wget -r ftp://user:[email protected]//path_to_get/

多くの環境でインストールされているwgetで、ワンライナーで取得できるのはいいですね。

参考:  How do you recursively ftp a folder in linux

NIS, LDAPを用いた複数の環境でログインシェルを変更する

NIS, LDAPを用いた複数の環境でログインシェルを変更したかった。

現在自分の環境ではLDAPを利用している。ログイン情報をLDAPサーバに集約できるので非常に便利。LDAPではログイン時にユーザ名、パスワード(ハッシュ)などの情報を各ホストに提供するのだけれど、その中にはログインシェルも含まれる。

ログインシェルといえばUNIX系でよく使われるcsh, tcsh、Linux系でよく使われるbash、また高機能シェルとして名高いksh, zshなどがある。自分はzshをメインのシェルとしているのだけれど、LDAPのログインシェルの情報をzshに変更するだけでは問題がある。

まず一つ目はフルパス表記での問題だ。
ログインシェルは通常フルパスで表記される。これはシェルの初回立ち上げ時に~/.cshrc, ~/zshrcといった環境ファイルを読み込ませ、その段階でパスがセットされるからだ。つまりログインシェルの情報を取得して起動させる段階ではパスが通っていないことが想定される。そしてこのフルパス表記がOS毎に違ってくる可能性がある、ということが問題の核だ。
このシェルの実体、バイナリの実体が配置される場所は大まかに以下のようになる。Linux系ではrpm, yum, aptなどのパッケージ管理ツールでインストールした場合の/usr/bin/、デフォルトで配置される/bin/、ソースからインストールされた/usr/local/binである。
対してFreeBSDの場合、tcshやcsh, shなどの元々インストールされているバイナリは/bin/sh, /bin/tcshなどに配置されるが、後から手動でインストールされたバイナリは/usr/local/binに配置される。zshやbash(FreeBSDではbashがデフォルトで入ってこない)は/usr/local/binに置かれている訳だ。
この問題に関して言えば、インストール時にバイナリの配置場所を/usr/bin, /bin, /usr/local/binのいずれかに統一してしまう、若しくはシンボリックリンクを統一された場所に配置する、という解決方法が考えられる。でもこれらの作業をそれぞれのホストでいちいち実行するのは億劫だ。

二つ目の問題はデフォルトでインストールされるシェルが少ないことだ。自分の環境では主にFreeBSD、またDebian系(Ubuntu)、RHEL系(CentOS)、さらにはMac OS Xと数種類のOSを利用している。その中でデフォルトでインストールされるシェル、となると実は結構少ない。FreeBSDではcsh若しくはtcshをデフォルトシェルにする事が多い。対してLinuxではbashがデフォルトシェルとなることがおおい。そして残念な事にはFreeBSD/Linuxに於いては(t)csh/bashがお互いにデフォルトでインストールされていない。
ということはbashならbashをLDAPのデフォルトシェルにしてしまって、bashの環境ファイルである.bashrcなどでzshを呼び出す、という事ができない。

以上の点を踏まえながら試行錯誤していった結果、「UNIX/Linuxの両方に入っているシェルを使ってログイン時にzshにしてしまう」という方法にたどり着いた。ちなみにそのUNIX/Linuxの各種OSの最大公約数と言うべきシェルはsh。
shとはThompson shellを意味し、bashの前身となったシェルだ。過去にはバックスペースすら無かった気もするけれど、カーソルキーで入力位置を変更できない、コマンド履歴が使えないというシェルの基本的な機能のみしか持っていない素朴なシェルだ。
(とは言え、過去のbashも同様でデフォルトではコマンド履歴なども使えなかった気がしてbashとshのデフォルト状態での違いがあまり無いような状態だったんだけれど、最近のbashは使いやすいシェルっぽくなってる)
さてLDAPではこのshをデフォルトシェルにし、shが立ち上がった後にzshを呼び出すようにしてみる。

shでログインされた際に呼ばれる環境ファイルは “.profile”ファイルである。”.login”かと思ったんだけれどこれはshだと実行されないしcsh系だった気がする。つまりsh系ではダメということ。
この.profileファイルには直接shに実行して欲しいことを記述する。以下に例を示す。

[ -x /usr/local/bin/zsh ] && exec /usr/local/bin/zsh
[ -x /bin/zsh ] && exec /bin/zsh

shらしい記述で条件式を書き、それぞれのバイナリが存在し実行可能であればexecしてやる。execでシェルを呼び出せばログインシェルが切り替わった動作になるのでCtrl+Dなどでシェルを抜けたときにzshを支えているshも一緒にexitしてくれる。つまりログインシェルがzshになったようにみえてshを意識することが無い。

以上で思っていたようなzshなどのパスが違う環境でログインシェルを統一する、ということが可能になった。

めでたしめでたし。

TeamSpeak3のserveradminのパスワードを忘れてしまった場合の対処法

TeamSpeak3のserveradminのパスワードを忘れてしまった場合の対処法について。

音声チャットソフトTeamSpeak3の管理用アカウントとしてserveradminがあるのだけれど、そのログインパスワードを忘れてしまったときの復旧方法について。管理用ログインを使うといろいろなことができるのだけれど、この管理用パスワードは恐らく初回インストール時、初回サーバログイン時に表示されてよくわすれちゃう。どこかのログに残っていそうなきがするのだけれど探しても見つからないし途方に暮れてしまっちゃう。で、そんなアナタに、そんなワタシにserveradminのパスワード復旧法。

まずは元になった記事の紹介。

A simple ts3 serveradmin password recovery script (win + linux)
というわけでパスワード復旧のスクリプトを配布してくれている人がいました。このスクリプトを使って復旧できます。

上記フォーラムの第一投稿にスクリプト(tar.gz)のリンクがあるのでダウンロードして解凍して実行。これでうまくいきます。中にはwindows用とlinux用のスクリプト、batファイルbashスクリプト、それからsqliteのバイナリが入っている。それぞれの環境で実行してやればうまくいくはず。

このスクリプトを実行すると管理者のパスワードをykN+zfqDに変えてくれる。これでこのパスワードを使ってログインする事ができる。管理者でのログイン方法については他の記事を参照してください

で、もちろん気をつけなければいけないことは、管理者用パスワードをログイン後に変えておくこと、が必要。これは絶対に必要。アナタのTeamSpeak3 serverを守るために必ず行っておいてください。

管理者用のパスワードの変え方については以下の通り。telnetでログインして上記のパスワードでログイン後、”clientsetserverquerylogin client_login_name=serveradmin”を実行する。これで新しいランダムなパスワードが発行される。このパスワードをメモしておきましょう。

login serveradmin ykN+zfqD
 error id=0 msg=ok</b>
 clientsetserverquerylogin client_login_name=serveradmin
 client_login_password=password
 error id=0 msg=ok

どんなスクリプトなの?

というわけで、管理者のパスワードを書き換えるという結構危ういスクリプトなので中身が気になりました。簡単なスクリプトなので中身を覗いてみることに。
中身はsqliteでのいくつかのSQLの発行している。clientsテーブルのclient_id=1な行をserveradminとしてそこのclient_login_passwordをupdateしている。

UPDATE clients
SET client_login_password = "r5oBZ3Z8s8IqjiEJ/k3o9dkSUgU="
WHERE client_id = "1";

更新している内容は恐らくmd5のハッシュだと思われる。ハッシュの元になっているのが先述の”ykN+zfqD”で、このハッシュにアップデートすることでパスワードを変更している。

なるほど、という感じでこれぐらいなら安心できることが確認できました。

FreeBSDとかだとsqliteのデータベースファイルの位置がわかりにくいのだけれど、そこへいって手動でsqliteを実行することでパスワードを更新できた。sudoで変更してあげれるようにしてやらないとダメだけど。

 

というわけで管理者で無事にログインできるようになります。

TeamSpeak3で管理者ログインする方法

TeamSpeak3で管理者ログインする方法について。

無料のボイスチャットソフト、TeamSpeak3。そのサーバを運営していると管理者でログインする必要がでてくる。管理者でのログインはわかりにくいのだけれどその方法についてのメモ。

過去のバージョンだとTeamSpeak3のクライアントから様々なクエリを使うとができていたと思うんだけれど、なぜだか現行バージョン(3.0.9.2)だと無理だったので他の方法で試してみた。
ちなみに過去のバージョンのやり方はTeamSpeak3 Wikiに載っているので参照されたし。

ログインしてクエリを実行するにはtelnetを行う必要がある。telnetは主にTCPを用いたいろいろなコマンドのやりとりをするもので、UNIX/Linuxに入っている。昔のWindowsには付いていたんだけれど最近のWindows 7とかだと見かけない。そういう場合にはTeraPadputtyを利用しよう。

telnetでのログイン

telnetでログインするにはIPアドレス又はホスト名、そしてポート番号が必要だ。IPアドレス、ホスト名についてはクライアントでログインするときに使用しているアドレス、ホスト名を入力しよう。ポート番号についてはデフォルトでは10011。TeamSpeak3では下記のようなポート番号を使っている。10011を3倍したものはファイル転送用だ。

サービス ポート番号
通常の音声チャット 9987 tcp
管理サーバクエリ接続 10011 tcp
ファイル転送用 30033 tcp

サーバ/クエリ


実際にtelnetで接続してみる。まずは “telnet ホスト名 10011″と入力する。接続が完了したら”login serveradmin password”としてログインしよう。

shell> telnet ts.l2tp.org 10011
Trying 192.168.11.1...
Connected to ts.l2tp.org.
Escape character is '^]'.
TS3
Welcome to the TeamSpeak 3 ServerQuery interface, type "help" for a list of commands and "help <command>" for information on a specific command.
login serveradmin passwork
error id=0 msg=ok

うまく接続できない場合にはIPアドレスが正しいかチェックしてみる。該当のホストでnetstat -natsockstat | grep teamspeakなどしてみよう。
ログインするときのserveradminのパスワードが分からない場合にはパスワードをリセットしましょう。

これでサーバへログインできたと思う。この先にはいろいろなことができるのでやってみましょう。

MySQL接続で起こった怪奇現象

今日も引き続いてzabbixの設定をしてました。そのなかでmysqlコマンドを利用してzabbixに接続をさせてあげたかったんです。で、その時のテスト時に不可解な現象が、理解不能な現象が起きました。

MySQL上でzabbixという名前のユーザを作り、ローカルホストのログインのみパスワード無しで接続可能にしたんですね。つまりTCP/IPとかの接続はダメでローカルのsock通信のみOK、ローカルからのmysqlコマンドでつなげばOKと。

ユーザを追加したので鼻歌でも歌いながら接続試験をしてみました。

mysqlhost> sudo -u zabbix mysql
ERROR 1045 (28000): Access denied for user 'hogetan'@'localhost' (using password: NO)

が、繋がらない。見てみるとaccess deniedしてる対象ユーザがsudo元のhogetanになってる!

これじゃ繋がらないよね。でもおかしい。通常sudoすればバイナリを実行するユーザは切り替わるはずなのに切り替わってないご様子。環境変数にその辺りが入ってるのかと思いチェックしてみるも…。

mysqlhost> sudo -u zabbix env| grep hogetan
SUDO_USER=hogetan

うーんむ、怪しい感じではないなぁ。USERとかはちゃんとzabbixになってたし。しょうがないのでnologinを解除してsuしてログインしてやってみることに。

mysqlhost> sudo su - zabbix; env | grep zabbix;
mysqlhost> mysql
ERROR 1045 (28000): Access denied for user 'hogetan'@'localhost' (using password: NO)
mysqlhost> env | grep hogetan

うーむ……。最後のenvはhogetanにヒットするものが無かった。一体ドコの情報を参照しながら元のsudoユーザ名でmysqlコマンドをつなごうとしてるのだろうか。

結局、結局結局、mysqlコマンドに-uでつながせることで落着はしそうなのですが、何とも腑に落ちない結末でした。

ちなみにですがsudoをするユーザをfugatanとかにすると確かに今度はfugatanでrejectされてるんですね。なのでmysqlコマンドがかならずhogetanユーザになる、というわけでもなさそうです。またmysqlホスト、sudoを行う場所をlinuxで試してみたらこれはちゃんと所望の結果が得られました。

FreeBSD特有の挙動なのかなぁと思いながら今夜も寝れなさそうです。

解決やお心当たりのある方は是非教えて下さい。

sedを使ってファイルの中身を置換する

sedを使ってファイルの中身を置換したかった。
ヒトクセあるsedだけどコマンドラインでさっくり置換してくれるのは魅力。
置換となるとファイルの中身を書き換えて欲しかったりするんだけどファイル自身を書き換えるときのオプションを調べたのでメモ。二回目なのでメモ。忘れていたのでメモ。

FreeBSDはオプションがLinuxなどの GNU sed と違うらしい。ファイル自身を書き換えるオプションがGNU sedなら-iでいける。でもFreeBSDであれば-iは引数を伴いそのファイル名で出力する、というものなのだ。で、ファイル自身に書き出したいときにはシングルクォートで引数に空文字を渡してやればそれ自身を書き換えることができる。めもめも。

shell> sed -i '' 's/hoge/fuga/g' inputfile

Proftpdでpam越しにldapの認証を使った

Proftpdでpam越しにldapの認証を使いたかった。

実はコレまでのproftpdの認証は、最も標準的である /etc/passwd あたりのファイルを見て認証をかけてた。だからproftpdはnisやldapと連携してなかった。

現にこれまではnisをunixのsystemの認証としていたのだけれど、それをproftpdでは使わず、nisのアカウントとunixのアカウントを手動で同期を取るというなんとも前時代的な運用をしていた。

現在管轄しているセグメントもほとんどのホストでldapに移行が完了しており、nisベースはほとんどなくなってきていたのでそろそろこのproftpdの認証回りもldapを使うようにしてあげないと、と思っていた。

一応profptdにはmod_ldapという自前でldap認証を行うモジュールがあるのだけれど、そこでいちいちフィルタやらdcやらを書いてやるのも面倒だなぁと思っていたし、ユーザごとにそこまで細やかに制限を入れる予定もなかった。制限といえばせいぜいrootでのログインを拒否するだとかそういったところだったので、その辺はproftpdの標準confでできるわけだった。

で、既にproftpdを動かすホストではpamでldapを使って認証してたので、このunixアカウント認証をそのままftpの認証系にしてしまうことにした。confはテキトウにググったら出てきた。

# pam
AuthOrder           mod_auth_pam.c* mod_auth_unix.c
AuthPAMConfig      system

上記の部分をconfに加えて再起動したらいけました。

最初はちょっと動かなかったりしたのでその点についてのメモ。
/etc/pam.dの中身にも依るのだけれど、pamには設定名っていうのがある。pam.dにあるファイルベースで設定名が決められている。proftpdでは標準でftpという設定名を使うのでpamのftpにldap使いますよと書いてないと有効にならない。ここで少しハマってしまった。

この辺のことは実は公式にちゃんと載ってて、ググってコピペで動かな~い、と困ってしまったことを反省。

 

以上

第5回【とあるサーバの下学上達〜サイエンスプログレス〜】

こんばんは
平成24年12月19日に第5回「とあるサーバの科学上〜サイエンスプログレス〜」を放送いたしました。ブログに書くのが遅くなり申し訳ないです。
今回は、第1〜4回の復習となりました。忘れていることが多かったのと、やっぱりlsコマンドとcatコマンドが混ざってしまいます。うーん。そんな第5回目の放送でした。

【復習内容】
・FreeBSDとは、インターネットサーバのこと。

・lsコマンド
ディレクトリの内容をリスト化して表示する
・ls mydir mydirディレクトリの内容を表示
・ls -a ドットファイルも表示
・ls -l ファイルの詳細(日付とか)も表示
・ls -al 上記の組み合わせ
・ls -Gal ディレクトリは青色で表示され、以後-alと同じ

・catコマンド
ファイルの中身を見たり作成できたりする
ファイルの中身を連続してみることも可能
・cat -n
ファイルに入っている文字列に番号を降ることができる
番号はファイルごとに1からリセットされる
・cat -e
ファイルに入っている文字列の最後尾に$マークをつける。最後尾にスペースがあるかないかを確認することきに使う。

・file この後ろにつくものが、何なのかを表示。ディレクトリ、とかテキストとか

・ワイルドカード
・ls * 全てのファイル
・ls aa* aaから始まる全てのファイル
・ls *a2* a2を含むファイル
・ls *.txt .txtで終わるファイル

・cpコマンド ファイルをコピーするときに使う
・cp file1 file2 でfile1をfile2にコピーする
・cp file1 mydir2/filex でmydir2にfilexという名前でfile1の内容をコピーする

まだまだ勉強不足です。がんばります!
次回の放送は、平成24年12月26日21時03分となります!
U-streamで「とあるサーバ」と検索☆
よろしくお願いいたします。