Linux
2022年04月02日
Raid1の片肺起動
忘れないうちに書いておく。
vi /sys/module/md_mod/parameters/start_dirty_degraded
で 0→1 にする。
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」は進行状況を見るプログレスバーを表示させるものだが、表示するまでもなく一瞬で終わった。
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
です。
--
最近大量購入しました。
2011年12月10日
MySQLに外部から接続
UbuntuのMySQLにWindowsから接続しようとして、ちょっとはまったのでメモ。
- WindowsにODBCをインストールします。
ドライバは以下からダウンロード。
http://dev.mysql.com/downloads/connector/odbc/5.1.html - インストールと設定
普通にインストールして、コンパネ → 管理ツール → データソース(ODBC) → システムDSNタブ → 追加 → MySQL ODBC x.x Driver - MySQLを外部から接続可能に
/etc/mysql/my.cnf を編集
bind-address = 127.0.0.1はまったのは(3)で、完全に失念していました。
↓
#bind-address = 127.0.0.1 (コメントアウト)
不要な時間を費やしてしまった…。
--
そろそろ新型がでるかな?
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でもいいかな〜と思ってましたが、やはり横着はいけない、というお話しでした。
--
最近購入しました。
いつのまにかずいぶん安くていいものが出てたんですね。
2011年10月27日
Ubuntuでサービスの自動起動を簡単に設定する
今日UbuntuサーバのWebminにアクセスしようとしたところ失敗。同サーバのphpMyAdminにはアクセスできたので、どうもWebminが走ってない様子。
そういえば以前も別のサーバで同じことがあったような気が…。
どのみち必要なのでまずはWebminを起動します。
# service webmin start
で、WebminでWebmin自身の自動起動の設定を見てみると、何故か自動起動しない設定に。
当然自動起動に設定しようとしましたが、なぜか受け付けてくれません。
サービスの自動起動を設定しないといけないのか…。またランレベルがどうのこうのとややこしいから嫌なのよねぇ。
とか思いながらググってたら簡単なのを発見。
# apt-get install rcconf
# rcconf
ちょうどtaskselと同じような画面で簡単に設定できます。
何故か描画が乱れますが、まあ使用に差し支えはありません。
こんな便利なのがあったのね…。
最近買って、とてもよかった本。
かなり易しい入門書です。
2011年09月27日
MySQLにおけるnullの取り扱い
前提:
担当者名を入れるフィールド「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 〜
ということです。
正確な仕様は、
- MySQLの真偽は「真=1」「偽=0」と考えるとわかりやすい。
- 通常の(nullセーフでない)比較演算子は、比較対象がnullの時必ず「null」を返す。(nullは「0」(つまり偽)ではない。)
- nullセーフな比較演算子「<=>」で期待する結果が得られる。
ということの様です。(参考資料:MySQL 6.3.1.2. 比較演算子)
まとめてみると
chargeの中身 | 期待値 | charge != '$user' not(charge = '$user') | not(charge <=> '$user') |
アクセス者名 | 偽 | 偽 | 偽 |
他のユーザ名 | 真 | 真 | 真 |
null | 真 | 偽 | 真 |
こんな感じでしょうか。
ここでいう「nullセーフな比較」という概念そのものを知らなかった(全ての比較演算子がnullセーフだと思っていた)ため、ここを疑うまでに結構かかりました。
思い込みって怖いですね。
静かで安くてコストパフォーマンス最高。
Linuxサーバに最適。
2011年09月22日
PHPでのMIMEエンコード、デコードで文字化け
phpからメールを送る際に、ちょっとはまったので覚え書きを。
元々の思い込みとしては、
- メールヘッダの文字コードはJIS(ISO-2022-JP)に変換
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
何よりも問題の本質は、日本語文字コードが乱立していることなんでしょうけどね…。
なににせよ、日本語処理には悩まされることが多いですね。
--
これがないと始まりません。
かなり痛んできたので、そろそろ買い直そうかと。
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 LTSWelcome to the Ubuntu Server!
* Documentation: http://www.ubuntu.com/server/docSystem 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/docSystem 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
無事解決しました。
--
ちょっとほしい。
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円とはいい時代になったもんですね。
結構色々苦労しましたが、大きな問題点として
- grub のインストール
- 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): 41943103Command (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): 3902834855Command (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 3907029167Command (m for help): w
2. grubのインストール
色々調べて試してみたものの、結局うまくインストールできませんでした。仕方ないので、さっき作ったパーティションにOSをクリーンインストールしました。インストールの最後に行なわれるgrubインストールの為だけに。(^^)
うまくいけばそれでいいのさっ。
3. /homeのコピー
これはrsyncを使いました。
サーバはなるべく止めたくないので
-
rsyncで全てをコピー
-
メールサーバ関連、Samba関連等を全て止めてからrsyncで差分コピー
という2段仕込みにしました。
4. システムのコピー
grubの為にCDからインストールしたシステムパーティションの中身を全て削除してから、コピー先のフォルダにて
# /sbin/dump -0f - /dev/hda1 2>> (ログファイル) | restore -rf -
としてコピー。
このままですと起動時にマウント失敗しますので、/etc/fstab のマウントドライブを /dev/sda 等に替えておきます。
5. update-grub
起動時の呼び出しドライブ情報と、実際に呼び出されるドライブの情報との整合性がとれていない為、このままでは起動できません。
一番簡単なのは、インストールCDから起動し、レスキューモードからupdate-grubすることだと思います。
何も考えなくても、これだけでうまく調整してくれる様です。
--------------------------------
これでうまくいくはずです。
ついさっき終わったばかりの作業を書いているので、たぶん抜けはないかと…。
また次に、もっと容量を、となる時にはパーティション等で苦労しそうです。
--
いつの間にか新しいのが出てたようです。