Linux

2022年04月02日

Raid1の片肺起動

忘れないうちに書いておく。

vi /sys/module/md_mod/parameters/start_dirty_degraded

で 0→1 にする。



abm55608 at 17:10|PermalinkComments(0)

2022年03月27日

RAID1領域とファイルシステムの拡張

自宅LinuxサーバはRAID1で運用しており1年ごとに片肺交換を行なっている。HDD単体でみると2年使用して交換していることになる。
これまで4Tのドライブを使用していたが前回交換の際に6Tとした。今回もう片肺も6Tとし晴れて6T使用できる状況となったため認識容量の拡張を行なった。

因みに前回4TのRAID1に6Tのパーティションを追加しても容量は4Tのまま。片肺が4Tなのだから当然で新HDDの2Tは遊んでいることになる。今回もう片方も6Tのパーティションとなり全領域が使用できる状態ではあるが、RAIDサイズもファイルシステムも勝手には拡張してくれない。ちゃんと指示してあげる必要がある。

なお全ての操作はオンライン(マウントしたまま)の状態で操作可能。備忘録のため詳細は省くが操作自体は簡単で一瞬で完了する。

先ずはRAID1の拡張。パーティションの最大までとする。

mdadm --grow /dev/md1 -z max --assume-clean

オプションの「--assume-clean」は拡張部分のRAID再構築を省略するもの。理論的に再構築は不要。

次にファイルシステムをRAID1領域の最大まで拡張

resize2fs -p /dev/md1

オプションの「-p」は進行状況を見るプログレスバーを表示させるものだが、表示するまでもなく一瞬で終わった。



abm55608 at 17:22|PermalinkComments(0)

2012年03月28日

mlocateのデータベース更新で特定のディレクトリを除外する

Ubuntu Server を構築する際、ルートパーティションは10GB程しか確保していませんでした。(/homeだけ別パーティション)

現在70%ほど使用していて(おそらく半分は古いカーネル類)、特に増える予定もなかったのですが、最近ふと見ると90%を超えていることがしばしば。対策をどうしようと頭を悩ませていたところ、どうも一時的なもので暫くするとまた70%程に落ち着くことが判ってきました。

90%を超えているときにプロセスを確認してみると、updatedb.mlocate というのがどうも怪しい。
で、いつものようにGoogle先生に聞いてみます。

どうもこれはファイル一覧のデータベースを更新しているもので、更新の際の一時ファイル(というか新dbファイル?)が要領を圧迫しているらしい。
そこでバックアップ関連のディレクトリを除外することにしました。

#vi /etc/updatedb.conf

とし

PRUNE_BIND_MOUNTS="yes"
PRUNEPATHS="/tmp /var/spool /media /mnt"
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf fuse.glusterfs fuse.sshfs ecryptfs fusesmb devtmpfs"

太字の部分を追加。

私の場合、バックアップ元は別運営のNASで、バックアップ先は外付けHDDのため、マウントフォルダ全部を除外してしまうのが簡単です。

…と、これを書いているうちにdb更新が終了したようです。占有率が70%程に戻りました。

次のdb更新は明日の朝。うまく除外されているか確認しないといけませんね。

ちなみにdbファイルの場所は

/var/lib/mlocate

です。

--

最近大量購入しました。



abm55608 at 06:30|PermalinkComments(0)TrackBack(0)

2011年12月10日

MySQLに外部から接続

UbuntuのMySQLにWindowsから接続しようとして、ちょっとはまったのでメモ。

  1. WindowsにODBCをインストールします。

    ドライバは以下からダウンロード。
    http://dev.mysql.com/downloads/connector/odbc/5.1.html

  2. インストールと設定

    普通にインストールして、コンパネ → 管理ツール → データソース(ODBC) → システムDSNタブ → 追加 → MySQL ODBC x.x Driver

  3. MySQLを外部から接続可能に

    /etc/mysql/my.cnf を編集
bind-address = 127.0.0.1
   ↓
#bind-address = 127.0.0.1   (コメントアウト)
はまったのは(3)で、完全に失念していました。
不要な時間を費やしてしまった…。

--
そろそろ新型がでるかな?




abm55608 at 22:09|PermalinkComments(0)TrackBack(0)

2011年12月06日

Time just moved backwards by 6 seconds. (Dovecot)

先日メール受信ができなくなりました。
というかIMAPサーバが動いていない様子。

WebminからDovecotを見てみると確かに停止しています。普通の起動操作であっさり起動。とりあえずよし。

で、原因追及へ。
アクセスできなくなった時間を手がかりにログを追っていきますと…、ありました。
mail.logに

dovecot: Fatal: Time just moved backwards by 6 seconds. This might cause a lot of problems, so I'll just kill myself now. http://wiki.dovecot.org/TimeMovedBackwards
時間が6秒巻き戻りました。問題が発生するかもしれないので自身を止めます。(…みたいな感じ?)

そういえば安易にntpdateで時刻合わせしてました。1日1回なら問題ないかと思っていましたが、ダメなんですね。

ということで、ntpdで管理することにします。
先ずはインストール

# apt-get install ntpd

で、
http://wiki.nothing.sh/page/NTP/%BF%E4%BE%A9%B8%F8%B3%AB%A5%B5%A1%BC%A5%D0
とかあたりでntpサーバを適当に見繕って設定していきます。
今回はサーバ自身の時刻を合わせるだけなので、ntpサーバとしての機能は使用しません。

# vi /etc/ntp.conf
--略
server ntp.nict.jp
server ntp.jst.mfeed.ad.jp
server ntp.ring.gr.jp
--略
#restrict -4 default kod notrap nomodify nopeer noquery
#restrict -6 default kod notrap nomodify nopeer noquery
restrict ignore
--略
restrict 127.0.0.1
#restrict ::1

といった感じ。

ntpdのインストール時に勝手に起動してるので、止めて

# /etc/init.d/ntpd stop

予め大まかな時刻合わせをして

# ntpdate ntp.nict.jp

ntpdを起動

# /etc/init.d/ntpd start

rcconfで確認すると自動起動は設定されてました。

ステータス確認

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp-a3.nict.go. .NICT.           1 u  815 1024  377    7.880   -0.004   0.033
+ntp3.jst.mfeed. 210.173.176.4    2 u  346 1024  377    6.548    0.367   0.322
-ring.ix.oita-u. 133.40.41.136    3 u  339 1024  377   38.169   -0.952   0.161

これを書いてる時点では起動してから結構経ってますので安定してるようです。

これで、じわりじわりと時刻合わせが行なわれるはず。

仕組みは知ってましたが、実害が無いのでntpdateでもいいかな〜と思ってましたが、やはり横着はいけない、というお話しでした。

--

最近購入しました。
いつのまにかずいぶん安くていいものが出てたんですね。



abm55608 at 06:00|PermalinkComments(0)TrackBack(0)

2011年10月27日

Ubuntuでサービスの自動起動を簡単に設定する

今日UbuntuサーバのWebminにアクセスしようとしたところ失敗。同サーバのphpMyAdminにはアクセスできたので、どうもWebminが走ってない様子。
そういえば以前も別のサーバで同じことがあったような気が…。

どのみち必要なのでまずはWebminを起動します。

# service webmin start

で、WebminでWebmin自身の自動起動の設定を見てみると、何故か自動起動しない設定に。
当然自動起動に設定しようとしましたが、なぜか受け付けてくれません。

サービスの自動起動を設定しないといけないのか…。またランレベルがどうのこうのとややこしいから嫌なのよねぇ。

とか思いながらググってたら簡単なのを発見。

# apt-get install rcconf
# rcconf

ちょうどtaskselと同じような画面で簡単に設定できます。

rcconf

何故か描画が乱れますが、まあ使用に差し支えはありません。

こんな便利なのがあったのね…。


最近買って、とてもよかった本。
かなり易しい入門書です。



abm55608 at 22:39|PermalinkComments(0)TrackBack(0)

2011年09月27日

MySQLにおけるnullの取り扱い

MySQLでデータを取り出す際にちょっとはまったので覚え書き。
前提:
担当者名を入れるフィールド「charge」があり、担当者名が入っているかnullかのどちらかです。
またアクセス者名を入れる変数$userがあり、これは必ずアクセス者名が入っています。

ここで、「自分が担当者でない」データを検索するとき

〜 and charge != '$user' and 〜

としたところ、chargeがnullのデータは一切ヒットしなくなりました。

Google先生によると出てきた解は、MySQLの比較は比較物がnullの時は必ず「偽」を返す、というものでした。(これも嘘というか私の解釈違いな訳ですが)

そこで次のように変更してみます。

〜 and not(charge = '$user') and 〜

偽のnotなのでこれでうまくいくと思いましたが、結果は先ほどと全く同じ。どうもnullの扱いがよくわかりません。

さらに調べていくと…、ありました。「nullセーフ」というんだそうです。
MySQLの比較演算子「=」はnullセーフではないとのこと。「=」に相当するnullセーフな比較演算子は「<=>」なんだそうです。

つまり私の期待した答えを得られる式は

〜 and not(charge <=> '$user') and 〜

ということです。

正確な仕様は、

  1. MySQLの真偽は「真=1」「偽=0」と考えるとわかりやすい。
  2. 通常の(nullセーフでない)比較演算子は、比較対象がnullの時必ず「null」を返す。(nullは「0」(つまり偽)ではない。)
  3. nullセーフな比較演算子「<=>」で期待する結果が得られる。

ということの様です。(参考資料:MySQL 6.3.1.2. 比較演算子)

まとめてみると

chargeの中身期待値charge != '$user'
not(charge = '$user')
not(charge <=> '$user')
アクセス者名
他のユーザ名
null

こんな感じでしょうか。

ここでいう「nullセーフな比較」という概念そのものを知らなかった(全ての比較演算子がnullセーフだと思っていた)ため、ここを疑うまでに結構かかりました。

思い込みって怖いですね。


静かで安くてコストパフォーマンス最高。
Linuxサーバに最適。



abm55608 at 12:50|PermalinkComments(0)TrackBack(0)

2011年09月22日

PHPでのMIMEエンコード、デコードで文字化け

phpからメールを送る際に、ちょっとはまったので覚え書きを。

元々の思い込みとしては、

  1. メールヘッダの文字コードはJIS(ISO-2022-JP)に変換
  2. Subject以外のヘッダの日本語部分は全てMIMEエンコードする

をきちんとやれば文字化けはしないはず、ということ。

…のつもりが何故か文字化けします。

構文は、例えば

$headers = "From: ".mb_encode_mimeheader(mb_convert_encoding("氏名", 'ISO-2022-JP', 'EUC-JP'))." <メールアドレス>\n";

な感じ。
(ちなみに訳あってコードはEUC-JPで書いてます)

ところがこれで化けます。

結論としては、

mb_language('japanease');
mb_internal_encoding('EUC-JP');
$headers = "From: ".mb_encode_mimeheader("氏名")." <メールアドレス>\n";

でいい様です。

mb_encode_mimeheader()、mb_decode_mimeheader()共に受け渡しの文字コードは指定できないわけですが、これがいわゆる「内部エンコーディング指定」で行なわれている様なんです。

つまり、内部エンコーディングに指定した文字コードで受け渡しをすれば適切に処理してくれる、ということ。

こういうブラックボックスな仕様はやめてほしいものです。

文字化けに関する基本的な考え方としては以下がとても参考になります。
PHPの文字化けを本気で解決するhttp://hain.jp/index.php/tech-j/2007/02/13/p125

何よりも問題の本質は、日本語文字コードが乱立していることなんでしょうけどね…。

なににせよ、日本語処理には悩まされることが多いですね。

--

これがないと始まりません。
かなり痛んできたので、そろそろ買い直そうかと。



abm55608 at 08:45|PermalinkComments(0)TrackBack(0)

2011年06月01日

WelcomeMessageが二重に表示される

2011.6.8 追記

今日ログインしたところ、motd.tail が復活していました。
よくわからないので、とりあえずファイル削除ではなく中身を空に。

しばらく様子見です。


Ubuntuサーバのお話。

パッケージのアップグレードを自動でやらせているんですが、再起動は手動で行なう様にしています。
この再起動、必要時にはWelcomeMessageに要求が出るので、誰も使用していないタイミングを見計らって手動で行なっていました。

ところが最近、どうもこの再起動要求がない。アップグレードのメールは時々あるのになー、と思っていたところ、別件の不具合を調査中にふと気づいたわけです。

それは、
「LoginMessageがスクロールするほど長い」
「実は再起動要求は出ていたが、スクロールで流れてしまっていた」
ということ。
で、よく見るとこのように同じ内容が二重に表示されているわけです。

login as: ***
***@ubuntu password:
Linux ubuntu 2.6.32-32-server #62-Ubuntu SMP Wed Apr 20 22:07:43 UTC 2011 x86_64 GNU/Linux
Ubuntu 10.04.2 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Wed Jun  1 08:27:12 JST 2011

  System load:    0.17               Processes:           140
  Usage of /home: 1.2% of 282.41GB   Users logged in:     0
  Memory usage:   11%                IP address for eth0: 192.168.***.***
  Swap usage:     0%

  Graph this data and manage this system at https://landscape.canonical.com/

3 packages can be updated.
3 updates are security updates.

Ubuntu 10.04.2 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Tue Apr 19 15:19:39 JST 2011

  System load:    0.0                Processes:           153
  Usage of /home: 1.2% of 282.41GB   Users logged in:     0
  Memory usage:   32%                IP address for eth0: 192.168.***.***
  Swap usage:     0%

  Graph this data and manage this system athttps://landscape.canonical.com/

No mail.
Last login: Wed Jun  1 08:18:17 2011
***@ubuntu:~$

で、ググってみたらありました。
二重に表示されるウエルカムメッセージ

要は /etc/motd.tail という古いファイルが残ってしまっていることが原因らしい。
いきなり消すのは怖いので、先人に倣ってリネームで。

# cd /etc
# mv motd.tail motd.tail.old

無事解決しました。

--

ちょっとほしい。

 



abm55608 at 08:45|PermalinkComments(0)TrackBack(0)

2011年02月03日

新しいHDDにLinuxシステムを移行する

まいどまいど御無沙汰です。
今日はUbuntu-Serverのシステムを新しいHDDに移行する話です。

これまでは1TBのHDDのうち、20GBがシステム、1GB弱ほどのSwap、残った全てが /home (=データストレージ)、といったパーティション分けで使ってきました。

稼働し始めてから2年と少し経っていますが、しばらく前から残容量をやりくりしないといけないようになり、さらにここに来てデータトラブルが出てきたことから、2TBHDDへ移行することにしました。

もともと1TBのHDDに対して1TBのHDDをバックアップ用として使用していますので、今回も2TBのHDDを2台買ってきました。
買ったのはWD20EARS。2TBで8,000円とはいい時代になったもんですね。

結構色々苦労しましたが、大きな問題点として

  1. grub のインストール
  2. Advanced Format に関する問題

の二つがありました。
本当は苦労話を書きたいところですが、書いているうちに飽きてくると思うので、次同じことを行なうときの為のメモのみを。

実際には上記2は後から改めて対処してますので、HDDの移行は2回行なってたりします。


1. 新しいHDDにパーティションを作る。

Advanced Format の問題がありますので、セクタ単位(?)で手動で切っていきます。

# fdisk /dev/sdb

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First sector (63-3907029167, default 63): 2048
Last sector or +size or +sizeM or +sizeK (2048-3907029167, default 3907029167): 41943103

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First sector (63-3907029167, default 63): 41943104
Last sector or +size or +sizeM or +sizeK (41943104-3907029167, default 3907029167): 3902834855

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First sector (63-3907029167, default 63): 3902834856
Last sector or +size or +sizeM or +sizeK (3902834856-3907029167, default 3907029167): <CR>
Using default value 3907029167

Command (m for help): w

2. grubのインストール

色々調べて試してみたものの、結局うまくインストールできませんでした。仕方ないので、さっき作ったパーティションにOSをクリーンインストールしました。インストールの最後に行なわれるgrubインストールの為だけに。(^^)

うまくいけばそれでいいのさっ。

3. /homeのコピー

これはrsyncを使いました。
サーバはなるべく止めたくないので

  1. rsyncで全てをコピー
  2. メールサーバ関連、Samba関連等を全て止めてからrsyncで差分コピー

という2段仕込みにしました。

4. システムのコピー

grubの為にCDからインストールしたシステムパーティションの中身を全て削除してから、コピー先のフォルダにて

# /sbin/dump -0f - /dev/hda1 2>> (ログファイル) | restore -rf -

としてコピー。

このままですと起動時にマウント失敗しますので、/etc/fstab のマウントドライブを /dev/sda 等に替えておきます。

5. update-grub

起動時の呼び出しドライブ情報と、実際に呼び出されるドライブの情報との整合性がとれていない為、このままでは起動できません。

一番簡単なのは、インストールCDから起動し、レスキューモードからupdate-grubすることだと思います。
何も考えなくても、これだけでうまく調整してくれる様です。

--------------------------------
これでうまくいくはずです。

ついさっき終わったばかりの作業を書いているので、たぶん抜けはないかと…。
また次に、もっと容量を、となる時にはパーティション等で苦労しそうです。


--
いつの間にか新しいのが出てたようです。

 



abm55608 at 18:50|PermalinkComments(0)TrackBack(0)