So-net無料ブログ作成
  • ブログをはじめる
  • ログイン

MDデバイスのアラインメントとサイズの変更 [Linux]

1. 背景


ディスク 2 台を使用し、パーティション毎に RAID 1 を構成(mdadm を使用) している。
/boot は MD デバイス上に直接ファイルシステムを作成し、その他は MD デバイス上に LVM を作成し、LV 上にファイルシステムを作成している。

この環境において、ディスクの 1 台が壊れ、新しいディスクへの交換が必要となった。
新しいディスクは AFT 対応で、他方は AFT 未対応のディスクである。

作業の所要時間を重視するなら、下記のような手順での対応となる。
・新しいディスクのパーティション構成を交換前と全く同じにする。
 (AFT 対応のためのアラインメントの変更を行わない。)
・RAID 1 を構成するパーティション間の同期を行う。

今回は、今後の AFT 対応ディスクへの交換を見据え、パーティション構成(アラインメント、サイズ)の変更を行うことにした。
・パーティションの作成には Debian 8 の fdisk (util-linux 2.25.2) を使用する。

以下は、備忘録として、実施手順をまとめたものである。


2. 実施手順


(1) ディスクの交換


・OS のシャットダウン(電源 OFF を含む)
・ディスクの交換
・電源 ON (OS のブートを含む)

(補足)
交換するディスクが /dev/sda の場合には、ブートローダーのインストール(外部メディアから起動してのブートローダーのインストール等)が必要となる。


(2) 新しいディスクでのパーティションの作成


・セクタの開始位置が 8 の倍数になるようにする。
・サイズは、RAID 1 を構成する他方のパーティションのサイズ以上にする。
・この時点では、パーティションのタイプを指定しない(default: 83)。
・全パーテョションの作成後に、設定を反映するために OS を再起動する。


(3) 新しいディスクのパーティション・タイプの変更


RAID 1 を構成するパーティションについて、タイプを fd に変更する。


(4) MD デバイスへのデバイス(新しいディスク上のパーティション)の追加

# mdadm [--manage] <raid-device> --add <device>


・すべての MD デバイスについて実施する。
・データの同期が順次開始される。
・小さい方のデバイスのサイズ分のみが RAID 1 構成となる。

# cat /proc/mdstat


データの同期が終了するのを待つ。


(5) 既存ディスクでのパーティションの削除

# mdadm [--manage] <raid-device> --fail <device>


・MD デバイスの当該デバイス(パーティション)を切り離す(故障状態にする)。
・すべての MD デバイスについて実施する。

# mdadm [--manage] <raid-device> --remove <device>


・MD デバイスから当該デバイス(パーティション)を削除する。
・すべての MD デバイスについて実施する。

# mdadm --misc --zero-superblock <device>


・MD デバイスから削除したパーティションのスーパー・ブロックを初期化する。
・該当するすべてのパーティションについて実施する。

その後、下記の手順を実施する。
・既存ディスク上の全パーティションを削除する。
・全パーテョションの削除後に、設定を反映するために OS を再起動する。


(6) 既存ディスクでのパーティションの作成


・上記の (2) の手順と同様。
・パーティションのサイズは、RAID 1 構成の他方のパーティションと同じにする。


(7) MD デバイスへのデバイス(既存ディスク上のパーティション)の追加


上記の (3)、(4) の手順と同じ。


(8) MD デバイスのサイズ変更

# mdadm --grow <raid-device> --size=max
または
# mdadm --grow <raid-device> -z max


MD デバイスを構成するデバイス(パーティション)のサイズまで拡張される。


(9) MD デバイス上の PV のサイズ変更(LVM を作成した MD デバイスの場合)

# pvresize <raid-device>


・PV のサイズが、MD デバイスのサイズまで拡張される。
・PV のサイズが拡張されることにより、VG のサイズも拡張される。


nice!(1)  コメント(0) 
共通テーマ:パソコン・インターネット

ファイルパスの不要な/の削除 [Linux]

シェルスクリプトで、ファイルパスの不要な / を削除しようとして少々手間取ってしまった、
以下は、備忘録としてまとめたものである。

1. 要求仕様


ファイルパスから不要な / を取り除く。
・/ が連続する部分を / に変更
・最後の / を削除


2. 実行例


(1) sed の場合


(a) 基本正規表現を使用する場合

% echo ..//aa//bb//cc// | sed -e 's!/\{2,\}!/!g' -e 's!\([^/]\)/$!\1!'
../aa/bb/cc
% echo /// | sed -e 's!/\{2,\}!/!g' -e 's!\([^/]\)/$!\1!'
/


(b) 拡張正規表現を使用する場合

% echo ..//aa//bb//cc// | sed -r -e 's!/+!/!g' -e 's!([^/])/$!\1!'
../aa/bb/cc
% echo /// | sed -r -e 's!/+!/!g' -e 's!([^/])/$!\1!'
/


(c) 失敗例

% echo ..//aa//bb//cc// | sed -e 's!/*!/!g' -e 's!\([^/]\)/$!\1!'
/././a/a/b/b/c/c


(2) awk の場合

% echo ..//aa//bb//cc// | \
awk '{gsub(/\/+/, "/"); r=gensub(/([^/])\/$/, "\\1", 1); print r}'
../aa/bb/cc
% echo /// | \
awk '{gsub(/\/+/, "/"); r=gensub(/([^/])\/$/, "\\1", 1); print r}'
/


(補足)
・gsub() および sub() では "\\1" が機能しない。
・gensub() の戻り値は変換後の文字列である(元の文字列を変更しない)。


3. sed の正規表現


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

Firefoxのファイル入出力の候補に意図しないマウントポイントが表示されることへの対応 [Linux]

以前、Firefox のファイル入出力の候補に意図しないマウントポイントが表示されるため、表示されないように対応を行った。しかし、システムのバージョンアップにより、再発するようになってしまった。
以下は、この発生事象について備忘録としてまとめたものである。

[関係するソフトウェア]
・OS: CentOS 6/7、Debian 8/9
・Firefox 45.9.0 ESR、Firefox 52.4.0 ESR
・gvfs (CentOS の場合: gvfs、Debian の場合: gvfs-daemons)

1. 発生事象


ファイル入出力の候補にに意図しないマウントポイントが表示される。

・候補が多数表示されるため、見づらい。
・ファイルを開く時の候補に表示される。
・名前を付けてページを保存する時の候補に表示される。
・ブックマークのインポート/エクスポート時の候補に表示される。


2. 対処方法

2-1. gvfs 1.30 より前のバージョンの場合


CentOS 6、CentOS 7.3 まで、Debian 8 が該当する。

また、下記の条件により、状況が異なる。
・/usr/share/gvfs/remote-volume-monitors/udisks2.monitor の有無
 (ただし、CentOS 6 の場合では gdu.monitor)


(1) udisks2.monitor 有の場合 (初期状態)


上記のマウントポイントが表示される。


(2) udisks2.monitor 無の場合 (udisks2.monitor.org へのリネーム)


上記のマウントポイントが表示されない。


2-2. gvfs 1.30 以降の場合


CentOS 7.4 以降、Debian 9 が該当する。

また、下記の条件により、状況が異なる。
・Firefox のバージョン
・/usr/share/gvfs/remote-volume-monitors/udisks2.monitor の有無


(1) Firefox 45.9.0 ESR 場合


(a) udisks2.monitor 有の場合 (初期状態)


・/etc/auto.misc で定義されているマウントポイントが表示される。


(b) udisks2.monitor 無の場合 (udisks2.monitor.org へのリネーム)


・/etc/fstab で定義されているマウントポイントが表示される。


(2) Firefox 52.4.0 ESR の場合


(a) udisks2.monitor 有の場合 (初期状態)


・/etc/auto.misc で定義されているマウントポイントが表示される。
・[他の場所] という項目でまとめられるため、見づらくはない。


(b) udisks2.monitor 無の場合 (udisks2.monitor.org へのリネーム)


・/etc/fstab で定義されているマウントポイントが表示される。



nice!(1)  コメント(0) 
共通テーマ:パソコン・インターネット

Firefoxのブックマークでボーダーが表示されない [Linux]

[ソフトウェアのバージョン]
Firefox 52.3.0 ESR
OS: Debian 8.9、CentOS 7.3

1. 発生事象


Firefox のメニューバーから表示したブックマークで、ボーダーが表示されない。

・表示が重なった場合に見づらい。
・Firefox 45.9.0 ESR では発生しない。


2. 対処方法


ボーダーを表示するためのスタイルシートを追加する。
(Stylish を使用しているため、Stylish に設定を追加する。)

(設定例)

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

/* setting for bookmark */
menupopup > * {
  background-color: #f5f5f5 !important;
  border: 1px solid #c0c0c0 !important;
}

3. 備考


(1) 色のサンプル


https://developer.mozilla.org/ja/docs/Web/CSS/color_value


[追記]


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

ClamAVのウイルス情報の更新エラーへの対応 [Linux]

ClamAV のウイルス情報の更新時に、時々エラーが発生する。
また、この場合にはウイルスチェックでもエラーが発生する。
以下の記述は、備忘録として、この事象への対応方法をまとめたものである。

[ソフトウェアのバージョン]
・clamav 0.99.2
・OS: Debian 8/9、CentOS 6/7

1. 発生事象


(1) ウイルス情報の更新時のエラー


freshclam の実行時に、下記のようなエラーが発生する。

ClamAV update process started at Mon Aug  7 04:00:01 2017
main.cvd is up to date (version: 58, sigs: 4566249, f-level: 60, builder: \
sigmgr)
nonblock_connect: connect timing out (30 secs)
Can't connect to port 80 of host db.local.clamav.net (IP: 120.29.176.126)
Trying host db.local.clamav.net (27.96.54.66)...
Downloading daily-23639.cdiff [100%]
WARNING: [LibClamAV] cli_tgzload: Invalid checksum for file daily.hdb
WARNING: [LibClamAV] Can't load /usr/local/tools/clamav/lib/clamav/\
clamav-a91f125d25aeacd304ebb2e1aeb81814.tmp/\
clamav-677b156a3fc4f33d7fe701aa680c0c20.cld: Malformed database
ERROR: Failed to load new database: Malformed database
WARNING: Database load exited with status 55
ERROR: Failed to load new database
(status=55)


・daily.cld のダウンロードで問題が発生する。
・/usr/local/tools/clamav/lib/clamav は /var/lib/clamav のリンク元である。


(2) ウイルスチェック時のエラー


clamscan の実行時に、下記のようなエラーが発生する。

LibClamAV Error: cli_tgzload: Invalid checksum for file daily.hdb
LibClamAV Error: Can't load /var/lib/clamav/daily.cld: Malformed database
ERROR: Malformed database

----------- SCAN SUMMARY -----------
Known viruses: 523608
Engine version: 0.99.2
Scanned directories: 0
Scanned files: 0
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 0.887 sec (0 m 0 s)
(status=2)


・ウイルス情報の更新時のエラーが原因で発生する。


2. 対処方法

2-1. ウイルス情報の更新時のエラーへの対応


freshclam.conf を編集し、設定を下記のように変更する。

・Debian 8/9 の場合: /etc/clamav/freshclam.conf
・CentOS 6/7 の場合: /etc/frechclam.conf

(1) DatabaseMirror

DatabaseMirror db.jp.clamav.net
DatabaseMirror db.us.clamav.net


ウイルス情報のダウンロード先を指定する。
・db.jp.clamav.net は、db.local.clamav.net の正式名称である。
・db.jp.clamav.net は、database.clamav.net の正式名称である。


(2) CompressLocalDatabase

CompressLocalDatabase yes


ローカル・データベースを圧縮する。
・daily.{cld,cvd} を gzip で圧縮するか指定する。
・本来は daily.cvd となると思うが、daily.cld で保存されることがある。
 (file コマンドの実行結果では、gzipped と表示される。)

(補足)
この設定により、更新時のエラーが発生しなくなったように思われる。


2-2. エラーが発生した時の対応


(1) ウイルス情報の更新時のエラー


(a) ウイルス情報の更新を再実行する。


改善しない場合にのみ、以降の手順を実施する。


(b) エラーに関係するファイルを削除する。

# rm -fr /var/lib/clamav/*.tmp
# rm -f /var/lib/clamav/daily.{cld,cvd}
# rm -f /var/lib/clamav/mirrors.dat


(c) ウイルス情報の更新を再実行する。


(2) ウイルスチェック時のエラー


(a) ウイルス情報の更新が異常終了している場合


ウイルス情報の更新時のエラーへの対応を行う。


(b) ウイルス情報の更新が正常終了している場合


ウイルスチェックを再実行する。


3. 備考


(1) ウイルス情報の更新方法


現在、下記の方針に沿った方法でウイルス情報を更新している。

(a) freshclam コマンドを使用する。

(b) freshclam を cron から定期的に実行する。


freshclam のデーモン・モードは使用しない。


(c) 独自にログファイルを作成する。


[追記]


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

Firefox 52.xのファイル選択でディレクトリが先に表示されないことへの対応 [Linux]

Firefox 45.9.0 ESR と Firefox 52.2.1 ESR を併用しているが、後者において、ファイル選択ウィンドウでファイルとディレクトリの区別なく単純にソートされる。
詳細は、以下の通りである。

1. 発生事象


Firefox 52.xのファイル選択でディレクトリが先に表示されない。
(ファイル、ディレクトリの区別なく、名前でソートされる。)

・Firefox 52.2.1 ESR でメニューからファイルを開く際に上記の事象が発生する。
・Firefox 52.2.1 ESR のブックマークの Import/Export で上記の事象が発生する。
・Firefox 45.9.0 ESR では発生しない。


2. 対処方法


(1) dconf エディターの起動


下記のいずれかの手順を実施する。

(a) コマンドの実行

/usr/bin/dconf-editor


(b) デスクトップ環境のメニューからの起動


GNOME の場合:
[アプリケーション] -> [システムツール] -> [dconf エディター]


(2) file-chooser の設定の変更

[パス]
/org/gtk/settings/file-chooser/sort-directories-first

[設定値]
True (初期値: False)


PulseAudioの想定外の動作への対応 [Linux]

これまでは主に、PulseAudio ではなく、ALSA を直接使用してきた。
しかし、Firefox 52.x での音声出力のために PulseAudio を使用するように変更した。
(X の起動時に 'pulseaudio --start' を実行する。)

以下は、ALSA から PulseAudio に移行した際に発生した想定外の動作とその対応についてまとめたものである。

1. PulseAudio の起動により HeadPhone への出力が mute される。


(1) 発生事象


PulsuAudio の起動後にヘッドホンへの出力がミュートされる。

・CentOS 7、Debian 9 で発生する。
 pulseaudio-6.0-9.el7_3.x86_64 on CentOS 7
 pulseaudio 10.0-1 on Debian 9

・Debian 8 では発生しない。
 pulseaudio 5.0-13


(2) 対象方法


PulsuAudio の起動後に下記のコマンドを実行する。
(HeadPhone への出力を unmute する。)

% amixer -q [-c 0] sset Headphone unmute

2. PulseAudio 使用時に ALSA 用ミキサーで mute とすると指定外の出力も mute される。


(1) 発生事象


(a) Master/Headphone を mute すると、下記の出力が mute される。


・Master
・Headphone
・PCM
・Front
・Surround
・Center
・LFE


(b) unmute すると、指定した出力のみが unmute される。


mute 状態が残るため、音声出力が得られない状態のままとなる。


(2) 対象方法


(a) ALSA 用のミキサーでは、mute を行わない。


mute は使用せず、Master の volume off を代用する。


(b) ALSA 用のミキサーで mute を行った場合には、下記のコマンドで unmute する。

% amixer -q [-c 0] [-D pulse] sset Master unmute
または
% pactl set-sink-mute 0 0


bashでの配列の使用 [Linux]

Perl スクリプトをシェルスクリプト(bash on Linux) に移植する必要があり、対応を行った。
この過程で、スクリプトの可読性を良くするために配列(連想配列を含む)を使用した。

以下は、備忘録として、配列の使用に関して要点をまとめたものである。

1. 配列 (indexed array)


(1) 変数の宣言


通常の変数の場合と同じである。
・通常は変数の宣言は不要である。
・local により、関数内のローカル変数として宣言することが可能である。


(2) 値の設定


(a) 要素毎の設定

a_demo[0]=a
a_demo[1]=b


(b) 全要素の設定

a_demo=(a b)


(補足)
・空の配列の作成: a_demo=()
・配列の宣言と要素の設定を同時にすることが可能である。
 local a_demo=(a b)


(c) 配列要素の追加

a_demo+=(c)


(3) 値の参照

${#a_demo[*]} ... 要素数
${a_demo[*]} ... 全要素
${a_demo[n]} ... n 個目の要素


(補足)
* の代わりに @ を使用することも可能である。
両者の違いは、通常の変数参照時の "$*" と "$@" の違いと同様である。


2. 連想配列 (associative array、hash)


bash v4 で追加された機能である。
未対応のバージョンでは、エラーとなる。

(1) 変数の宣言


使用する前に、連想配列としての変数の宣言が必要である。

declare -A h_demo


(補足)
関数内で上記の変数宣言を行った場合には、当該関数内でのみ有効となる。
(関数内でのローカル変数となる。)


(2) 値の設定


(a) 要素毎の設定

h_demo[Jan]=1
h_demo[Feb]=2


(b) 全要素の設定

h_demo=([Jan]=1 [Feb]=2)


(補足)
・空の連想配列の作成: h_demo=()
・連想配列の宣言と要素の設定を同時にすることが可能である。
 declare -A h_demo=([Jan]=1 [Feb]=2)


(3) 値の参照

${#h_demo[*]} ... 要素数
${!h_demo[*]} ... 全要素(key)
${h_demo[*]} ... 全要素(value)
${h_demo[key]} ... 特定の要素(key に対応する value)


(補足)
* の代わりに @ を使用することも可能である。
両者の違いは、通常の変数参照時の "$*" と "$@" の違いと同様である。



evalでのコマンド実行時のPIPESTATUSの参照(bash) [Linux]

1. eval でのコマンド実行時の PIPESTATUS の参照(bash)


bash では、PIPESTATUS を参照することにより、パイプラインの途中のコマンドの終了ステータスを取得できる。

% bash -c 'true|false|(exit 2); echo ${PIPESTATUS[@]}'
0 1 2


ほとんどの場合、@ を * に置き換えても同様の結果が得られる($@ と $* の違いと同様)。
しかし、eval でのコマンド実行時には、上記の方法では PIPESTATUS を参照できない。

cmd="command1 | command2 | command3"
eval $cmd
echo ${PIPESTATUS[@]}


このような場合には、下記のようにすることで参照可能である。

cmd="command1 | command2 | command3"
eval "$cmd; STATUS=(\${PIPESTATUS[@]})"
echo ${STATUS[@]}

2. サンプルコードと実行例
% expand -4 demo.sh
#!/bin/bash

exec_cmd() {
    local cmd="$1" test=${2:-0}
    local status=0

    if [ $test = 1 ]; then
        echo $cmd
    else
        eval "$cmd; STATUS=(\${PIPESTATUS[@]})"

        echo "value of \${#STATUS[@]}: ${#STATUS[@]}"
        echo "value of \${STATUS[@]}: ${STATUS[@]}"
        status=${STATUS[0]}
    fi
    echo "status of 1st command: $status"

    return $status
}

log=`basename $0 .sh`.log
exec_cmd "$1 2>&1 | tee $log"

exit $?
% ./demo.sh echo\ aaa
aaa
value of ${#STATUS[@]}: 2
value of ${STATUS[@]}: 0 0
status of 1st command: 0
% echo $?
0
% ./demo.sh aaa
./demo.sh: line 10: aaa: command not found
value of ${#STATUS[@]}: 2
value of ${STATUS[@]}: 127 0
status of 1st command: 127
% echo $?
127

3. 参考情報


cf. https://stackoverflow.com/questions/21878286/how-to-access-the-bash-pipestatus-array-of-an-evald-command



uimの入力ウィンドウのフォント指定 [Linux]

1. 発生事象


uim の入力ウィンドウで想定外のフォントが使用されることがある。
・変換候補、変換確定後のフォントについては想定通りである。
・使用するアプリケーションによっては、上記事象が発生しない場合もある。


2. 対処方法


下記の手順を実施する

(1) 下記の内容で ~/.uim を作成する。

(define uim-xim-use-xft-font? #t)
(define uim-xim-xft-font-name "<font name>")  … フォントの指定


(例) さざなみゴシックの場合
(define uim-xim-xft-font-name "Sazanami Gothic")

(補足)
初期値: ~/.uim.d/customs/custom-xim.scm を参照


(2) X を再起動する。


多分、uim-xim のみの再起動でも反映されると思われる。