iptables のログで dmesg を埋めないよう ulogd 経由で syslog に

iptablesのログ出力でdmesgが埋め尽くされると困るので、NFLOGエクステンションを用いて、ulogd経由でsyslogにログを吐くようにしてみた

/etc/ulogd.conf

[global]
logfile="/var/log/ulogd.log"
loglevel=5
rmem=131071
bufsize=150000

plugin="/usr/lib/ulogd/ulogd_inppkt_NFLOG.so"
plugin="/usr/lib/ulogd/ulogd_inpflow_NFCT.so"
plugin="/usr/lib/ulogd/ulogd_raw2packet_BASE.so"
plugin="/usr/lib/ulogd/ulogd_filter_IP2STR.so"
plugin="/usr/lib/ulogd/ulogd_filter_PRINTPKT.so"
plugin="/usr/lib/ulogd/ulogd_output_LOGEMU.so"
plugin="/usr/lib/ulogd/ulogd_filter_IFINDEX.so"
plugin="/usr/lib/ulogd/ulogd_output_SYSLOG.so"

stack=log1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU
stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,sys1:SYSLOG

[log1]
group=1

[log2]
group=2
numeric_label=1

[emu1]
file=/var/log/ulogd.syslogemu

iptablesの-j LOGな設定も以下のように変更

/bin/iptables -A KZ_DENY -j NFLOG --nflog-prefix="[Kazakhstan] " --nflog-group 2

今回はgroup2としてsyslogで吐かせているが、そこは自由にするとよいだろう

rsync コマンドの append オプションを resume に使うのは危ない

rsync  には--appendオプションがありますが、3.0.0からは挙動が変わっているようで、 append の動作を高速化するためにchecksumを取らなくなったようです。

3.0.0より前の --append と同じような挙動が必要な場合は、 --append-verify を使っておかないと、とてもひどい目にあうでしょう。

ですが、そもそも --append オプションは名前の通り追記するためのものであり、いろんなサイトで見かけるようなファイル転送のレジュームとは直接関係なく、不用意に使ってはいけません。

 

以下はrsyncのmanより

The use of --append can be dangerous if you aren't 100% sure that the files that are
longer have only grown by the appending of data onto the end. You should thus use
include/exclude/filter rules to ensure that such a transfer is only affecting files
that you know to be growing via appended data.

CentOS Source Repository


* CentOSのソースパッケージは http://vault.centos.org にあります
* CentOS上でソースパッケージを取得したいときは、yum-utilsパッケージに含まれる yumdownloaderを使うのが便利です
*
[base-src]
name=CentOS-6.6 - Base - Source
baseurl=http://vault.centos.org/6.6/os/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[updates-src]
name=CentOS-6.6 - Updates - Source
baseurl=http://vault.centos.org/6.6/updates/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[extras-src]
name=CentOS-6.6 - Extras - Source
baseurl=http://vault.centos.org/6.6/extras/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

* yumdownloader –source httpd

zfs on linux


==== zpoolにくべるデバイス名について ====
* /dev/disk/by-id/* にしておくのが吉
* /dev/sdc とかでやってると、デバイス名が変わった時に悲しい思いをします
==== 付け替えたい場合 ====
*
$ sudo zpool export tank
$ sudo zpool import -d /dev/disk/by-id tank

directory quota on xfs filesystem


====== XFSファイルシステムにて、ディレクトリに対してQuota制限をかけたときのメモ ======
* XFSファイルシステムはディレクトリ単位でQuotaを設定することができます
* プロジェクトクォータというもので設定します
* プロジェクトクォータはグループクォータと同時に使用することはできません
* 設定
* ファイルシステムを pquotaオプション付きでマウントします
* /etc/projects と /etc/projid で マッピングを行います
* /etc/projects50:/data
* /etc/projidvirtual:50
* 次のように、同じProjectIDをもつものも設定できるようです50:/data/test1
50:/data/test2

* Grace Periodは次のように設定しますxfs_quota -x -c 'timer -p -b 1minutes'
* minutes(m), hours(h), days(d), weeks(w) を認識します
* Projectを設定しますxfs_quota -x -c 'project -s virtual'
* Project virtualに、使用量Quotaを設定
xfs_quota -x -c 'limit -p bsoft=1000m bhard=1200m virtual' /data

* 確認
* quota設定状態の出力[root@rc97 data]# xfs_quota -x -c 'state' /data
User quota state on /data (/dev/mapper/vg0-lv0)
Accounting: OFF
Enforcement: OFF
Inode: #18446744073709551615 (0 blocks, 0 extents)
Group quota state on /data (/dev/mapper/vg0-lv0)
Accounting: OFF
Enforcement: OFF
Inode: #131 (2 blocks, 2 extents)
Project quota state on /data (/dev/mapper/vg0-lv0)
Accounting: ON
Enforcement: ON
Inode: #131 (2 blocks, 2 extents)
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

* ユーザーコマンドでの確認[root@rc97 test2]# xfs_quota -c 'quota -v -p virtual' /data
Disk quotas for Project virtual (50)
Filesystem Blocks Quota Limit Warn/Time Mounted on
/dev/mapper/vg0-lv0 8 51200 102400 00 [--------] /data

* リポートを出力[root@rc97 data]# xfs_quota -x -c 'report -p' /data
Project quota on /data (/dev/mapper/vg0-lv0)
Blocks
Project ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
virtual 0 51200 102400 00 [--------]

* 使用量はsyncされてないと出力に反映されないようですね
* xfs_quotaコマンド
* -x で エキスパートモード
* 例: xfs_quota -x -c 'report -h' /data
* project -c (Checking)
* project -C (Clearing)
* project -s (Setting)

docker 0.7.2


* docker 0.7.2 がリリースされました
* https://github.com/dotcloud/docker/blob/master/CHANGELOG.md
* 以下の変更がはいったそうなので、追いかけてみました
* Drop capabilities from within dockerinit
* https://github.com/dotcloud/docker/pull/3015
* Set hostname and IP address from within dockerinit
* https://github.com/dotcloud/docker/pull/3201
* いままで、config.lxcで行っていた、Linux Capabilityのdropを、dockerinitで行うようになったようです。lxcのテンプレートからCapabilityの設定が消え、dockerinitコマンド内部でcapabilityのdropが行われるようになりました。
* それに伴い、ネットワークの設定とホスト名の設定も、dockerinitで行うようになったようです。dockerinitに引数でわたすようになりました。
* container.go

// Networking
if !container.Config.NetworkDisabled {
network := container.NetworkSettings
params = append(params,
"-g", network.Gateway,
"-i", fmt.Sprintf("%s/%d", network.IPAddress, network.IPPrefixLen),
)
}

OpenStackのKVMインスタンスにマウント出来るVolume数について


* 検証中のOpenStackのKVM InstanceにどれだけVolumeがAttachできるか調べてみたところ、/dev/vda から /dev/vdaa の 27個で頭打ちだった
* nova volume-attachコマンドでそれ以上attachしても特にエラーは帰ってこないが、実際にはInstanceにAttachされておらず、nova-compute.logにはlibvirtError: internal error No more available PCI addressesと吐き出されている
* そのInstance上でlspciしてみたらこんな感じ
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Ethernet controller: Red Hat, Inc Virtio network device
00:04.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:05.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:06.0 RAM memory: Red Hat, Inc Virtio memory balloon
00:07.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:08.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:09.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:0a.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:0b.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:0c.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:0d.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:0e.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:0f.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:10.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:11.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:12.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:13.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:14.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:15.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:16.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:17.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:18.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:19.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:1a.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:1b.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:1c.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:1d.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:1e.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:1f.0 SCSI storage controller: Red Hat, Inc Virtio block device

* PCIのデバイス番号は0x00 – 0x1fまでなので、それにあたってるのねー
* ついでにQemuのPCIについてみておく
* hw/pci/pci.c
* PCIは[[:]:].という感じに表記される
/*
* Parse [[:]:], return -1 on error if funcp == NULL
* [[:]:]., return -1 on error
*/
int pci_parse_devaddr(const char *addr, int *domp, int *busp,
unsigned int *slotp, unsigned int *funcp)
{

* domainは0以外はうけつけない – PCIBus *pci_get_bus_devfn(int *devfnp, PCIBus *root, const char *devaddr)
if (dom != 0) {
fprintf(stderr, "No support for non-zero PCI domains\n");
return NULL;
}

* bus,slot,funcの値についての制限
if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7)
return -1;

* さて、QemuでPCIバスを増やすことはできるんだろうか?

docker 0.7


* lxcを便利に使用できるdockerの0.7がでていますね。
* 0.7からは aufs以外でも使えるようになりました。
* ストレージドライバは aufs, devicemapper, vfsの順にプライオリティがつけられているようです
* graphdriver/driver.go
var (
DefaultDriver string
// All registred drivers
drivers map[string]InitFunc
// Slice of drivers that should be used in an order
priority = []string{
"aufs",
"devicemapper",
"vfs",
}
)

* ストレージドライバは、環境変数 DOCKER_DRIVERを設定することで切り替えることができるようですexport DOCKER_DRIVER=vfs

* devicemapper利用時のサイズは以下のように定義されているようです
*graphdriver/devmapper/deviceset.go
var (↲
»---DefaultDataLoopbackSize int64 = 100 * 1024 * 1024 * 1024↲
»---DefaultMetaDataLoopbackSize int64 = 2 * 1024 * 1024 * 1024↲
»---DefaultBaseFsSize uint64 = 10 * 1024 * 1024 * 1024↲
)↲

* devicemapperで作られるvolumeは以下の感じで作られるようです
// This is the programmatic example of "dmsetup create"↲
func createPool(poolName string, dataFile, metadataFile *osFile) error {↲
»---task, err := createTask(DeviceCreate, poolName)↲
»---if task == nil {↲
»---»---return err↲
»---}↲

»---size, err := GetBlockDeviceSize(dataFile)↲
»---if err != nil {↲
»---»---return fmt.Errorf("Can't get data size")↲
»---}↲

»---params := metadataFile.Name() + " " + dataFile.Name() + " 128 32768"↲
»---if err := task.AddTarget(0, size/512, "thin-pool", params); err != nil {↲
»---»---return fmt.Errorf("Can't add target")↲
»---}↲

»---var cookie uint = 0↲
»---if err := task.SetCookie(&cookie, 0); err != nil {↲
»---»---return fmt.Errorf("Can't set cookie")↲
»---}↲

»---if err := task.Run(); err != nil {↲
»---»---return fmt.Errorf("Error running DeviceCreate (createPool)")↲
»---}↲

»---UdevWait(cookie)↲

»---return nil↲
}↲

* data_block_size 128
* low_water_mark 32768

* thin-provisioning.txtによるとUsing an existing pool device
-----------------------------

dmsetup create pool \
--table "0 20971520 thin-pool $metadata_dev $data_dev \
$data_block_size $low_water_mark"

$data_block_size gives the smallest unit of disk space that can be
allocated at a time expressed in units of 512-byte sectors. People
primarily interested in thin provisioning may want to use a value such
as 1024 (512KB). People doing lots of snapshotting may want a smaller value
such as 128 (64KB). If you are not zeroing newly-allocated data,
a larger $data_block_size in the region of 256000 (128MB) is suggested.
$data_block_size must be the same for the lifetime of the
metadata device.

$low_water_mark is expressed in blocks of size $data_block_size. If
free space on the data device drops below this level then a dm event
will be triggered which a userspace daemon should catch allowing it to
extend the pool device. Only one such event will be sent.
Resuming a device with a new table itself triggers an event so the
userspace daemon can use this to detect a situation where a new table
already exceeds the threshold.
とのことなので、最初に設定したThin-pool 100GBのうち、容量が32768 * (512*512)Byte = 8MBytes を切ると、拡張がされるように思います(動作は未確認)
* このあたりは決め打ちで変更はできないようですね

grub2のgrub-mkconfigにlabelベースな設定を書かせるメモ


* 2013/08/18 挙動がかわったようなので更新しました
* /etc/grub/10_linux
--- 10_linux.backup 2013-06-21 02:20:47.436531219 +0900
+++ 10_linux 2013-06-22 18:53:47.000000000 +0900
@@ -136,8 +136,6 @@
fi

message="$(gettext_printf "Loading Linux %s ..." "${version}")"
+ auto_label="`e2label ${GRUB_DEVICE} 2>/dev/null`"
+ linux_root_device_thisversion="LABEL=${auto_label}"
sed "s/^/$submenu_indentation/" << EOF echo '$message' linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}

* /usr/share/grub/grub-mkconfig_lib
--- grub-mkconfig_lib.backup 2013-06-21 02:35:50.038459949 +0900
+++ grub-mkconfig_lib 2013-06-22 18:53:46.000000000 +0900
@@ -146,22 +146,20 @@
done
fi

- # If there's a filesystem UUID that GRUB is capable of identifying, use it;
- # otherwise set root as per value in device.map.
- fs_hint="`"${grub_probe}" --device "${device}" --target=compatibility_hint`"
- if [ "x$fs_hint" != x ]; then
- echo "set root='$fs_hint'"
- fi
- if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then
- hints="`"${grub_probe}" --device "${device}" --target=hints_string 2> /dev/null`" || hints=
- echo "if [ x\$feature_platform_search_hint = xy ]; then"
- echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
- echo "else"
- echo " search --no-floppy --fs-uuid --set=root ${fs_uuid}"
- echo "fi"
- fi
+# # If there's a filesystem UUID that GRUB is capable of identifying, use it;
+# # otherwise set root as per value in device.map.
+# fs_hint="`"${grub_probe}" --device "${device}" --target=compatibility_hint`"
+# if [ "x$fs_hint" != x ]; then
+# echo "set root='$fs_hint'"
+# fi
+# if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then
+# hints="`"${grub_probe}" --device "${device}" --target=hints_string 2> /dev/null`" || hints=
+# echo "if [ x\$feature_platform_search_hint = xy ]; then"
+# echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
+# echo "else"
+# echo " search --no-floppy --fs-uuid --set=root ${fs_uuid}"
+# echo "fi"
+# fi
+auto_label="`e2label "$@" 2>/dev/null`"↲
+echo "search --no-floppy --label ${auto_label} --set root"↲
}

grub_get_device_id ()