事象の水平線

個人的ブックマーク代わりなメモ書きブログ。 地球は丸いよ。↓このへん。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop
SeagateのHDDを数年ぶりに買った。(去年末に)
WDのIntelliParkみたいな機能がついていた。(Seagateは無いと思っていた;;)
MRTGで5分おきにS.M.A.R.T監視(温度だけだけど)してると、Load_Cycle_countがあっという間にとんでもない事になる。
ので、そのIntelliParkみたいなAPMという機能をdisableする方法。

[root@NAS bin]# hdparm -B 255 /dev/sda

/dev/sda:
setting Advanced Power Management level to disabled
APM_level = off
[root@NAS bin]#


おわり。


なんとhdparmで出来るらしい。
<<参考>>
Man page of HDPARM

こんな機能で、カタログスペック上のほんのわずかな消費電力削減のために寿命を削らないでくれ・・・・

スポンサーサイト

PageTop
シェルスクリプトの作法が ちょっと独特で、しょっちゅう上手く動かなくなるので 個人的によく使う書き方とかをメモ。

拡張子には.sh  (ローカルルール)
foo.sh

ファイルの中身
頭におまじない
#!/bin/bash

コメント
# 以下はコメントになる
/* comment */は使えない

行終わり セミコロン
; 有ってもなくてもいい     (phpでよく忘れる。phpはないとだめ)
一行で複数のコマンドを書くときは、 ; で区切って可

クオート   文字列 他の大概の言語と同じ(大して知らないけど)
" " ダブルクオート で 普通の文字列 変数は展開される
' ' シングルクオート で まんま文字列 変数は展開されない
(ただの変数には" " ダブルクオートを付けておいた方が吉)

バッククオート   コマンドが実行された結果に置き換わる
result=`command`
以下は ls -la と同じことになる   ls_result=$(ls) に似てる(後述)違いは謎(ぉぃ
option=-la
output=`ls $option`
echo $output
ネストも可 内側のバッククオートにバックスラッシュ¥をつける
result=`command¥`command¥``

変数  シェルスクリプトは変数の型がないらしい。
変数の定義、代入    代入の際『=』の前後にスペースを入れてはダメらしい
hoge=111
呼び出し方    $をつけるらしい (ややこしい・・・・)
$hoge
しかも、基本的に文字列として扱われるらしいので、 (マジかょ・・・・)
num=1
num=$num + 1
echo $num

の結果が 『1 + 1』 という文字列になるらしい。 (勘弁してください・・・)
これを回避するには
num=1
let num="$num + 1"
echo $num
→cf.四則演算
単純なインクリメンタル
let ++num

特殊な変数
シェルスクリプトに引数を渡すには(コマンドラインオプション)
foo.sh hoge fuga piyo
引数の参照
$1,$2,$3
スクリプト名の参照
$0
引数の数
$#
全ての引数を一度に参照する   違いは謎(ぉぃ
$* もしくは $@
シェルスクリプトのPID(プロセスID)
$$
最後に実行したコマンドのexit値
$?

上の例だと
$0 にはfoo.sh
$1 にはhoge
$2 にはfuga
$3 にはpiyo
$# には3
$* で hoge fuga piyo
$$ にはPIDの数字
$? は普通0か1

配列
配列の定義、代入
array[0]=hoge
array[1]=fuga
array[2]=piyo

もしくは
array=(hoge fuga piyo)
要素の追加
array=("${array[@]}" "hogera")
要素の一部を削除
unset array[1]
配列を削除
unset array
コマンドの実行結果が複数行ある時それをすべて配列に格納
ls_result=$(ls)
配列の参照    $は当然、{}が必須らしい。
${array[2]}
配列を全て参照  各要素を単語として
${array[@]}
配列を全て参照  IFS文字でつなげて一つの文字列で
IFS=";"       Internal Field Separatorらしい よーわからん
echo "${array[*]}"
    " "がないとダメみたい
hoge;fuga;piyo
配列の要素数    #をつけて*を入れるらしい。
${#array[*]}

文字列結合  ただくっつける。『.』とか不用
str=$mojiretu1$mojiretu2

四則演算  exprが必要  演算子の前後にスペースも必要  演算子は普通
a=`expr 5 + 3`
b=`expr 5 - 3`
c=`expr $a + $b`
d=`expr 5 ¥* 3` *はワイルドカードなのでバックスラッシュ¥が必要
e=`expr 5 / 3`
f=`expr 5 % 3`

リダイレクト  ファイルの入出力が驚くほど簡単
ファイルに上書き書き込み   bar.txtにhogehogeと言う文字列を上書きで書き込み
echo "hogehoge" >bar.txt
ファイルに追加書き込み   bar.txtにhogehogeと言う文字列を追記で書き込み(最終行)
echo "hogehoge" >>bar.txt
	echoでタブ改行を表現する方法  -e オプションをつける
echo -e "hello¥tworld¥nhello¥nworld"
キーボードからの入力   キーボードの入力を待って、Enterまでの入力を$LINEに格納
read LINE
ファイルから一行読み込み  foo.txtから一行読み込んで$LINEに格納
read LINE <foo.txt
ファイルを1行ずつ処理
while read LINE
do [処理... $LINE]
done <foo.txt

ファイルの各行を配列に格納 とか
i=0
while read LINE
do array[$i]=$LINE
let ++i
done <foo.txt

パイプ
コマンドの出力をコマンドに入れる
command | command
/homeの.txtファイルのみを表示 とか
ls /home | grep "*.txt"
コマンドの出力を一行ずつ処理
command | while read LINE
do [処理... $LINE]
done

パイプの中はサブシェルでスコープが別⇒パイプの中の変数を外から参照できないらしい
サブシェルで動くというより別スレッドで動く挙動らしい      なにその仕様・・・・
逆手に取ればマルチスレッド動作が簡単に??

制御文
if文  [ ]は本来はtestコマンドの略式らしい [ ]の文字の前後はスペースが必要
if [ 条件式 ]
then
[処理...]
elif [ 条件式 ]
then

[処理...]
else
[処理...]
fi

数値比較
if [ $num1 -eq $num2 ]
演算子意味
-eq== equal
-ne!= not equal
-lt< less than
-le<= less equal
-gt> greater than
-ge>= greater equal
文字列比較
演算子意味
===
!=!=
=~左辺の文字列に右辺のパターンによる部分文字列が含まれるか
!~左辺の文字列に右辺のパターンによる部分文字列以外が含まれるか
ファイル比較
演算子 意味
-ntより新しいnewer than
-otより古いolder than
特殊なオプション
オプション使い方意味
-z [ -z string ] string の文字列長が 0 ならば真
-n [ -n string ] string の文字列長が 0 より大ならば真
-d [ -d file ] file がディレクトリならば真
-e [ -e file ] file が存在するならば真
-f [ -f file ] file が普通のファイルならば真
-s [ -s file ] file が 0 より大きいサイズならば真
-r [ -r file ] file が読み取り可能ならば真
-w [ -w file ] file が書き込み可能ならば真
-x [ -x file ] file が実行可能ならば真
-O [ -O file ] file の所有者ならば真
-G [ -G file ] file の所有者と同じグループに属するならば真


一行if文
target=./hoge.txt
if [ -f $target ]; then rm -f $target ;fi
または
[ -f $target ] && rm -f $target

Like三項演算子(条件? 処理1:処理2;)
[ $hoge = $foo ] && echo "true" || echo "false"

if文の応用 らしい
testコマンドや[ ]の変わりに 他のコマンドを使って条件判定する
if echo $hoge | grep -sq "fuga"
then
~~~

grepは一致するパターンがあればそれを表示して戻り値に0(真)を返す
なければ戻り値に1(偽)を返す
ので、$hoge変数のなかにfugaの文字列があれば真、なければ偽になる
-sqはエラー出力と標準出力を抑制するgrepのオプション

for文
for str in ${array[@]}
do
echo $str
done

なにそのforeach・・・ orz
で、foreachは無いらしい。そらそうだ。
それでも、以下の方法でforっぽくできる らしい。
for (( i = 0; i < ${#array[@]}; ++i ))
do
echo ${array[$i]}
done


while文
i=1
while [ $i -le 5 ]
do
echo "$i"
let ++i
done





参考:
Bashで覚えておくとよいデータ構造 - 配列Add Star
IFS てなに?
if 文と test コマンド
bash のアレコレ
bash,dash,zshのreadコマンドと「while read」のループ処理について
BASHでの変数について
bash 超プログラム術
Bash基礎文法最速マスター
簡素なif文は一行で書く
シェルスクリプト入門 [演算・比較]


シェルスクリプトのデバッグ のヒント @IT
シェルスクリプトの一部分をデバッグするには
シェルスクリプトをデバッグするには
シェルスクリプトの文法チェックを行うには

PageTop
題名そのまんま。サーバーにCentOSを入れて、前から気付いてはいたけど、日本語の並びが変なので何とかしてみたメモ。

ちなみに、CentOSは英語表示で使ってる。
単に、日本語だと、“desktop”とかが、“デスクトップ”とかになって、コマンドラインで入力文字の切り替えがめんどくさい、と以前感じたため。

で、
/etc/sysconfig/i18n

の最終行に

LC_COLLATE="C"

を追加しただけ。

細かいことは参考先をどぞ。

参考
Ubuntuでファイル名のソートがおかしい問題の修正
CentOS(6.0)でロケール関係の設定

PageTop
epgrecのdo-record.shで録画終了時にtsselectを走らせてログにドロップの有無を吐くようにしてあるのですが、クライアントでTSファイルを見ているときにこのタイミングにあたると、ディスクIOを持っていかれてたまーにカクカクなるので、何とかしてみた。メモ。

cgroupというのでグループごとにいろいろと制限をかけれるらしい。
<<参考>>
cgroup でプロセス毎のDisk (block device) へのI/O の帯域制限 blkio.throttle.*
cgroup について理解する - いますぐ実践! Linuxシステム管理 / Vol.228
7.9. cgroupの使用事例
cgroupsによるIO帯域の制限
第3章 サブシステムと調整可能なパラメータ
openSUSE 12.3: 第10章 カーネルのコントロールグループ
2.9. コントロールグループ内のプロセスの開始 - Red Hat Customer Portal

インストール
[root@NAS ~]# yum install -y libcgroup
Loaded plugins: fastestmirror, priorities, refresh-packagekit, security
Loading mirror speeds from cached hostfile
* base: www.ftp.ne.jp
* extras: www.ftp.ne.jp
* rpmforge: ftp.riken.jp
* updates: www.ftp.ne.jp
15 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package libcgroup.x86_64 0:0.37-4.el6 will be updated
---> Package libcgroup.x86_64 0:0.37-7.1.el6 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================
Package Arch Version Repository Size
==============================================================================================
Updating:
libcgroup x86_64 0.37-7.1.el6 updates 111 k

Transaction Summary
==============================================================================================
Upgrade 1 Package(s)

Total download size: 111 k
Downloading Packages:
libcgroup-0.37-7.1.el6.x86_64.rpm | 111 kB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : libcgroup-0.37-7.1.el6.x86_64 1/2
Cleanup : libcgroup-0.37-4.el6.x86_64 2/2
Verifying : libcgroup-0.37-7.1.el6.x86_64 1/2
Verifying : libcgroup-0.37-4.el6.x86_64 2/2

Updated:
libcgroup.x86_64 0:0.37-7.1.el6

Complete!
[root@NAS ~]# ls /cgroup   確認:インストールだけでは何も無いらしい
[root@NAS ~]# chkconfig cgconfig on
[root@NAS ~]# service cgconfig start
Starting cgconfig service: [ OK ]
[root@NAS ~]# ls /cgroup/   確認:サービスを立ち上げることで何かできた
blkio cpu cpuacct cpuset devices freezer memory net_cls
[root@NAS ~]# lssubsys    サブシスの確認:上記と同じだけある
cpuset
cpu
cpuacct
memory
devices
freezer
net_cls
blkio
[root@NAS ~]#


DiskIOの制限
blkio(ブロックアイオー?)で出来るらしい。
[root@NAS ~]# ls /cgroup/blkio   いろいろある
blkio.io_merged blkio.throttle.io_service_bytes blkio.weight_device
blkio.io_queued blkio.throttle.io_serviced cgroup.event_control
blkio.io_service_bytes blkio.throttle.read_bps_device cgroup.procs
blkio.io_serviced blkio.throttle.read_iops_device notify_on_release
blkio.io_service_time blkio.throttle.write_bps_device release_agent
blkio.io_wait_time blkio.throttle.write_iops_device tasks
blkio.reset_stats blkio.time
blkio.sectors blkio.weight

blkio.throttle.read_bps_deviceblkio.throttle.write_bps_device に書き込むことでbpsでDiskIOを制限できる。
書式は Major:Minor 設定値
Major:Minor は
[root@NAS ~]# ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 Jun 19 22:26 /dev/sda
という感じで、ls -l で/dev/sdaが8:0とわかる。らしい。
ちなみに、パーティションが分かれている場合 /dev/sda1 で 8, 1 とかになるが、cgroup側で認識できない場合があるらしい。その場合は/dev/sdaの8:0と全体でやる。らしい。

実験
まだ何も無いことを確認
[root@NAS ~]# cat /cgroup/blkio/blkio.throttle.write_bps_device
/tmpを使う
[root@NAS ~]# df /tmp
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 477615072 406492672 66271500 86% /
[root@NAS ~]# ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 Jun 9 19:30 /dev/sda

まず、制限なしで計測
[root@NAS ~]# time dd if=/dev/zero of=/tmp/ddtest bs=100M count=10
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB) copied, 8.42001 s, 125 MB/s

real 0m8.592s
user 0m0.000s
sys 0m4.419s

キャッシュのフラッシュとかおまじない
[root@NAS ~]# sync
[root@NAS ~]# echo 3 > /proc/sys/vm/drop_caches

10MB/sに制限
[root@NAS ~]# echo "8:0 10487560" > /cgroup/blkio/blkio.throttle.write_bps_device
確認
[root@NAS ~]# cat /cgroup/blkio/blkio.throttle.write_bps_device
8:0 10487560

計測
[root@NAS ~]# time dd if=/dev/zero of=/tmp/ddtest bs=100M count=10
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB) copied, 83.1922 s, 12.6 MB/s

real 1m23.527s
user 0m0.000s
sys 0m5.021s
[root@NAS ~]#
ちょっち速くね?

ちなみに、ディスクIOを確認するのにiostatiotopが便利。
[root@NAS ~]# iostat -xtcm 2
オプションは、拡張表示、更新時間を表示、cpu使用率を表示、MBで表示、2秒更新
<<参考>>
iostat(1) - Linux man page

iotopはtopみたいにIOを表示する。インストールされてなかったので、インストールから
[root@NAS ~]# yum install iotop
使い方
[root@NAS ~]# iotop -u apache
オプションは
-u user
-p pid
<<参考>>
iotop日本語man

また、制限をなくす場合は、0を書き込む
[root@NAS ~]# echo "8:0 0" > /cgroup/blkio/blkio.throttle.write_bps_device
[root@NAS ~]# cat /cgroup/blkio/blkio.throttle.write_bps_device
[root@NAS ~]#

さらに、いくつものデバイスに対して制限を掛ける場合も、ひとつずつ > で書く。
>> でも書けたようだが>が普通みたい。




ただ、これだと一つのデバイスに関わるプロセス全てに制限がかかっているだけなので意味がない。

そこで、プロセスごとに制限をかけるためにグループを作り、そのグループの中のtasksにPIDを入れるとそのプロセスがグループで制限対象になる。らしい。
ディレクトリを作ると、グループが出来るらしい。
[root@NAS ~]# mkdir /cgroup/blkio/test
[root@NAS ~]# ls /cgroup/blkio/
blkio.io_merged blkio.throttle.io_service_bytes blkio.weight_device
blkio.io_queued blkio.throttle.io_serviced cgroup.event_control
blkio.io_service_bytes blkio.throttle.read_bps_device cgroup.procs
blkio.io_serviced blkio.throttle.read_iops_device notify_on_release
blkio.io_service_time blkio.throttle.write_bps_device release_agent
blkio.io_wait_time blkio.throttle.write_iops_device tasks
blkio.reset_stats blkio.time test
blkio.sectors blkio.weight
[root@NAS ~]# ls /cgroup/blkio/test
blkio.io_merged blkio.sectors blkio.time
blkio.io_queued blkio.throttle.io_service_bytes blkio.weight
blkio.io_service_bytes blkio.throttle.io_serviced blkio.weight_device
blkio.io_serviced blkio.throttle.read_bps_device cgroup.event_control
blkio.io_service_time blkio.throttle.read_iops_device cgroup.procs
blkio.io_wait_time blkio.throttle.write_bps_device notify_on_release
blkio.reset_stats blkio.throttle.write_iops_device tasks

[root@NAS ~]# echo "8:0 10485760" > /cgroup/blkio/test/blkio.throttle.read_bps_device
[root@NAS ~]# cat /cgroup/blkio/test/blkio.throttle.read_bps_device
8:0 10485760

以下の書き方をすれば、PIDを渡しながらコマンドを実行できる
cgexec -g subsystems:path_to_cgroup command arguments
[root@NAS ~]# cgexec -g blkio:test command command_arg

もちろん
[root@NAS ~]# command command_arg &
echo $! > /cgroup/blkio/test/tasks
としても実行は可能。
コマンドを走らせて、psでpid調べてechoしても当然可能。

実験は省略(というか、よくわからないけどddだとうまくいかない。なんで?VirtualBox上の外付けUSBHDD(NTFS)でやったときは、ddではなくmountNTFSとかいうプロセスを/cgroup/blkio/test/tasksに入れたらうまく行った。)

cgroupがリスタートすると作ったグループ(フォルダ)は消えるので(たぶん)
/etc/cgconfig.conf に設定を書いておけば、cgroupサービスが走るたびにグループの設定が勝手に出来る。みたい。
/dev/sdbに50MB/sのreadcapをかけたグループを作り、do-record.shでcgexecを使ってtsselectを呼び出してみた。
[root@NAS ~]# vi /etc/cgconfig.conf
#
# Copyright IBM Corporation. 2007
#
# Authors: Balbir Singh
# This program is free software; you can redistribute it and/or modify it
# under the terms of version 2.1 of the GNU Lesser General Public License
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# See man cgconfig.conf for further details.
#
# By default, mount all controllers to /cgroup/

mount {
cpuset = /cgroup/cpuset;
cpu = /cgroup/cpu;
cpuacct = /cgroup/cpuacct;
memory = /cgroup/memory;
devices = /cgroup/devices;
freezer = /cgroup/freezer;
net_cls = /cgroup/net_cls;
blkio = /cgroup/blkio;
}

group sdb_readcap50MB {
blkio {
blkio.throttle.read_bps_device="8:16 52428800";
}
}


[root@NAS ~]#

do-record.shには適度にコマンドを埋め込んた。
tsselece.shはtsselectで適度にログを吐くようにスクリプトを書いてある。
sudo cgexec -g blkio:sdb_readcap50MB /usr/local/bin/tsselect.sh ${file}
cgexec はsudoが必要らしい。※visudo忘れずに。
tsselect.shの中でtsselectを呼んでいるが、ターミナル上ではフルパスじゃなくても動いたのに、スクリプトでcgexecからだとフルパスじゃないと動かない。何故かわからないが、まぁ、環境変数の絡みなんだろう・・・めんどいので調べてない。
cgexec.png
制限がかかってる様子。上がiostat -xcm 2 下はiotop
制限なしだと100MB/sとか120MB/sとか出てる
クライアントで2倍速くらいで見ててもカクカクしなくなって満足。

PageTop
自分用ブックマーク的メモ書き
参考HPの丸パクリ
<<参考>>
CentOS mozcをインストールする方法

Mozc とは、 Google IME のオープンソース版
http://code.google.com/p/mozc/


リポジトリを追加する


$ wget http://download.opensuse.org/repositories/home:/sawaa/CentOS_CentOS-6/home:sawaa.repo
$ su
# cp home:sawaa.repo /etc/yum.repos.d/sawaa.repo
# rm home:sawaa.repo



インストール

$ su
# yum -y install ibus-mozc


あとは、Gnomeから システム > 設定 > 入力メソッド でibusを使用
メニューバーにアイコンが出てくるので色々いじる。

おわり。

PageTop
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。