Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2009-03-25 (Wed)

gitの中央repos運用時のパーミッションの調整

gitで、bareな中央reposにpushしたい。

使うプロトコルは:

  • http:// は遅いのでいや
  • git:// はgit-daemon的に認証がちょっとやわそうなのでいまいち
    • いい方法があったら教えてください><
  • pushする人らはsshアカウントがあるので、git+ssh:// でいいや

複数ユーザがpushするので、パーミッションに気を使わなければならない:

  • 共通のグループ(例:sandbox)に属させて、chown -R root:sandbox sandbox.git; chmod -R g+w sandbox; find sandbox -type d|xargs chmod 2775 すればグループの統一はOK
  • 問題は sandbox.git/objects/ 下とかに新規で作られるディレクトリのパーミッション
    • ~/.bashrcでumask 002すればいいんだけど、皆がしてくれるとは限らない。

と思って、git-init を見たらこんなのが

    • shared[={false|true|umask|group|all|world|everybody|0xxx}]

...

group (or true): Make the repository group-writable, (and g+sx, since the git group may be not the primary group of all users).

git-init(1)

git-initの--shareは、core.sharedRepository だそうなので、bare reposなsandbox.git/configの[core]セクションにsharedRepository = groupを追加したら、(ユーザのumaskの設定に依らずに)ちゃんと 2775 なディレクトリが作られるようになりましたとさ。Enjoy!

2009-03-18 (Wed)

コマンドのオプションが覚えられない人へ

オプション覚えられないのでbashのcompletionで補完候補に出てくるようにしてます。

候補に出てくるオプションは網羅しているわけじゃなくて、自分が使うのだけしか対応してませんが、

  • daemontools関連: daemonup, daemondown, taitailf, tailess
  • gisty
  • openssl
  • xen: xm
  • FreeIPMI: ipmi-sensors, ipmiconsole, ipmiping, ipmipower, bmc-config
  • Tokyo Cabinet: tchmgr

のcompletion定義をgistにコピペったのでよかったらどうぞ。

2009-03-17 (Tue)

SoM的なもの

UNIX上でコマンドを実行することにより、Windows上でファイルを開いたりブラウザでURLにアクセスしたりできるSoWというツールがあります。

最近はWindowsマシンがなくなって、LinuxとMacを使っているので、似たような機能を持つsomという名のシェル関数を作って使っていたのですが、

Macのターミナルから便利な感じにsambaのボリュームとかをマウントできるコマンドを作った

Macで便利に使えるマウントコマンド作った - hitode909の日記

というエントリを見て、オッと思ったのでsomをちょっと作り直しました。

こんなシェル関数です。

# export SOM_SRC_URL=smb://goa/hirose31
# export SOM_SRC_DIR=/home/hirose31
# export SOM_MAC_DIR=/Volumes/hirose31
# export SOM_MAC_HOST=coupe
som() {
  obj= # file, dir, URL
  if [ $# -eq 0 ]; then
    obj=. # open current dir
  else
    obj="$1"
  fi
  if [ -e "$obj" -o -d "$obj" ]; then
    cmd="~/bin/fmount ${SOM_SRC_URL} && open $(readlink -f ${obj} | sed -e "s@${SOM_SRC_DIR}@${SOM_MAC_DIR}@")"
  elif [[ "$obj" =~ ^http:// ]]; then
    cmd="open $obj"
  else
    echo "unknown object: $obj" 1>&2
    return 1
  fi

  echo $cmd
  ssh $SOM_MAC_HOST "$cmd"
}

~/bin/fmountは先のid:hitode909さんのエントリのをシェルスクリプトにしたもの。

変数 SOM_* はお使いの環境にあわせてセットしてください。試してませんが、Netatalkんときはafp://にすればいけると思います。

これで、Linuxのターミナルで

  • som work/gyoza-no-yakikata.pdf を実行するとMacでファイルを開く
  • som work/ を実行するとFinderでそのディレクトリを開く
  • som http://www.irori.org を実行するとブラウザでそのURLにアクセス

します。

メールはLinuxのWanderlustで読んでいるんで、添付ファイルを開くときとかに諜報してます。

Enjoy!

2009-03-13 (Fri)

chroot に関する備忘録

家に携帯を忘れたり、定期が切れててチャージが減り続けているのに気がつかなかったりしたとき、ふと空を見上げて気分を晴らしたいという需要があります。

例えばこんな感じの chroot する用のディレクトリ newroot があるとして、

(busyboxはstaticリンクしたものです)

# ls -lR newroot
newroot:
total 4K
drwxrwxr-x 2 root root 4096 Mar 13 17:52 bin

newroot/bin:
total 1944K
-rwxr-xr-x 1 root root 1984568 Mar 13 17:53 busybox
lrwxrwxrwx 1 root root       7 Mar 13 17:49 ls -> busybox
lrwxrwxrwx 1 root root       7 Mar 13 17:49 sh -> busybox

newroot に chroot してみます。

# pwd
/home/hirose31/work/chroot

# perl -e " chroot './newroot'; exec '/bin/sh' "
\$

そして上を見てみます。

\$ ls /
bin
\$ ls /../
bin
\$ ls ../
Dyna  Loader  libc.so  newroot

おお。明日はいい日になりそうです。

教訓

chroot(2)のmanにも書いてありますが、chroot はカレントワーキングディレクトリは変更しないので、chroot するときは忘れず chdir しましょう。

# perl -e " chroot './newroot'; chdir '/';  exec '/bin/sh' "
もしくは
# perl -e " chdir './newroot';  chroot '.'; exec '/bin/sh' "

あわせて読みたい

chroot + chdir しても、root 権限を持ったままだと chroot 環境から脱獄できてしまうので、なるはやで setuid(2), setgid(2) して root 権限を手放しましょう。

よい週末を!

2009-03-11 (Wed)

rsyncで親ディレクトリは除外してあるサブディレクトリ下だけコピーしたい

具体的にいうと、

mkdir workdir && cd workdir && {
  mkdir -p to from/{dev/{disk,.static},usr}
  touch from/{ichi,usr/nii}  from/dev/{foo,disk/bar,.static/baz}
}

なファイル/ディレクトリがあるときに、

rsync_exclude_me() {
  cat <<EOEXCLUDE
/proc/*
/sys/*
...(snip)...
EOEXCLUDE
}
rsync_exclude_me | \
  rsync -auv --delete --exclude-from=- from/ to/

な感じで from と to を同期コピーしたいいんだけど、

  • dev/* の下は dev/.static/* だけコピーしたい

というときにどうすればいいか。

さっき mkdir, touch したやつだと、

  • ichi
  • dev/.static/baz
  • usr/nii

だけコピーしたい。

回答はこのあとすぐ! 続きが読みたい人はブコメで「おうっふおうっふ」!

続きを読む

mod_log_rotate がよさげかも

で紹介されていた mod_log_rotate がよさげです。

ドキュメントには書いてない(と思う)んですが、CustomLogのファイル名にstrftimeの書式指定が使えるようになります。

ついでに、rotatelogs より cronolog の方がフットプリントが小さそうなので、ErrorLogはcronologを使うようにしてみました。

before

ErrorLog  "|/usr/local/bin/rotatelogs /var/log/httpd/irori.org/www.err.%Y-%m-%d  86400 +540"
CustomLog "|/usr/local/bin/rotatelogs /var/log/httpd/irori.org/www.acc.%Y-%m-%d  86400 +540" full env=!nologging

after

ErrorLog  "|/usr/bin/cronolog /var/log/httpd/irori.org/www.err.%Y-%m-%d"
CustomLog "/var/log/httpd/irori.org/www.acc.%Y-%m-%d" full env=!nologging

なんということでしょう

CustomLogの数ぶんだけプロセスが減ったのと、メモリ使用量が ErrorLogの数×(rotatelogs - cronolog) のぶんだけ減りました。

エコ。

2009-03-09 (Mon)

すごいすごいです busybox

busyboxはバージョン0.XXの頃にちょっと触ったぐらいで、あとはディストリのパッケージのを使うぐらいでドキュメントもろくに読んでなかったんで、機能縮小版のコマンド詰め合わせぐらいにしか思ってませんでした。

が、今回、故あってちょっと調べてビビったのでメモります。

コマンドがイッパイ

最新の1.13.3のドキュメントから抜粋します。

[, [[, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, 
basename, bbconfig, bbsh, blkid, brctl, bunzip2, busybox, bzcat, 
bzip2, cal, cat, catv, chat, chattr, chcon, chgrp, chmod, chown, 
chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, 
cpio, crond, crontab, cryptpw, cttyhack, cut, date, dc, dd, 
deallocvt, delgroup, deluser, depmod, devfsd, devmem, df, 
dhcprelay, diff, dirname, dmesg, dnsd, dos2unix, dpkg, dpkg_deb, 
du, dumpkmap, dumpleases, e2fsck, echo, ed, egrep, eject, env, 
envdir, envuidgid, ether_wake, expand, expr, fakeidentd, false, 
fbset, fbsplash, fdflush, fdformat, fdisk, fgrep, find, findfs, 
fold, free, freeramdisk, fsck, fsck_minix, ftpget, ftpput, fuser, 
getenforce, getopt, getsebool, getty, grep, gunzip, gzip, halt, 
hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, 
hwclock, id, ifconfig, ifdown, ifenslave, ifup, inetd, init, 
inotifyd, insmod, install, ip, ipaddr, ipcalc, ipcrm, ipcs, 
iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, 
killall5, klogd, lash, last, length, less, linux32, linux64, 
linuxrc, ln, load_policy, loadfont, loadkmap, logger, login, 
logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, 
lzmacat, makedevs, makemime, man, matchpathcon, md5sum, mdev, 
mesg, microcom, mkdir, mke2fs, mkfifo, mkfs_minix, mknod, mkswap, 
mktemp, modprobe, more, mount, mountpoint, msh, mt, mv, nameif, 
nc, netstat, nice, nmeter, nohup, nslookup, od, openvt, parse, 
passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, 
pivot_root, pkill, popmaildir, poweroff, printenv, printf, ps, 
pscan, pwd, raidautorun, rdate, rdev, readahead, readlink, 
readprofile, realpath, reboot, reformime, renice, reset, resize, 
restorecon, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, 
run_parts, runcon, runlevel, runsv, runsvdir, rx, script, sed, 
selinuxenabled, sendmail, seq, sestatus, setarch, setconsole, 
setenforce, setfiles, setfont, setkeycodes, setlogcons, 
setsebool, setsid, setuidgid, sh, sha1sum, showkey, slattach, 
sleep, softlimit, sort, split, start_stop_daemon, stat, strings, 
stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, 
sync, sysctl, syslogd, tac, tail, tar, taskset, tc, tcpsvd, tee, 
telnet, telnetd, test, tftp, tftpd, time, top, touch, tr, 
traceroute, true, tty, ttysize, tune2fs, udhcpc, udhcpd, udpsvd, 
umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, 
unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, 
watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip

cat, rm, lsあたりの定番コマンドのほかに、ネットワーク系のコマンド: arp, arping, brctl, ifenslave, nameif, nc, ping, nslookup, vconfig, wgetとかあるし、なんでかdnsd, httpd, telnetd, tftpd, udhcpd, lpd, runitとかdaemonの類いもあったりします。すげーすげー

standalone

initramfsの中の/init (shスクリプト)の中でなにげにawkとかsedとか使ってみたら、/bin下とかには存在しないのに使えちゃったので、あーきっとbusyboxなんだろうなーぐらいに思ってたんですが、今回ちょっと調べてみました。

busyboxでコマンドを実行するには、busyboxにつづけてコマンド名を指定する

$ ./busybox awk
BusyBox v1.13.3 (2009-03-09 18:40:49 JST) multi-call binary

Usage: awk [OPTION]... [program-text] [FILE...]
(snip)

か、コマンド名のsymlinkをはります。

$ ln -s busybox awk
$ ./awk
BusyBox v1.13.3 (2009-03-09 18:40:49 JST) multi-call binary

Usage: awk [OPTION]... [program-text] [FILE...]
(snip)

で、も1こ方法があって、

make menuconfig でこんな感じで設定して make して、

  • Busybox Settings ->
    • General Configuration ->
      • [*] exec prefers applets ←これを選択
  • Shells ->
    • [*] Standalone shell ←これを選択

できあがったbusyboxを使って、

$ busybox sh

なふうに起動したシェルでは、PATHより優先してbusyboxが持ってるコマンドが優先されるようになります。/bin/下とかのコマンドはフルパスを指定すれば実行できます。

ただ、busybox shする時点で /proc/ がマウントされていないとダメっぽいです。なのでinitなんかで、/procをマウントする前や終盤で-o moveしたあとは注意です。

gzippedなモジュールをロードできるmodprobe

@hirose31 ./busybox modprobe kvm ってやったら普通に成功しました@busybox-1.13.2。

Sadayuki Furuhashiさんのツイート: "@hirose31 ./busybox modprobe kvm ってやったら普通に成功しました@busybox-1.13.2。"

がきっかけで調べてみたところ、

  • Archival Utilities ->
    • [*] Make tar, rpm, modprobe etc understand .gz data

gzip -9 hoge.ko した hoge.ko.gz をロードできるmodprobeが手に入ります。

gzip以外にも、設定次第で lzma, bz2, Z を展開できるようになるようです。

ちなみに、module-init-tools の modprobe も ./configure で

  • --enable-zlib Handle gzipped modules

というのがあるので、これをenaればロードできるようになるんじゃないかと思います。

あるあるおハマり大事典 - Linuxの最近のkernelだとMACアドレス由来のグローバルアドレスだと通信できない気がするけど気のせいかもしれない

具体的にいうと、フレッツ・ドットネットを契約している2拠点で、それぞれMACアドレス由来のEUI64なグローバルアドレスだと通信(ping6とかssh -6とか)できない。できないっていっても拠点間の全ノードができないわけじゃなくて、通信できるノードもあったりするんでまたよくわからない。。。

なんか全然関係ないところでポカしてるかもしれないんですが、最近のLinux kernel (といっても古い方だと2.6.24とかですが) だとこうなるような気がするんですけど、ろくに調べてもいないので 2% ぐらいしか自信ないです。

で、どうしているかというと、sysctlで自動設定をオフにして、

net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.all.autoconf     = 0
net.ipv6.conf.lo.autoconf      = 0
net.ipv6.conf.eth0.autoconf    = 0

/etc/network/interfaces でオレオレなIPv6アドレスをつけつつ MAC アドレス由来のを削除しています。ソースアドレスの絡みと思うんですが、ip -6 route だと src 指定しても効かなかったんで削除ってます。

iface eth0   inet6 static
  address    2001:XXXX:YYYY:ZZZZ::25
  netmask    64
  up ip addr del 2001:XXXX:YYYY:ZZZZ:222:19ff:fe08:2b66/64 dev eth0

2009-12-07 追記

を読んで、MACアドレス由来の方のアドレスが選択されないように、そのlabelを変えました。

iface eth0   inet6 static
  address    2001:XXXX:YYYY:ZZZZ::25
  netmask    64
  up ip -6 addrlabel add prefix 2001:XXXX:YYYY:ZZZZ:222:19ff:fe08:2b66/128 label 99

これで、宛先アドレスとlabelが等しい2001:XXXX:YYYY:ZZZZ::25がソースアドレスとして選択されるようになりました。

id:nabekenta さん、ありがとうございましたー

2009-03-08 (Sun)

カレー充

14:23 まめ蔵@吉祥寺のやさいカレー

f:id:hirose31:20090307142323j:image:w168:left

予想外に並んで待たされておなかがぺっこり。


17:42 リトルスパイス@吉祥寺のキーマカレー

f:id:hirose31:20090307175220j:image:w168:left

いよっしハシゴするZEEEって行ってみたら土日は16:30からの営業だそうな。ふぇ。

しかたないので、若人の街ジョージで買い物をしたり携帯の電池がなくなったのでヨドバシで充電したりして開店まで時間をつぶす。


f:id:hirose31:20090307174202j:image:w168:left

カレーは何種類かあるんだけど、具のトッピングでメニュー分けしてるんじゃなくて、どれも別々な調理法で作ってるそうでほかのメニューもたべてみたくなった。

マトンとかクリームチキンカレーもおいしそうだったぁなぁ (^q^)


21:37 クマリ@阿佐ヶ谷のチキン・ティッカ・マサラ (3辛)

f:id:hirose31:20090307213731j:image:w168:left

久々のクマリ。うめーうめー!

知人のクマラーからパラックマッシュルームをお勧めされたので次はパラックパニールにしたいと思います( ゜3゜)


23:51 カップヌードル カレー

f:id:hirose31:20090307235134j:image:w168:left

〆はカップヌードルで。


2009-03-07 (Sat)

nanoa.cgiというのをurlに入れたくない → RewriteRuleでやってみる

RewriteRule ^(.*)$ /~danjou/nanoa/nanoa.cgi/$1 [PT]

Soffritto::Journal

自分はこんな感じでやってます。

RewriteRule ^/(pasteme)/([[:alnum:]-]+)  /nanoa/nanoa.cgi/$1/?id=$2 [PT]
RewriteRule ^/(pasteme|qrcode)/?$        /nanoa/nanoa.cgi/$1/ [PT]
  • /pasteme/ を /nanoa/nanoa.cgi/pasteme/ にマップ
  • /pasteme/PASTE_ID を /nanoa/nanoa.cgi/pasteme/?id=PASTE_ID にマップ
  • /qrcode/ を /nanoa/nanoa.cgi/qrcode/ にマップ

あと、uri_forはオーバーライドってます。

sub rewrited_uri_for {
    my ($app, $path, $query) = @_;
    $path = '/' . $path;
    if (my $id = delete $query->{id}) {
        $path = $path . $id;
    }
    $query = undef unless keys %$query;
    return $app->SUPER::uri_for($path, $query);
}
*uri_for = \&rewrited_uri_for;

2009-03-02 (Mon)

あるあるおハマリ大事典 - mod_perl がコンパイルできない→解決済

LinuxApache-2.2.11 + mod_perl-2.0.4 にて。

cc (snip) -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -I/usr/lib/perl/5.8/CORE -DMOD_PERL -DMP_COMPAT_1X -DLINUX=2 -O2 -fPIC \
        -c modperl_xsinit.c && mv modperl_xsinit.o modperl_xsinit.lo
modperl_xsinit.c: In function 'xs_init':
modperl_xsinit.c:30: error: 'my_perl' undeclared (first use in this function)
modperl_xsinit.c:30: error: (Each undeclared identifier is reported only once
modperl_xsinit.c:30: error: for each function it appears in.)
modperl_xsinit.c:30: warning: passing argument 3 of 'Perl_newXS' from incompatib
le pointer type
make[1]: *** [modperl_xsinit.lo] Error 1

エラる。自分のマシンだけエラる。ほかのマシンは問題ない。

src/modules/perl/modperl_xsinit.c を比較してみると、

--- modperl_xsinit.c    2009-03-02 12:38:16.000000000 +0900
+++ modperl_xsinit.c_dame        2009-03-02 12:43:06.000000000 +0900
(snip)
-EXTERN_C void xs_init (pTHX);
(snip)
+
+EXTERN_C void xs_init _((void));

-EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
+EXTERN_C void boot_DynaLoader _((CV* cv));

 EXTERN_C void
-xs_init(pTHX)
+xs_init()
 {

なんか全然違うお!

modperl_xsinit.c は mod_perl の配布物に含まれてるファイルじゃなくて、make の過程で生成されるファイルの模様。

grepると、lib/ModPerl/Code.pm が ExtUtils::Embed を使って生成してるぽい。

    my $xsinit = "$self->{path}/modperl_xsinit.c";
    debug "generating...$xsinit";
(snip)
    ExtUtils::Embed::xsinit($xsinit, 1, $static_xs);

比較してみると ExtUtils::Embed のバージョンが違う。1.2505 と 1.26 。

ExtUtils::Embed は、Perl 本体に含まれるやつ(1.26)のほかに、CPAN もジュール(1.2505)もあり、手がすべって超絶古い CPAN のほうの ExtUtils::Embed が入ってしまっていたぽい。

あの日はlighttpdとかmod_postfileとかいじってて、PerlのFCGI系のモジュールもしこすこ入れてた。その過程で手がすべったのかもしれないしそうでないのかもしれない。

とにかく、ExtUtils::EmbedとEmbed::Persistentを消して、1.26のExtUtils::Embedをコピってきて解決。

ちゃんちゃん。

2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 | 12 |
2017 | 07 |
2018 | 05 |