-->

2012-11-25

sys-fs/lessfs

参考サイト。
http://diary-of-paddy.blogspot.jp/2011/06/lessfs.html

make menuconfig。
file system => fuse
< # CONFIG_FUSE_FS is not set
---
> CONFIG_FUSE_FS=m
> # CONFIG_CUSE is not set

インストールオプション。
$ grep lessfs /etc/portage/package.use/x86_64-pc-linux-gnu
sys-fs/lessfs                   lzo

インストール。
sudo emerge --oneshot -avt sys-fs/lessfs

modprobe fuse起動設定。
sudo /etc/init.d/fuse restart
sudo rc-update add fuse default

初期化。
sudo mkdir -p /data/master/mta
sudo mklessfs -c /etc/lessfs.cfg
sudo lessfs /etc/lessfs.cfg /mnt/lessfs/

確認。
$ mount |grep less
lessfs on /mnt/lessfs type fuse.lessfs (rw,nosuid,nodev,max_read=131072,default_permissions,allow_other)

テスト。128MBの\0だらけのデータを10個。
$ cd /mnt/lessfs/
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6630052  12962828   34% /
$ sudo dd if=/dev/zero of=/var/tmp/dummy.data bs=128M count=1
1+0 レコード入力
1+0 レコード出力
134217728 バイト (134 MB) コピーされました、 0.15713 秒、 854 MB/秒
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6761512  12831368   35% /
$ sudo cp -i /var/tmp/dummy.data .
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6761268  12831612   35% /
$ for num in $(seq 1 10); do df | grep ^/dev/sda1; sudo cp -i dummy.data dummy.data.$num; done
/dev/sda1         20641404   6761264  12831616   35% /
/dev/sda1         20641404   6761372  12831508   35% /
/dev/sda1         20641404   6761540  12831340   35% /
/dev/sda1         20641404   6761676  12831204   35% /
/dev/sda1         20641404   6761808  12831072   35% /
/dev/sda1         20641404   6762180  12830700   35% /
/dev/sda1         20641404   6762312  12830568   35% /
/dev/sda1         20641404   6762452  12830428   35% /
/dev/sda1         20641404   6762564  12830316   35% /
/dev/sda1         20641404   6762696  12830184   35% /
$ cd ..
$ sudo umount /mnt/lessfs/
$ du -sh /data/
16M     /data/

テスト。カーネルのファイルを10個。
$ sudo lessfs /etc/lessfs.cfg /mnt/lessfs/
$ cd /mnt/lessfs/

$ find /mnt/lessfs/ -name "dummy*" -exec md5sum {} \; | awk '{print $1}' | sort | uniq -c
     11 fde9e0818281836e4fc0edfede2b8762

$ sudo cp -i /usr/portage/distfiles/linux-3.5.tar.bz2 .
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6924292  12668588   36% /
$ for num in $(seq 1 10); do df | grep ^/dev/sda1; sudo cp -i linux-3.5.tar.bz2 linux-3.5.tar.bz2.$num; done
/dev/sda1         20641404   6923292  12669588   36% /
/dev/sda1         20641404   6923516  12669364   36% /
/dev/sda1         20641404   6923744  12669136   36% /
/dev/sda1         20641404   6923964  12668916   36% /
/dev/sda1         20641404   6924180  12668700   36% /
/dev/sda1         20641404   6924368  12668512   36% /
/dev/sda1         20641404   6924628  12668252   36% /
/dev/sda1         20641404   6924720  12668160   36% /
/dev/sda1         20641404   6925084  12667796   36% /
/dev/sda1         20641404   6925300  12667580   36% /

$ cd ..
$ sudo umount /mnt/lessfs/
$ du -sh /data/
175M    /data/

テスト。1280MBの\0だらけのデータを10個。
$ sudo rm -rf dummy.data*
$ sudo rm -f /var/tmp/dummy.data
$ sudo dd if=/dev/zero of=/var/tmp/dummy.data bs=128M count=10
10+0 レコード入力
10+0 レコード出力
1342177280 バイト (1.3 GB) コピーされました、 16.7565 秒、 80.1 MB/秒
$ df | grep ^/dev/sda1
/dev/sda1         20641404   8121448  11471432   42% /

$ for num in $(seq 1 10); do df | grep ^/dev/sda1; sudo cp -i /var/tmp/dummy.data dummy.data.$num; done
/dev/sda1         20641404   8117592  11475288   42% /
/dev/sda1         20641404   8121488  11471392   42% /
/dev/sda1         20641404   8128460  11464420   42% /
/dev/sda1         20641404   8132088  11460792   42% /
/dev/sda1         20641404   8146808  11446072   42% /
/dev/sda1         20641404   8147228  11445652   42% /
/dev/sda1         20641404   8151012  11441868   42% /
/dev/sda1         20641404   8154648  11438232   42% /
/dev/sda1         20641404   8160748  11432132   42% /
cp: `dummy.data.9' を書き込んでいます: ソフトウェアが接続を中断しました
cp: `dummy.data.9' の拡張に失敗しました: ソフトウェアが接続を中断しました
df: `/mnt/lessfs': 通信端点が接続されていません
/dev/sda1         20641404   8169424  11423456   42% /
cp: `dummy.data.10' にアクセス中: 通信端点が接続されていません

$ df | grep ^/dev/sda1
df: `/mnt/lessfs': 通信端点が接続されていません
/dev/sda1         20641404   8166600  11426280   42% /

$ ls -al /mnt/lessfs
ls: /mnt/lessfs にアクセスできません: 通信端点が接続されていません

$ cd ..
bash: cd: ..: 通信端点が接続されていません

$ cd /mnt/
$ sudo umount /mnt/lessfs/
$ df | grep ^/dev/sda1
/dev/sda1         20641404   8166604  11426276   42% /
$ sudo rm -f /var/tmp/dummy.data
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6855880  12737000   35% /

$ sudo lessfs /etc/lessfs.cfg /mnt/lessfs/
$ cd lessfs/
$ df | grep ^lessfs
lessfs            20641404   6856332  12736548   35% /mnt/lessfs

$ ls -al
合計 6133384
drwxr-xr-x 4 root root       4096 2012-11-25 02:31:29 ./
drwxr-xr-x 7 root root       4096 2012-11-25 01:42:31 ../
drwxr-xr-x 4 root root       4096 2012-11-25 02:00:11 .lessfs/
-rw-r--r-- 1 root root 1342177280 2012-11-25 02:30:17 dummy.data.1
-rw-r--r-- 1 root root 1342177280 2012-11-25 02:30:53 dummy.data.2
-rw-r--r-- 1 root root 1342177280 2012-11-25 02:31:26 dummy.data.3
-rw-r--r-- 1 root root 1342177280 2012-11-25 02:31:29 dummy.data.4
-rw-r--r-- 1 root root   21102592 2012-11-25 02:31:29 dummy.data.5
-rw-r--r-- 1 root root   80978443 2012-11-25 02:21:01 linux-3.5.tar.bz2
-rw-r--r-- 1 root root   80978443 2012-11-25 02:21:56 linux-3.5.tar.bz2.1
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:20 linux-3.5.tar.bz2.10
-rw-r--r-- 1 root root   80978443 2012-11-25 02:21:58 linux-3.5.tar.bz2.2
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:02 linux-3.5.tar.bz2.3
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:05 linux-3.5.tar.bz2.4
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:07 linux-3.5.tar.bz2.5
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:11 linux-3.5.tar.bz2.6
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:11 linux-3.5.tar.bz2.7
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:13 linux-3.5.tar.bz2.8
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:17 linux-3.5.tar.bz2.9

$ du -sh /data/
236M    /data/

テスト。大きいファイルをダイレクトに作成。
$ sudo dd if=/dev/zero of=dummy.data.big bs=128M count=80
dd: `dummy.data.big' を書き込んでいます: 通信端点が接続されていません
44+0 レコード入力
43+0 レコード出力
5772410880 バイト (5.8 GB) コピーされました、 12.5095 秒、 461 MB/秒
$ ls
ls: ディレクトリ . を開くことが出来ません: 通信端点が接続されていません
$ cd ..
bash: cd: ..: 通信端点が接続されていません
$ cd /mnt/
$ sudo umount /mnt/lessfs/
$ sudo lessfs /etc/lessfs.cfg /mnt/lessfs/
$ cd lessfs/
$ ls -alh dummy.data.big
-rw-r--r-- 1 root root 1.6G 2012-11-25 02:47:14 dummy.data.big

テスト。でかいファイルをコピーする。
$ sudo rm -i dummy.data.big
$ df -h | grep ^/dev/sda1
/dev/sda1         20G  6.6G   13G   36% /
$ sudo dd if=/dev/zero of=/var/tmp/dummy.data.big bs=1G count=10
10+0 レコード入力
10+0 レコード出力
10737418240 バイト (11 GB) コピーされました、 72.1913 秒、 149 MB/秒
$ df -h | grep ^/dev/sda1
/dev/sda1         20G   17G  2.2G   89% /
$ sudo cp -i /var/tmp/dummy.data.big .
cp: `./dummy.data.big' を書き込んでいます: ソフトウェアが接続を中断しました
cp: `./dummy.data.big' の拡張に失敗しました: ソフトウェアが接続を中断しました
cp: `./dummy.data.big' を閉じています: 通信端点が接続されていません
$ cd /mnt/
$ sudo umount /mnt/lessfs/
umount /mnt/lessfs: デバイスがビジーです。
       (このデバイスがプロセスによって使われているのであれば、lsof(8)やfuser(1)を使って調査するのが有益かもしれません)
$ sudo rm -f /var/tmp/dummy.data.big
$ sudo lsof lessfs
lsof: WARNING: can't stat() fuse.lessfs file system /mnt/lessfs
      Output information may be incomplete.
lsof: status error on lessfs: Transport endpoint is not connected
lsof 4.85
 latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
 latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
 latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
 usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s]
 [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Use the ``-h'' option to get more help information.

再起動後、マウントする。
$ ls -alh dummy.data.big
-rw-r--r-- 1 root root 5.0G 2012-11-25 03:02:59 dummy.data.big

ディスクフルギリギリまで詰め込んで運用していると、不味いシナリオが発生しそう...
と、参考サイトに書いてあるので、残りのディスク容量が少ない時にそれ以上ぐらいのサイズのファイルをコピーするとダメっぽい。

rsync の --link-dest より小さくなりそうな気がするが、なにかあった時に、どうやって取り出したらいいのかわからないので正常にマウントできる/data/をバックアップしたらいいのかもしれない。

バックアップファイルの管理が適当で同じファイルや未圧縮が多く複数人が保存している場合とても圧縮できるという物なのかもしれない。

2012-11-04

memo: 古いpcの更新

http://d.hatena.ne.jp/tmatsuu/20101225/1293262061
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/277usetmpfs.html
http://www.asahi-net.or.jp/~aa4t-nngk/nfsv4.html
http://d.hatena.ne.jp/tmatsuu/20090110/1231557035
http://www.gentoo.org/doc/ja/gcc-upgrading.xml

(old)pentium3, (new)i5-3470の場合。
nfsは4にしないとlockとかできない。(nfs-utilsを古くしないと無理。それよりnfs4使うほうが楽)
gccの設定にnativeはダメ。
(new)がマウントした(old)のファイルの所有者がnobodyだらけだとダメ。
メモリに余裕があれば/var/tmpはtmpfsでマウントする。
gccの更新もやる。

サーバー側で"/"マウントOKの許可の設定などをする。
$ cat /etc/exports
# /etc/exports: NFS file systems being exported.  See exports(5).
/ 192.168.0.100/255.255.255.255(rw,sync,no_root_squash,fsid=0,subtree_check)
#/ 192.168.0.110/255.255.255.255(rw,sync,no_root_squash,fsid=0,subtree_check)
/ 192.168.0.110/255.255.255.255(rw,async,no_root_squash,fsid=0,no_subtree_check)
# サーバーはNFSD_V4も入れる。
$ grep -iP "nfs.*4" /usr/src/linux/.config
CONFIG_NFS_V4=y
CONFIG_NFS_V4_1=y
CONFIG_NFSD_V4=y

gccの設定。
$ cat /proc/cpuinfo | grep model\ name
model name      : Pentium III (Coppermine)
$ grep ^C /etc/make.conf
CFLAGS="-march=pentium3 --param l1-cache-size=16 --param l1-cache-line-size=32 --param l2-cache-size=256 -fomit-frame-pointer -Os"
CXXFLAGS="${CFLAGS}"
CHOST="i686-pc-linux-gnu"

ファイルの所有者がおかしい場合はチェックする。
$ grep nobody /etc/idmapd.conf
#Nobody-User = nobody
#Nobody-Group = nobody

$ ps aux|grep [r]pc.idmapd
root      6806  0.0  0.1   2724   700 ?        Ss   09:55   0:00 /usr/sbin/rpc.idmapd

$ sudo mount -t nfs4 192.168.0.120:/ /mnt/dynabook/

$ ll -d /mnt/dynabook/bin/ | grep root
drwxr-xr-x 2 root root 4096 2012-11-04 08:45:22 /mnt/dynabook/bin//

マウントする。
$ sudo umount -l /mnt/dynabook

$ sudo mount -t nfs4 192.168.0.120:/ /mnt/dynabook/

$ cat /proc/meminfo | grep ^Mem
MemTotal:        8170052 kB
MemFree:         3824372 kB
# 余裕がなければ mount --bind /var/tmp/dynabook/var/tmp /mnt/dynabook/var/tmp/ など。
$ sudo mount -t tmpfs -o size=4096m tmpfs /mnt/dynabook/var/tmp/
$ sudo mount -t tmpfs -o size=4096m tmpfs /mnt/dynabook/tmp/

$ sudo mount --rbind /usr/portage/ /mnt/dynabook/usr/portage/

$ sudo mount -t proc none /mnt/dynabook/proc/

chrootする。
$ cd /mnt/dynabook/
$ sudo chroot . /bin/bash

$ env-update
$ source /etc/profile
$ export PS1="(chroot.nfs.dynabook) $PS1"

更新する。
$ emerge --oneshot portage
$ emerge -uav gcc
$ gcc-config -l
$ gcc-config i686-pc-linux-gnu-4.5.4
$ env-update && source /etc/profile
$ fix_libtool_files.sh 4.5.4
$ emerge --oneshot -av libtool
$ emerge --jobs=8 --load-average=16 --keep-going -eavt system
...
状態が古いので色々更新などがある。

$ genkernel --makeopts="-j16 KCFLAGS=\\\"-march=pentium3 --param l1-cache-size=16 --param l1-cache-line-size=32 --param l2-cache-size=256 -fomit-frame-pointer -Os\\\"" --kernel-config=/etc/kernels/kernel-config-x86-2.6.38-hardened-r6 --arch-override=x86 all

memo: cscope

http://d.hatena.ne.jp/goinger/20100424/1272134240
http://d.hatena.ne.jp/hsyd/20100511/1273595996
http://sajin.sakura.ne.jp/diary/?date=201001

$ emerge -pv dev-util/cscope|grep USE
[ebuild   R    ] dev-util/cscope-15.8a  USE="emacs" 0 kB

$ find . -type f -readable -name "*.php" > cscope.files

# Smartyのキャッシュ除外
#$ find . -type f -readable -name "*.php" ! -name "%%*.tpl.php" > cscope.files

$ for fn in $(find . -type f -readable ! -name "*.php" ! -name "*.phpt" ! -name "*.phps"); do \
file $fn | grep -P "ASCII text(?:,|$)" 2>&1 >/dev/null && \
grep "&1 >/dev/null && \
php -l $fn 2>&1 >/dev/null && \
echo $fn; \
done | \
while read -r fn; do \
test -e "$fn" && echo $fn; \
done > cscope.files.tmp

# いらない場合が多い。php以外の拡張子でphpっぽいのを探す。
#$ cat cscope.files.tmp >> cscope.files

$ rm -i cscope.out
$ cscope -b

こんだけ使ったが便利だと思う。
C-c s s => n(next), p(prev), o(移動して閉じる)
C-c s t => こっちテキストなんでマッチするのが多い。

ディレクトリ名ごとのcscope.outのパスの設定もできるっぽい。

subversionのインストール

http://www.gside.org/Gentoo/subversion/subversion.html
http://d.hatena.ne.jp/dayflower/20070604/1180941582
http://www.hyuki.com/techinfo/svninit.html#import
http://thinkit.co.jp/cert/article/0611/2/2/2.htm

subversionのインストール設定にapache2を追加して再インストールする。
$ grep subversion /etc/portage/package.use
dev-vcs/subversion      -dso perl apache2

apacheの設定にSVN,DAVを追加する。
$ grep ^APACHE2_OPTS /etc/conf.d/apache2
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D SSL -D SSL_DEFAULT_VHOST -D LANGUAGE"
APACHE2_OPTS="${APACHE2_OPTS} -D PHP5 -D PROXY -D EXTRACT_FORWARDED"
APACHE2_OPTS="${APACHE2_OPTS} -D SVN -D SVN_AUTHZ -D DAV -D DAV_FS -D SSL -D SSL_DEFAULT_VHOST"

ディレクトリを作成する。
$ sudo mkdir -p /var/svn/repos

レポジトリを作成する。
$ sudo svnadmin create /var/svn/repos/repos001
$ sudo chown -R apache:apache /var/svn/repos/repos001/

apacheの設定に追加する。
$ rcsdiff /etc/config-archive/etc/apache2/modules.d/47_mod_dav_svn.conf,v /etc/apache2/modules.d/47_mod_dav_svn.conf
===================================================================
RCS file: /etc/config-archive/etc/apache2/modules.d/47_mod_dav_svn.conf,v
retrieving revision 1.1
diff -r1.1 /etc/apache2/modules.d/47_mod_dav_svn.conf
15a16,24
> <Location /svn/repos>
>        DAV svn
>        SVNParentPath /var/svn/repos
>        SVNListParentPath On
>        AuthType Basic
>        AuthName "Subversion repository"
>        AuthUserFile /var/svn/conf/svnusers
>        Require valid-user
> </Location>

Basic認証の設定をする。
$ sudo mkdir /var/svn/conf/
$ sudo htpasswd -c /var/svn/conf/svnusers admin

再起動する。
$ sudo /etc/init.d/apache2 restart

確認する。
http://192.168.xxx.xxx/svn/repos/
Collection of Repositories

    repos001/

Powered by Subversion version 1.6.17 (r1128011).

SSLのみ。
$ rcsdiff -u /etc/config-archive/etc/apache2/modules.d/47_mod_dav_svn.conf,v /etc/apache2/modules.d/47_mod_dav_svn.conf
===================================================================
RCS file: /etc/config-archive/etc/apache2/modules.d/47_mod_dav_svn.conf,v
retrieving revision 1.2
diff -u -r1.2 /etc/apache2/modules.d/47_mod_dav_svn.conf
--- /etc/apache2/modules.d/47_mod_dav_svn.conf  2012/11/03 14:40:53     1.2
+++ /etc/apache2/modules.d/47_mod_dav_svn.conf  2012/11/03 14:41:29
@@ -14,6 +14,7 @@
 #       Require valid-user
 #</Location>
 <Location /svn/repos>
+       SSLRequireSSL
        DAV svn
        SVNParentPath /var/svn/repos
        SVNListParentPath On

テスト。
import.
$ cd /tmp/
$ mkdir htdocs
$ cd htdocs/
$ echo "test001" >> a.txt
$ cat a.txt
test001
$ svn import http://192.168.0.110/svn/repos/repos001/htdocs -m "test001"
追加しています              a.txt

リビジョン 1 をコミットしました。

checkout.
$ cd /tmp/
$ mv -i htdocs/ htdocs.old
$ svn checkout http://192.168.0.110/svn/repos/repos001/htdocs htdocs
A    htdocs/a.txt
リビジョン 1 をチェックアウトしました。
$ diff -r htdocs.old/ htdocs
htdocsだけに発見: .svn

diff.
$ cd htdocs
$ echo "test002" >> a.txt
$ svn diff
Index: a.txt
===================================================================
--- a.txt (リビジョン 1)
+++ a.txt (作業コピー)
@@ -1 +1,2 @@
 test001
+test002
$ svn commit . -m "test002"
送信しています              a.txt
ファイルのデータを送信しています .
リビジョン 2 をコミットしました。
$ svn diff
$ echo "test003" >> a.txt
$ svn diff
Index: a.txt
===================================================================
--- a.txt (リビジョン 2)
+++ a.txt (作業コピー)
@@ -1,2 +1,3 @@
 test001
 test002
+test003

delete.
$ svn delete http://192.168.0.110/svn/repos/repos001/htdocs/a.txt -m 'test004'

リビジョン 3 をコミットしました。
$ cd /tmp/
$ svn checkout http://192.168.0.110/svn/repos/repos001/htdocs htdocs
   C htdocs/a.txt
リビジョン 3 をチェックアウトしました。
Summary of conflicts:
  Tree conflicts: 1
$ mv -i htdocs htdocs.current
$ svn checkout http://192.168.0.110/svn/repos/repos001/htdocs htdocs
リビジョン 3 をチェックアウトしました。
$ diff -r -q htdocs htdocs.current/
ファイル htdocs/.svn/all-wcprops と htdocs.current/.svn/all-wcprops は異なります
ファイル htdocs/.svn/entries と htdocs.current/.svn/entries は異なります
htdocs.current/.svn/text-baseだけに発見: a.txt.svn-base
htdocs.current/だけに発見: a.txt
$ svn checkout -r2 http://192.168.0.110/svn/repos/repos001/htdocs htdocs
A    htdocs/a.txt
リビジョン 2 をチェックアウトしました。
$ diff -r -q htdocs htdocs.current/
ファイル htdocs/.svn/all-wcprops と htdocs.current/.svn/all-wcprops は異なります
ファイル htdocs/.svn/entries と htdocs.current/.svn/entries は異なります
ファイル htdocs/a.txt と htdocs.current/a.txt は異なります
$ diff htdocs/a.txt htdocs.current/a.txt
2a3
> test003

よくわからないがdeleteしたファイル名は指定できなかった。
たぶんコマンドの内容がおかしい。
普通はコマンドではなくエディタの機能を経由とかで使うので復活方法を把握しとけばOK.
$ svn copy http://192.168.0.110/svn/repos/repos001/htdocs/a.txt a.txt
svn: パス 'http://192.168.0.110/svn/repos/repos001/htdocs/a.txt' がリビジョン 4 に見つかりません
$ svn copy -r2 http://192.168.0.110/svn/repos/repos001/htdocs/a.txt a.txt
svn: パス '/svn/repos/repos001/!svn/bc/4/htdocs/a.txt' が見つかりません
$ svn copy -r2 http://192.168.0.110/svn/repos/repos001/htdocs/ htdocs
A    htdocs/a.txt
リビジョン 2 をチェックアウトしました。
A         htdocs

ファイルシステムは?
たぶん安全性を取るとfsfsが良い。
しかしどこか壊れているのに大丈夫なつもりで使い続けるほうがまずそう。
$ svnadmin create --help | grep "fs-type"
  --fs-type           : リポジトリ形式: 'fsfs' (デフォルト) または 'bdb'

バックアップは?
1日1回やって古いのは消すとか。cron,logrotateとか。
$ tar cvzf varsvn.tar.gz /var/svn/