タグ「Ubuntu」が付けられているもの

DRBD9で分散ストレージを作る

Ubuntu 18.04LTSでDRBD9の分散ストレージを作るメモです。

DRBD(Distributed Replicated Block Device)とは、Linux上でネットワークを介したストレージをリアルタイムにミラーリングするためのソフトウェアです。
何が出来るかと言えば、2台〜4台のコンピュータ間のストレージで完全に同期を取ることが出来ます。
Active/Standbyで動作しているActive側でストレージに書き込みが行われると、ネットワークを介してSlave側のストレージにも書き込みが行われることで、データが同期されるという仕組みです。
また、同期はブロック単位でおこなわれるので、スライス(パーティション)がそっくり同期されます。その為、ファイルシステムに依存しない事も特徴です。(ファイル単位での同期ならrsync使うとか、他にも方法は色々あるけれど)

通常クラスタ構成のシステムでは共有ストレージなど「高価なハードウェア」を使うか、レプリケーションソフトで定期的に同期を行う方式が一般的だと思います。レプリケーションソフトの同期では同期のタイミングによって時間差が生まれてしまうため、同期が取れていないタイミングが発生しますが、DRBDではブロック単位の書き込みをそのままネットワークを介して行いますのでほぼリアルタイムの同期が行えます。
(市販のクラスタソフトウェアでも似たような仕組みを備えている製品があるようだ・・・)

Linuxではクラスタ自体はPacemaker(旧 Heartbeat)で行えますので、複数のコントローラ、複数のパスを備えた高価なストレージを使わずにクラスタのシステムが作れる事になります。とはいえネットワークを介して同期するってことは、ネットワークに相当負荷が掛かるということですので、高パフォーマンスを要求されると厳しい気がします。
仕組み自体は昔からあった(カーネル2.6の頃・・・2009年位?・・・に生まれたらしい)のですが、これまで触ってこなかったので、今更ながらちょっと触ってみましょうという感じです。

Ubuntuインストール時にやること(2)

前に書き漏れていた項目

ロケール設定
日本語表示にする

$ sudo localectl list-locales

$ sudo apt-get install language-pack-ja

$ sudo update-locale LANG=ja_JP.UTF-8

タイムゾーン設定
JSTにする

$ sudo timedatectl list-timezones

$ sudo timedatectl set-timezone Asia/Tokyo

systemd-timesyncdサービスの停止
ntpdが動かなくなるので止める。

$ sudo systemctl stop systemd-timesyncd.service

$ sudo systemctl disable systemd-timesyncd.service

IPv6をDisableする
/etc/sysctl.confに以下の設定を追加する

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

NICのデバイス名を伝統的な名前に戻す(ens160 → eth0)

ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
ほぼこれだけではダメなので
/etc/default/grubに以下の設定を行う

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

GRUBを書き換える

sudo grub-mkconfig -o /boot/grub/grub.cfg

やっと動いた

やっと動きました。。。
MovableTypeが動かなくて、かなり手こずりました。

事の発端はUbuntu Serverを12.04LTSから14.04LTSにアップグレードしたことですが。

Apacheが2.4に上がってたり、
Perlが5.18に上がってたり、
PHPが5.5に上がってたりして、
MovableType5が動かなくなってしまいました。

はい。

仕方無いのでMovableTypeを6に上げて、

Apache直して、MovableTypeのphp/extlib/smarty/libs/Smarty_Compiler.class.phpも

/* replace special blocks by "{php}" */ /* 修正後 */ $source_content = preg_replace_callback($search, create_function ('$matches', "return '" . $this->_quote_replace($this->left_delimiter) . 'php' . "' . str_repeat(\"\n\", substr_count('\$matches[1]', \"\n\")) .'" . $this->_quote_replace($this->right_delimiter) . "';") , $source_content);

/* 修正前
$source_content = preg_replace($search.'e', "'"
. $this->_quote_replace($this->left_delimiter) . 'php'
. "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
. $this->_quote_replace($this->right_delimiter)
. "'"
, $source_content);
*/

という感じで直して、、、やっと動いたところです。

MovableTypeはバージョンアップする度に全てのテンプレートを一度リセットしないと、どこかに綻びが出てしまうのが悩ましいところですね。いっそのこと全部データベースに持ってくれて、アップデートしても影響無いようになっていると嬉しいのですが。

# まだまだ、あっちこっち死んでる気がするけど。

UbuntuでProxyサーバロードバランス(3)

これまで(UbuntuでProxyサーバロードバランス(1)UbuntuでProxyサーバロードバランス(2))構築したとおり、Ubuntu Server 12.04LTSを使ってロードバランサーを構築し、Proxyサーバの負荷分散、障害検知と自動での切り離し、組み込みを動作させるところまで構築しました。

残った問題である、ロードバランサーがダウンしたときに結局システムが止まってしまうという問題に対処するため、ロードバランサーをクラスタ構成してみようと思います。

クラスタ構成と言っても色々ありますが、今回はkeepalivedのVRRPをそのまま使ってロードバランサーをActive / Standby型のクラスタにしてしまいます。


LB-2.jpg

単純にロードバランサー2を追加します。そしてProxyサーバの仮想IPアドレス(192.168.100.10)をVRRPによるフローティングアドレスにしてしまいます。

UbuntuでProxyサーバロードバランス(2)

前回(UbuntuでProxyサーバロードバランス(1))Proxyサーバに対するアクセスが負荷分散される状態まで構築をしましたが、Proxyサーバがダウンしたときにそれを検知して切り離す機能が無いため、ダウンしたProxyサーバにアクセスしようとし続けてしまいます。

そこで、Keepalivedを組み込んで、L4レベルでの死活監視を行わせます。

具体的にはProxyサーバのTCPポート / 8080がOpenしている状態を定期的に確認して、ポートがClose状態、または無反応になったら、そのサーバへの振り分けは行わないようにします。


UbuntuでProxyサーバロードバランス(1)

PROXYサーバをLinuxのLVS(ipvsadm)を使って冗長構成にする事を考えました。
LVSは既に使っている(RedHat Enterprise LinuxでWebサーバロードバランス)のですが、ここではWebサーバのバランシングではなく、Proxyサーバのバランシングを行います。
また、前回の検証時はRedHat Enterprise Linux ES3を使って検証を行っていましたが、今回はUbuntu Server 12.04LTSを使います。ipvsadmがディストリビューションに含まれているため、それにあわせてファイルの配置が変更になります。検証機も実機ではなくESXi上に立てることにします。
今回も目的はProxyサーバの耐障害性の向上で、負荷分散を目的とはしていませんが、構築の順序としては負荷分散機能(ipvsadm)→耐障害機能(keepalived)となります。


LB.jpg

※Proxyサーバの仮想IPアドレスは192.168.100.10にする

論理的にはロードバランサーがクライアントからの要求をすべて受けて、2台のProxyサーバに振り分ける構成になるため、図のようにロードバランサーの配下にProxyサーバ2台がぶら下がる構成になります。
物理的には同一セグメントでフラットに接続されている構成になります。
ロードバランサーの構成をNATにしてしまうと、ProxyサーバのアクセスログにクライアントのIPアドレスではなく、ロードバランサーのIPアドレスが記録されてしまう弊害がおきるため、構成はDSRにします。この構成の大きなメリットが2つあり、1つ目がソースIPアドレス(クライアントのIPアドレス)がそのままサーバに伝わることと、戻りパケットの処理にロードバランサーが介在しないことで、ロードバランサー自身の負荷が少なくなる事です。 デメリットはリアルサーバ側に若干細工が必要になることですが、今回はPROXYサーバも自前のため、デメリットになりません。

Proxyサーバの待ち受けポートは8080を使用しています。


Ubuntu 12.04 LTS

ubuntu.jpg

Ubuntu 12.04 LTSの日本語Remixが5月3日(木)にリリースされてました。ダウンロードページにリンク張っときます

5月のGW前後でリリースされたので、タイミング的には例年通りです。

内容は色々と変わっているのですが、今回気になっているのがサポート期間です。
10.04 LTSの時まではデスクトップ版が3年、サーバ版が5年だったのですが、12.04 LTSではどちらも5年間のサポートになっています。※リリース時期とサポート期間を参照(2017年の4月までと書かれている)

オリジナルがリリースされたときはあえてパスして、日本語Remix待ちをしていたのですが、そちらがリリースされたのでX100eにはアップデートマネージャからアップデートしました。(元々日本語Remixからインストールして、都度アップデートしてきたものです)

正直UbuntuもUnity化されてから非常に重たくなってきたので、Unity→Ubuntu Classic(素のGNOME環境に近いもの)に切り替えて使って居ます。それでもX100eでは何をやっても遅いのは仕方無いのでしょうけど。それでもプリインストールされているWindows7Home環境ではブラウザすらまともに使えないので、まだマシという言い方も出来るのですが。


Linuxでマルチホーム

とあるところでマルチホームの構成を組まなきゃならない事になったので、手元のUbuntu(とCentOS)で色々テストしてみました。

結果から言うとiproute2を使えば、マルチホームが組めます。

例えば簡単に考えるとNICを2枚差しして別々のIPアドレスを振って、ISP毎に別のルータを介して接続します。

iproute2-test.jpg

こうすると、Linuxのルーティングテーブルが1つしかない為、Linuxのデフォルトルートが10.1.1.1(ルータ1)に向いていた場合、入ってきたインターフェース(NIC2 = 10.2.2.2)と出て行くインターフェース(NIC1 = 10.1.1.2)が違ってしまい、ISP2からのリクエストをISP1から応答する事になるため、通信が行えない事になります。

また、LinuxからISP1を経由したインターネットへのアクセスは行えますが、ISP2へのアクセスはスタティックルートで指定したIPアドレスを除き、出来ない事になります。

ネットワーク機器の場合、バーチャルルータやVRF等の機能を持っていれば複数のルーティングインスタンスを起動することが出来るため、ルーティングインスタンス毎に別のデフォルトルートを指定する事ができたり、ソースルーティングやポリシーベースルーティングの機能を使って、目的に応じてデフォルトルートを振り向けることが出来るのですが・・・。

Linuxのiproute2が入っている場合、このルーティングテーブルを複数持つことができるため、ISP1とISP2に同時に接続する事が出来るようになります。

先にiptable2のルーティングテーブルを複数持たせる設定を行います。

/etc/iprotue2/rt_table2
#
# reserved values
#
255	local
254	main
253	default
0	unspec
#
# local
#
#1	inr.ruhep
2	ISP2

このファイルの255 local、254 main、254 default, 0 unspecは最初から記載のあるエントリです。そして2個目のルーティングテーブルとして2 ISP2を追記しました。

Ubuntu(debian)の場合、NICの設定は/etc/network/interfaceで行うのですが、1枚目のNICは普通に記述します。

auto eth0
iface eth0 inet static
	address 10.1.1.2
	netmask 255.255.255.0
	network 10.1.1.0
	broadcast 10.1.1.255
	gateway 10.1.1.1

そして2枚目のNICは

auto eth1
iface eth1 inet static
	address 10.2.2.2
	netmask 255.255.255.0
	post-up ip route add 10.2.2.0/24 dev eth1 src 10.2.2.2 table ISP2
	post-up ip route add default via 10.2.2.1 table ISP2
	post-up ip rule add from 10.2.2.2 table ISP2
	post-down ip rule del from 10.2.2.2 table ISP2

という風に記述します。

CentOSの場合、NICの設定は/etc/sysconfig/network-scriptsで行うので、

/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=10.1.1.2
GATEWAY=10.1.1.1
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=10.2.2.2
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
/etc/sysconfig/network-scripts/rule-eth1
from 10.2.2.2 table ISP2
/etc/sysconfig/network-scripts/route-eth1
10.2.2.0/24 dev eth1 src 10.2.2.2 table ISP2
10.2.2.0/24 dev eth1 src 10.2.2.2
default via 10.2.2.1 table ISP2

という風に記述します。

ルーティングテーブル(それぞれ)を確認すると、

$ sudo ip route show table main
10.2.2.0/24 dev eth1  proto kernel  scope link  src 10.2.2.2
10.1.1.0/24 dev eth0  proto kernel  scope link  src 10.1.1.2
default via 10.1.1.1 dev eth0  metric 100 
$ sudo ip route show table ISP2
10.2.2.0/24 dev eth1  scope link  src 10.2.2.2
default via 10.2.2.1 dev eth1 

という具合に、mainのテーブルと ISP2(と名付けた)テーブルのそれぞれが別のゲートウェイを向いているようになります。

追加作成したテーブル(ISP2)はip ruleコマンドで確認出来ます。

$ ip rule
0:	from all lookup local
32765:	from 10.2.2.2 lookup ISP2
32766:	from all lookup main 
32767:	from all lookup default 

この状態であれば、ISP1からNIC1に入ったクエリはNIC1からISP1経由で応答し、ISP2からNIC2に入ったクエリはNIC2からISP2経由で応答する事ができるため、マルチホームに対応する事が出来るようになります。

但し、F5のBIG-IPやRadwareのLinkproof、PIOLINKのPAS等のWANマルチホーミング装置を使った場合は、インターネットからのincoming方向の負荷分散や、冗長化(片方の回線がダウンした場合に、もう片方の回線にトラフィックを片寄せする機能)を行う為に、インターネット側に応答するDNSパケットを細かく制御してくれますが、Linuxのiproute2のマルチホーミングではそこまでの対応はしてくれません。

Linuxだけで何とかしてみる方法としてiproute2での対応は、負荷分散についてはある程度工夫することで対応出来るかと思いますが、単純なラウンドロビンではなく、回線負荷も考慮した動的な負荷分散は難しいですし、片方の回線がダウンしたときの処理を考えると可用性の向上も難しいでしょう。

それにしても、、、おとなしくWAN回線のinboundトラフィックのマルチホーミング装置があれば、このような方法は取らなくても良いのですが、、、。

サーバのバックアップ

先日自宅サーバの障害復旧で面倒な目に遭ってしまったので、色々と見直し。。。


まずサーバのバックアップ

反省。定期的に取りましょう(^^; 少なくともバージョンアップ前には・・・

  • ディザスタリカバリ:無し→Acronisでイメージバックアップ(外付けHDDにバックアップ)
LVMだったのでスナップショットに頼り切っていて、バックアップを怠っていたので
  • ファイルシステム:LVM→Ext3
Acronisでイメージバックアップが取れるようにExt3を使用することに
  • スナップショット:LVMスナップショット→cronとdumpとtarで地味にバックアップ
ということで、スナップショットは便利だけど捨てて、地味に昔ながらのファイルバックアップを行う事に。

Acronis True Image Home (面倒臭くて2009しかインストールしてなかったのだけど、Home2010のライセンスは買ってあったので)なんて久しぶりに使ったのだけど、簡単にUSBブート出来るようになってたりしていて、地味に便利になっている。

あと、スナップショットは便利だけど、スクリプト組んでファイルバックアップを行う方法は昔ながらのノウハウで色々出来て楽っちゃ楽。

バックアップだけをみると、MacOSXのTime MachineはGUIで簡単にスナップショットから好きなファイルだけ抜いてこれる上、ディザスタリカバリにも対応できる点が良いかな。Windows7の標準バックアップも賢いようだけどまだ使ってみてない。地味にWindows2008のServer BackupはディザスタリカバリにDVDからの復旧が使えるようになってたり良くなってる。何にせよ問題になるのがデータベースのバックアップ。スナップショットだろうとファイルでバックアップを行う方法だろうと、データベースの不整合から逃れる術は無くて、結局データベースの停止を行ってダンプしてファイルにバックアップするか、オープン中のファイルをバックアップできるソリューションを使う必要が有るのだけど。


データベース(MySQL)のバックアップ

結局完全なバックアップは難しいのでファイルへのダンプと、データベースのクラスタを併用することに。
  • ファイルへのダンプ
mysqldumpでフルダンプ。テキストファイルに吐き出しておく。

/usr/bin/mysqldump -x -A -u データベースのユーザ --password='パスワード' --opt > /var/db-backup/DB-dump.`/bin/date +'%Y%M%d%k%M'`
gzip /var/db-backup/DB-dump.`/bin/date +'%Y%M%d%k%M'`

とか、そんな感じのシェルスクリプトを作ってcronで定時実行する。

  • MySQLのレプリケート
まずマスターサーバ側でネットワークソケットを空けたり、bin-log取ったりと、クラスタ化の準備。

/etc/mysql/my.cnfに
[server]
server-id        = 1
log-bin
を追記。

データベースに設定を反映させるために再起動する
(Slave)# sudo service mysql restart

レプリケート用にREPLICATION SLAVE権限を与えたユーザを作っておく。
mysql(Master)> GRANT REPLICATION SLAVE ON *.* TO repl@10.0.0.2 IDENTIFIED BY 'password';
データベースの更新をストップして
mysql(Master)> FLUSH TABLES WITH READ LOCK;
バイナリログを確認(スレーブで同期させるときに必要な情報)
mysql(Master)> SHOW MASTER STATUS;
+-----------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| dbsv-bin.000001 |       79 |              |                  |
+-----------------+----------+--------------+------------------+
1 row in set (0.00 sec)

スレーブ側にコピーする為にデータベースのダンプを取る
(Master)# tar zcf backupfile.tar.gz /var/lib/mysql/
(取ったファイルはスレーブ機にコピーする)
ファイルが取れたのでデータベースの更新を許可
mysql(Master)> UNLOCK TABLES;

別のホストでスレーブサーバを立てて、レプリケートを行う。

データベースを停止して
(Slave)# sudo service mysql stop

スレーブの設定を記述する
/etc/mysql/my.cnfに
[server]
server-id        = 2
を追記。

データベースに設定を反映させるために再起動する
(Slave)# sudo service mysql restart

マスターで採取したファイルを解凍&展開
(Slave)# cd /
(Slave)# tar zxf backupfile.tar.gz

データベースを動作させて
(Slave)# sudo service mysql start

マスターとの同期情報を設定して
mysql(Slave)> CHANGE MASTER TO
MASTER_HOST='10.0.0.1',  ← マスターのホスト名/IPアドレス
MASTER_USER='repl', ← マスター接続に使用するユーザー名 MASTER_PASSWORD='password', ← パスワード MASTER_LOG_FILE='dbsv-bin.000001', ← さっきマスターで確認したファイル MASTER_LOG_POS=79; ← さっきマスターで確認した位置

同期を開始させる
mysql(Slave)> START SLAVE;

こんな感じでMySQLのファイルダンプと、MySQLのレプリケーションを設定した。
レプリケーションは冗長目的なので、あくまで受け身の同期でしかない。selectとかの検索系のクエリは使えるけど、insertとかupdateとかの更新系のクエリは使えない(というかマスターに反映しない)。けど、必要が有ればスレーブ側のデータベースを停止させればデータベースのフルバックアップが取れるし、スレーブ側のデータベースを再開させれば、またマスターとの同期が行われる。
検索系のクエリを分散させれば、一応データベースの負荷分散にもなるのだけど、そもそも負荷の問題は無いし、目的が違うので気にしない。
MySQLのレプリケーションについては公式サイトにある情報(http://dev.mysql.com/doc/refman/5.1/ja/replication.html)で必要な情報は揃えられる。SQL ServerであればMSDN(http://msdn.microsoft.com/ja-jp/library/ms187048.aspx)か?

という事で、やっとデータのバックアップとかするようになりました。

UbuntuServer アップデート失敗

  • 投稿日:
  • by

家のサーバ、Ubuntu Severで運用していたんですが、11.04にバージョンアップしようとしたらスクリプトが途中でAbortして、見事に起動不能な状態になってしまいました。DesktopのUbuntuが上手くアップデート出来ていたので油断していたというか、事前のバックアップなど何も準備無しの状態でした。
こうなるとRAIDもクソも無い状態ってか、バックアップって大切ですねぇ、本当に。。。
起動しないディスク(ファイルシステムは正常なのでデータは無事)からデータの断片を抜き出して再構築したんですが、非常に手間が掛かりました。ミスの入り込む余地なんかも多々あるでしょうしね。

ちゃんとバックアップをするなら
1)稼働させながらSnapshotでオンラインバックアップ(ディザスタリカバリ用)を取る
2)データは最新版をデータでバックアップする
って方法でしょうが、何せ個人用途なので金がないのが当たり前。安いNASでも買って、DISK to DISKのバックアップが精一杯でしょうかねぇ。。。

Ubuntu 11.04

4月28日にUbuntuの11.04がリリースされました。日本語RemixCDも5月1日にリリースされていたので早速アップデートしました。

Ubuntu11.04-Screenshot.jpg

目立つ変更点としては
・GNOME Shell → Unity
・Firefox3.6 → Firefox4.0
・Rhythmbox → Banshee Media Player
・OpenOffice.org → LibreOffice
といったところでしょうか。

UIの変更で若干重くなった気がします。あと、ATOK Xが動きません。10.10の時もしばらく動かなかったのですが、今回もダメそうです。


追記
 あまりにUnityが重いので、耐えきれずにClassicに戻してしまいました。それでも10.10と同じか、ちょっと重い程度です。

 Ubuntuを使っているとかなり頻繁にアップデートがあって、アップデート・マネージャで簡単にアップデートされるので便利で良いのだが、一つ問題があってカーネルのバージョンアップがある度に新しいカーネルが追加インストールされる(古いカーネルが自動でアンインストールされない)のでブートメニュー上にバージョン違いのカーネルがずらずらと並んでしまう。それほど大きな問題ではないのだけれと、Windowsやその他のOSとデュアルブート環境にしている場合は、それらUbuntu以外のOSが下の方に表示されるので選択しにくくなる。
回避策としてGRUBの設定(/boot/grub/grub.cfg)から必要のない項目は削除してしまえば良いのだが、カーネルのアップデートがある度にgrub.cfgが作り直されてしまうので、結局古くなって使わないカーネルをアンインストールした方が良い。
  本来であれば、sudo apt-get autoremoveを行えば古くなって使わなくなったパッケージは削除されるのだが、Ubuntuの場合はapt-getの設定(/etc/apt/apt.conf.d/01autoremove)に

$ cat /etc/apt/apt.conf.d/01autoremove 
APT
{
  NeverAutoRemove
  {
        "^firmware-linux.*";
        "^linux-firmware$";
        "^linux-image.*";
        "^kfreebsd-image.*";
        "^linux-restricted-modules.*";
        "^linux-ubuntu-modules-.*";
  };

  Never-MarkAuto-Sections
  {
        "metapackages";
        "restricted/metapackages";
        "universe/metapackages";
        "multiverse/metapackages";
        "oldlibs";
        "restricted/oldlibs";
        "universe/oldlibs";
        "multiverse/oldlibs";
  };
};

という具合に、linux-image.*が自動アンインストールの対象にならないように記載がされているため、手動でアンインストールする必要がある。

 01autoremoveからlinux-imageを抜いてしまえば自動アンインストールが行われるのだが、カーネルのバージョンアップが行われた時に、起動できない、特定のサービスが起動しなくなる、その他のトラブルが起こりえるため、最低でも1つ前のカーネルまでは残しておいた方が良い。そのため、カーネルは手動でアンインストールした方が良いと思う。

 カーネルを手動でアンインストールする場合だが、カーネルパッケージの正しい名前が必要になるので、aptitudeコマンドを使ってパッケージを探し、apt-getコマンドでpurgeしてしまうのが良いと思う。

$ aptitude search linux-image
p   linux-image                                            - Generic Linux kernel image.                                      
v   linux-image-2.6                                        -                                                                  
p   linux-image-2.6.32-305-ec2                             - Linux kernel image for version 2.6.32 on x86/x86_64              
p   linux-image-2.6.35-22-generic                          - Linux kernel image for version 2.6.35 on x86/x86_64              
p   linux-image-2.6.35-22-generic-pae                      - Linux kernel image for version 2.6.35 on x86                     
p   linux-image-2.6.35-22-virtual                          - Linux kernel image for version 2.6.35 on x86/x86_64              
p   linux-image-2.6.35-23-generic                          - Linux kernel image for version 2.6.35 on x86/x86_64              
p   linux-image-2.6.35-23-generic-pae                      - Linux kernel image for version 2.6.35 on x86                     
p   linux-image-2.6.35-23-virtual                          - Linux kernel image for version 2.6.35 on x86/x86_64              
p   linux-image-2.6.35-24-generic                          - Linux kernel image for version 2.6.35 on x86/x86_64              
p   linux-image-2.6.35-24-generic-pae                      - Linux kernel image for version 2.6.35 on x86                     
p   linux-image-2.6.35-24-virtual                          - Linux kernel image for version 2.6.35 on x86/x86_64              
p   linux-image-2.6.35-25-generic                          - Linux kernel image for version 2.6.35 on x86/x86_64              
i   linux-image-2.6.35-25-generic-pae                      - Linux kernel image for version 2.6.35 on x86                     
p   linux-image-2.6.35-25-virtual                          - Linux kernel image for version 2.6.35 on x86/x86_64              
p   linux-image-2.6.35-27-generic                          - Linux kernel image for version 2.6.35 on x86/x86_64              
i   linux-image-2.6.35-27-generic-pae                      - Linux kernel image for version 2.6.35 on x86                     
p   linux-image-2.6.35-27-virtual                          - Linux kernel image for version 2.6.35 on x86/x86_64              
p   linux-image-2.6.35-28-generic                          - Linux kernel image for version 2.6.35 on x86/x86_64              
i   linux-image-2.6.35-28-generic-pae                      - Linux kernel image for version 2.6.35 on x86                     
p   linux-image-2.6.35-28-virtual                          - Linux kernel image for version 2.6.35 on x86/x86_64              
p   linux-image-ec2                                        - Linux kernel image for ec2 machines                              
p   linux-image-generic                                    - Generic Linux kernel image                                       
i   linux-image-generic-pae                                - Generic Linux kernel image                                       
p   linux-image-server                                     - Linux kernel image on Server Equipment.                          
p   linux-image-virtual                                    - Linux kernel image for virtual machines                          

 一番左にiと表示されているパッケージがインストールされているパッケージになる。この場合であれば、linux-image-2.6.35-25-generic-pae、linux-image-2.6.35-27-generic-pae、linux-image-2.6.35-28-generic-paeと3つのカーネルがインストールされている状態となるので、linux-image-2.6.35-25-generic-paeを削除することになる。

$ sudo apt-get purge linux-image-2.6.35-25-generic-pae

 apt-getでパッケージをpurgeした場合、自動的にgrub.cfgファイルが作り直され、起動時のメニュー項目からも消える。

Ubuntu10.10をクライアントとして利用するときに気になるのが、ウイルス対策とファイアウォールです。

ウイルス対策についてはSynaptecパッケージマネージャからインストール出来るClamAVを使ったり、AVG Anti-Virus Free Edition for Linuxを使ったりすることで対応可能ですが、ファイアウォールについてはLinuxなのでiptablesベースのファイアウォールが利用できます。

残念ながらコマンドベースですが、ufwというコマンドで簡易的に設定出来るようになっていますが、デフォルトでは無効になっています。

まず状態の確認を行います。

$ sudo ufw status
状態: 非アクティブ

無効になっています。

ルールとしてネットワークからのアクセスはブロックする設定を行います。

$ sudo ufw default deny
Default incoming policy changed to 'deny'
(適用したい内容に基づいて必ずルールを更新してください)

この状態でファイアウォールの動作状態を確認します。

$ sudo ufw status
状態: 非アクティブ

まだ無効な状態です。

ファイアウォールを有効に設定します。

$ sudo ufw enable
ファイアウォールはアクティブかつシステムの起動時に有効化されます。

状態を確認します。

$ sudo ufw status
状態: アクティブ

この状態で外部からのアクセスはすべてブロックに設定されたファイアウォールが動作しています。

実際にはsudo ufw defaut deny; sudo ufw enableと入力するだけでファイアウォールは動作するのですが、特にデスクトップを重視したディストリビューションだし、どうせなら最初からある程度有効に設定されていればいいのになぁ・・・。と思ってしまいます。


前述のUbuntu server 10.10 自動起動に失敗するはrc.dから起動する話だが、dovecotについてはUpstartで直接起動する。

dovecotをeth0:1、eth0:2等のサブインターフェースを使い動作させているのだけど、自動起動に失敗していた。 インターフェースの初期化よりも先にdovecotが起動されるらしく、エラーログ(/var/log/mail.err)に次のようなエラーが記録されていた。
Mar 22 20:23:30 hostname dovecot: bind(192.168.110.1, 143) failed: Cannot assign requested address
この場合の対処は簡単でstart onの条件にサブインターフェースのインターフェースアップを記述する事で収まった。
start on filesystem and net-device-up IFACE=eth0:1
通常のSysVInitを採用するUNIXならば、例えばS01networkでNICの初期化、インターフェースのアップが行われているのであれば、S90dovecotとか01→90と記述する事で簡単に起動順序を変更する事が出来るのだが、Upstartを採用しているUbuntu10.10ではstart onの条件としてデーモン起動時に事前に必要になる項目を書く必要があるという事になる。
正直Upstartの方法はちょっと面倒臭いので、多分互換性維持の為に残されていると思われるrc.d(/etc/init/rcで起動される)に起動スクリプトを置いたほうが分かりやすいかも知れない。Ubuntu Desktop版のようにクライアント用途で、利用者が起動スクリプトを配置することが無いのであれば、起動時間の短縮やホットプラグデバイスの利用を考えてUpstartを採用した方が良いと思われるのだが。
正直、SystemV系UNIXの /etc/rc*.d/に/etc/init.d/*へのシンボリックリンクを張って自動起動を制御するとか、RedHat系のchkconfigで自動起動のOn/Offが簡単に行える環境、BSD系のrc.localとかにNAMED=ONとか書くだけの簡単なやりかたに馴れすぎていてSolaris10のsvcadmやUbuntuのUpstart、MacOSXのLaunchchtなんか面倒で仕方無いのだけれど。

Ubuntu server 10.10 自動起動に失敗する

Ubuntu 10.10 Server版でnamed, apache2の自動起動に失敗していました。自動起動はしないのですが、OS起動後に手動で起動すると問題無く起動する。

例えば手動で

# /etc/init.d/named start

とか

# service named start

とコマンドを打って起動する分には、全然問題無く起動します。今まで通り /etc/init.dに起動スクリプトを置いて、/etc/rc2.dの下にシンボリックリンクを張った状態です。この状態なので起動スクリプトの書き方に問題があるわけではないという事までは判っていました。

気になったのが

# runlevel

のレスポンスが

unknown

になる事。でも、inittabが無い(^^; (※BSD好きですが、SVR4育ちなのでまずそこを見ようとするクセが・・・) 何処でランレベルの設定してるの?って状態だったのですが、どうやらUpstartの起動時に /etc/init/rcS.conf→/etc/init/rc-sysinit.confと読んで(※実際にはイベント駆動っぽい動作らしく、スクリプトが次のスクリプトをキックしているわけではないようです。サーバ用とでは起動時間を削減してくれるよりは、起動プロセスを追っかけやすくしてくれてるほうがありがたいのですが。)  rc-sysinit.confの中で

env DEFAULT_RUNLEVEL=2

と設定しているようなのです。で、最後に

telinit "${DEFAULT_RUNLEVEL}"

とランレベルを2に移行していました。

ここまで調べて やっとrc-sysinit.confが動いていない事が判りました。

あとは rc-sysinit.confの中で、start onの条件が

start on filesystem and net-device-up IFACE=lo

と書かれていたのですが、その部分がNGだったようで

start on filesystem and started networking

と書き換えることで、rc-sysinit.confが正しく動くようになりました。

# runlevel

のレスポンスが

N 2

となっており、ランレベル2になっていることが確認できました。

この結果、rc-sysinit.conf → telinit 2 → /etc/init.d/rc 2 → /etc/rc2.d/S* という順序で従来の /etc/rc2.d/S*のファイルが起動されるようになりました。

いつの間にかUbuntuの起動スクリプトもSysVinitからUpstartへの移行が進んでいて起動スクリプトのキックされかたが全然別物になってました(^^;

それにしてもUbuntuのUpstart関連のドキュメントって探してもなかなか見つからず、調べるのに難儀しました。もっとドキュメント整備されると良いのですが・・・。

ブログサーバお引っ越し

ずっとですが、Coreserverの負荷が高くて使いにくかったので、サーバを引っ越ししてしまいました。 引っ越しそのものもかなり面倒だったし、引っ越し先のサーバくんもかなり非力ですが、固定IP、サーバ証明書付き、ユーザー数1という環境に移ることが出来ました。引っ越し先は自分のサーバです。

細かい設定は先日のMovableTypeのバージョンアップでかなり省略していましたのでMovable Typeとしてはほぼ新規の環境を構築して、それに記事のデータベースや、画像などのデータをコピーして完了・・・という。

まずハマリどころだったのが、Ubuntu ServerのPerlです。
いつものようにCPANに行ってImage::Magickをインストールしようと

# perl -MCPAN -e shell
cpan[1]> install Image::Magick
などとやってみたんですが、makeでこけて入りません(T_T
色々やってみたんですがどうにも入らなくて最終的にはパッケージから入れました。

# apt-get install perlmagick

何となく気持ち悪いのですが。仕方無いですね。


自宅サーバ リプレース

ずいぶん前からIntelのD510MOが買ってあって、これで新しいサーバを組もうと思っていたのですが、このところ相当仕事が忙しくて、全く時間が無かった・・・というか寝る時間すらなかったので、かなりほって置いたのですが、やっと組み立てました。
Pentium4の531からAtomD510への移行ということで、スペックアップというよりは省電力化、静音化を狙ってという意味合いが強いです。外部公開する必要があるサービスはDNSとメールだけなので、別にスペックは必要無いのです。メールが増えてきたのでディスク容量は大幅に増加させましたが。
OSはOpenSolarisも考えましたが、Sunの買収により今後の動向が心配だったので、別のOSに移行する事にしました。個人的な趣味でFreeBSD / NetBSDでも良かったし、無難にCentOSという選択肢もアリだったのですが、GUIが使えるようにしておきたかった事と、クライアントPCとしても使ってみたかったのでUbuntu Serverにしてみました。

基本的にはDNSサーバもBind9からBind9、メールサーバもPostfix→Postfix、Dovecot→Dovecotという事でデータ移行を含めても数時間でさっくり動かすことが出来ました。
ついでにhavpとclamsmtpもインストールして、Web、メールのウイルスチェックも実施する事に。


Ubuntu10.10のキーリングの解除

  • 投稿日:
  • by
  • カテゴリ:
Ubuntuを10.10にアップグレードしてから、起動する度にキーリングの解除パスワードを入力してくださいという画面がやたらと(4回)出るようになって、非常にうざかったんで、思い切ってキーリングの解除パスワードを解除してしまいました。

やり方は以下の通り
 システム→設定→パスワードと暗号鍵 を開く
 パスワード:loginとか言うのがあるので、編集→削除で項目ごと削除

これで、起動時に聞いてくる回数が1回になりました。あとは自動ログインしなければキーリングの解除パスワードは聞いてこなくなるようですが、手動でログインするのと、キーリングの解除にパスワードを入力するのが、どちらが楽か?って話なので、別にどっちでも良いか、と。強いて挙げれば、手動ログインに設定してログイン後デスクトップ画面が出てくるまで若干待ち時間があるのよりは、ログインが終わってデスクトップが表示されている状態でパスワードを入力する方が、ほんの少しだけ気持ち的に良いかなとか思って、そのようにしました。


スキャナが動いた

CanonのN1220Uという随分古い・・・ニュースリリースで見たところ発売が2000年8月だそうです・・・フラットヘッドスキャナを持っているんですが、かなり以前からドライバの提供が止まっていて、Windows版のドライバはXPで終了、MacOS X用のドライバはPowerPC版 OS X 10.1.3用で終了(当然Intel Macは非対応)してしまったので、今となっては使える環境も無く、かといって壊れたわけでもないので捨てるに捨てられず・・・と困った状態になっていたのですが。

何と、Ubuntu 10.04で動きました!

Ubuntu 10.04に標準でSimple Scanというソフトが入っているんですが、N1220UをUSBで接続してSimple Scanでスキャンさせてみたら、そのまま動いてしまいました。
ちょっとビックリです。


別にスキャンしたいものも無かったので、手元にある文庫本をスキャンさせてみました。

スキャナN1220Uの動作テスト(宇宙の果ての)


スキャンさせたものがあまりに・・・という気がしますが、なんせ、すぐ手元にあったもので・・・。



10年も前のスキャナなのに十分綺麗にスキャンできているし、まだまだ現役じゃなねぇか!と思うのですが、、、ドライバの提供が終わっちゃっているってのが、勿体ないなぁ。VistaとかWindows7とかIntel Macに乗り換えた人が、ドライバが無いって事でスキャナを買い換えたりした事もあるんだろうなぁ、とか妄想してみますが。

Ubuntuなかなか使えるんじゃないか?と。