mkcephfs创建集群过程分析

$0指的就是mkcephfs

1. 校验conf文件,并创建随机的临时目录:


dir = /tmp/mkcephfs.jYWWOaxaTa


2 .执行 :$0 --prepare-monmap -d $dir -c $conf



1) 得到mon列表、mon的id以及mon的地址 :


mons=`$CCONF -c $conf -l mon | egrep -v '^mon$' | sort`

id=`echo $name | cut -c 4- | sed 's/^\\.//'`

get_conf addr "" "mon addr"

那么args:args =  --add 0 192.168.100.61:6789


2) 在$dir/monmap中创建monmap


$BINDIR/monmaptool --create --clobber $args --print $monmap || exit 1


在此之中,生成了fsid,并将 epoch 0 写入 /tmp/mkcephfs.jYWWOaxaTa/monmap


3) 复制ceph.conf文件:


cp $conf $dir/conf


至此,$0 --prepare-monmap -d $dir -c $conf 命令执行结束。


3. 只取出osd_list和mds_lilst组成name_list, 遍历name_llist并执行:



1)如果为远程主机,那么先调用scp推送conf 和monmap 到远程主机的临时目录 $host:$rdir:

rdir=`mktemp -u /tmp/mkfs.ceph.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`


2)do_root_cmd "$0 -d $rdir --init-daemon $name"


s1. 检查/var/run/ceph/$name.pid和/var/run/ceph/$name.asok,并创建相应的目录


s2 .如果$name的$type为osd,则:


$BINDIR/ceph-osd -c $conf --monmap $dir/monmap -i $id --mkfs --mkkey


get_conf osd_data "/var/lib/ceph/osd/ceph-$id" "osd data"

get_conf osd_keyring "$osd_data/keyring" "keyring"

$BINDIR/ceph-authtool -p -n $name $osd_keyring > $dir/key.$name


s3. 如果$type为mds,则:


get_conf mds_data "/var/lib/ceph/mds/ceph-$id" "mds data"

get_conf mds_keyring "$mds_data/keyring" "keyring"

test -d $mds_data || mkdir -p $mds_data

echo "creating private key for $name keyring $mds_keyring"

$BINDIR/ceph-authtool --create-keyring --gen-key -n $name $mds_keyring

$BINDIR/ceph-authtool -p -n $name $mds_keyring > $dir/key.$name


3) 如果带有--mkfs参数,那么同时格式化分区

do_root_cmd "$0 -d $rdir --prepare-osdfs $name"


4)如果为远程主机,从远程节点收集keys 


 scp -q $host:$rdir/key.$name $dir


4.  准备monitors,执行$0 -d $dir --prepare-mon $moreargs :


此时,moreargs已经包含了更多参数:numosd osdmap crushmapsrc  crushmap


1)如果useosdmap不为空,那么使用useosdmap:cp $useosdmap $dir/osdmap,否则根据conf文件创建通用的osdmap:

$BINDIR/osdmaptool --create-from-conf $dir/osdmap -c $conf


2) 得到crushmapsrc  :

get_conf crushmapsrc "" "crush map src" mon global

如果$crushmapsrc不为空,则根据crushmapsrc得到一个map文件,保存为$dir/crushmap:

$BINDIR/crushtool -c $crushmapsrc -o $dir/crushmap


3)得到crushmap:

get_conf crushmap "$usecrushmap" "crush map" mon global

如果$crushmap 不为空,则将$crushmap导入到$dir/crushmap:

$BINDIR/osdmaptool --import-crush $crushmap $dir/osdmap


4)产生admin keyring,保存到$dir/keyring.admin:

$BINDIR/ceph-authtool --create-keyring --gen-key -n client.admin $dir/keyring.admin


5)创建初始的monitor keyring:

s1.    cp $dir/keyring.admin $dir/keyring.mon


s2. $BINDIR/ceph-authtool -n client.admin --set-uid=0 \

--cap mon 'allow *' \

--cap osd 'allow *' \

--cap mds 'allow' \

$dir/keyring.mon


s3. $BINDIR/ceph-authtool --gen-key -n mon. $dir/keyring.mon --cap mon 'allow *'


6) 遍历$dir/key.*:


如果ktype为osd:

  $BINDIR/ceph-authtool -n $kname --add-key $secret $dir/keyring.mon \

--cap mon 'allow rwx' \

--cap osd 'allow *'

如果type为mds:

   $BINDIR/ceph-authtool -n $kname --add-key $secret $dir/keyring.mon \

--cap mon "allow rwx" \

--cap osd 'allow *' \

--cap mds 'allow'


5.遍历mon_list,并执行:


1)推送配置文件

如果为远程主机,先推送本地的$dir/* 到$rdir :

rdir=`mktemp -u /tmp/mkfs.ceph.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`

否则如果是本地主机,则cp $dir/conf /etc/ceph/ceph.conf


2)开始启动mon daemon:

do_root_cmd "$0 -d $rdir --init-daemon $name"


s1. 检查/var/run/ceph/$name.pid和/var/run/ceph/$name.asok,并创建相应的目录


s2.此时 $type为mon,则:


get_conf mon_data "/var/lib/ceph/mon/ceph-$id" "mon data"

mkdir -p "$mon_data"

$BINDIR/ceph-mon -c $conf --mkfs -i $id --monmap $dir/monmap --osdmap $dir/osdmap -k $dir/keyring.mon


6 .得到adminkerying:


get_conf adminkeyring "/etc/ceph/keyring" "keyring" global

cp $dir/keyring.admin $adminkeyring


你可能感兴趣的:(mkcephfs创建集群过程分析)