mirror of
https://github.com/ceph/ceph
synced 2025-01-18 09:02:08 +00:00
a15fde495f
[ The following text is in the "UTF-8" character set. ] [ Your display is set for the "ANSI_X3.4-1968" character set. ] [ Some characters may be displayed incorrectly. ] Fix config keys for OSD/MDS data dirs. As in documentation and other places of the scripts the keys are 'osd data'/'mds data' and not 'osd_data' In case if MDS: if 'mds data' doesn't exist, create it. Signed-off-by: Danny Kukawka <danny.kukawka@bisect.de>
521 lines
12 KiB
Bash
521 lines
12 KiB
Bash
#!/bin/sh
|
|
#
|
|
# mkcephfs
|
|
#
|
|
# This tool is designed to be flexible. There are two ways to go:
|
|
#
|
|
# The easy way does everything for you using ssh keys. This does not
|
|
# scale well for large clusters.
|
|
#
|
|
# master$ mkcephfs -a -c /etc/ceph/ceph.conf
|
|
#
|
|
# Alternatively, you can use whatever file distribution and/or job
|
|
# launching you want.
|
|
#
|
|
# master$ mkdir /tmp/foo
|
|
# master$ mkcephfs -d /tmp/foo -c /etc/ceph/ceph.conf --prepare-monmap
|
|
#
|
|
# ...copy/share /tmp/foo with all osd and mds nodes at /tmp/bar...
|
|
#
|
|
# osd$ mkcephfs -d /tmp/bar --init-local-daemons osd
|
|
# mds$ mkcephfs -d /tmp/bar --init-local-daemons mds
|
|
#
|
|
# ...gather contents of /tmp/bar's back into /tmp/foo...
|
|
#
|
|
# master$ mkcephfs -d /tmp/foo --prepare-mon
|
|
#
|
|
# ...distribute /tmp/foo to each monitor node...
|
|
#
|
|
# mon$ mkcephfs -d /tmp/foo --init-local-daemons mon
|
|
#
|
|
# master$ cp /tmp/foo/keyring.admin /etc/ceph/keyring # don't forget!
|
|
#
|
|
# In the degenerate case (one node), this is just
|
|
#
|
|
# mkdir /tmp/foo
|
|
# mkcephfs -c ceph.conf -d /tmp/foo --prepare-monmap
|
|
# mkcephfs -d /tmp/foo --init-local-daemons mds
|
|
# mkcephfs -d /tmp/foo --init-local-daemons osd
|
|
# mkcephfs -d /tmp/foo --prepare-mon
|
|
# mkcephfs -d /tmp/foo --init-local-daemons mon
|
|
# cp /tmp/foo/keyring.admin /etc/ceph/keyring
|
|
#
|
|
# or simply
|
|
#
|
|
# mkcephfs -a -c ceph.conf
|
|
#
|
|
|
|
set -e
|
|
|
|
# if we start up as ./mkcephfs, assume everything else is in the
|
|
# current directory too.
|
|
if [ `dirname $0` = "." ] && [ $PWD != "/etc/init.d" ]; then
|
|
BINDIR=.
|
|
LIBDIR=.
|
|
ETCDIR=.
|
|
else
|
|
BINDIR=@bindir@
|
|
LIBDIR=@libdir@/ceph
|
|
ETCDIR=@sysconfdir@/ceph
|
|
fi
|
|
|
|
usage_exit() {
|
|
echo "usage: $0 -a -c ceph.conf [-k adminkeyring] [--mkbtrfs]"
|
|
echo " to generate a new ceph cluster on all nodes; for advanced usage see man page"
|
|
echo " ** be careful, this WILL clobber old data; check your ceph.conf carefully **"
|
|
exit
|
|
}
|
|
|
|
. $LIBDIR/ceph_common.sh
|
|
|
|
|
|
allhosts=0
|
|
mkbtrfs=0
|
|
preparemonmap=0
|
|
prepareosdfs=""
|
|
initdaemon=""
|
|
initdaemons=""
|
|
preparemon=0
|
|
|
|
numosd=
|
|
useosdmap=
|
|
usecrushmapsrc=
|
|
usecrushmap=
|
|
verbose=0
|
|
adminkeyring=""
|
|
conf=""
|
|
dir=""
|
|
moreargs=""
|
|
auto_action=0
|
|
manual_action=0
|
|
nocopyconf=0
|
|
|
|
while [ $# -ge 1 ]; do
|
|
case $1 in
|
|
-v )
|
|
verbose=1;
|
|
;;
|
|
--dir | -d)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
dir=$1
|
|
;;
|
|
--allhosts | -a)
|
|
allhosts=1
|
|
auto_action=1
|
|
;;
|
|
--prepare-monmap)
|
|
preparemonmap=1
|
|
manual_action=1
|
|
;;
|
|
--prepare-osdfs)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
prepareosdfs=$1
|
|
manual_action=1
|
|
;;
|
|
--init-daemon)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
initdaemon=$1
|
|
manual_action=1
|
|
;;
|
|
--init-local-daemons)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
initlocaldaemons=$1
|
|
manual_action=1
|
|
;;
|
|
--prepare-mon)
|
|
preparemon=1
|
|
manual_action=1
|
|
;;
|
|
--mkbtrfs)
|
|
mkbtrfs=1
|
|
;;
|
|
--no-copy-conf)
|
|
nocopyconf=1
|
|
;;
|
|
--conf | -c)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
conf=$1
|
|
;;
|
|
--numosd)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
numosd=$1
|
|
moreargs="$moreargs --numosd $1"
|
|
;;
|
|
--osdmap)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
useosdmap=$1
|
|
moreargs="$moreargs --osdmap $1"
|
|
;;
|
|
--crushmapsrc)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
usecrushmapsrc=$1
|
|
moreargs="$moreargs --crushmapsrc $1"
|
|
;;
|
|
--crushmap)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
usecrushmap=$1
|
|
moreargs="$moreargs --crushmap $1"
|
|
;;
|
|
-k)
|
|
[ -z "$2" ] && usage_exit
|
|
shift
|
|
adminkeyring=$1
|
|
;;
|
|
*)
|
|
echo unrecognized option \'$1\'
|
|
usage_exit
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
|
|
[ -z "$conf" ] && [ -n "$dir" ] && conf="$dir/conf"
|
|
|
|
if [ $manual_action -eq 0 ]; then
|
|
if [ $auto_action -eq 0 ]; then
|
|
echo "You must specify an action. See man page."
|
|
usage_exit
|
|
fi
|
|
elif [ $auto_action -eq 1 ]; then
|
|
echo "The -a option cannot be combined with other subcommands; see man page."
|
|
usage_exit
|
|
fi
|
|
|
|
### prepare-monmap ###
|
|
|
|
if [ $preparemonmap -eq 1 ]; then
|
|
echo "preparing monmap in $dir/monmap"
|
|
|
|
# first, make a list of monitors
|
|
mons=`$CCONF -c $conf -l mon | egrep -v '^mon$' | sort`
|
|
args=""
|
|
|
|
type="mon"
|
|
for name in $mons; do
|
|
id=`echo $name | cut -c 4- | sed 's/^\\.//'`
|
|
get_conf addr "" "mon addr"
|
|
if [ -z "$addr" ]; then
|
|
echo "$0: monitor $name has no address defined." 1>&2
|
|
exit 1
|
|
fi
|
|
args=$args" --add $id $addr"
|
|
done
|
|
|
|
if [ -z "$args" ]; then
|
|
echo "$0: no monitors found in config, aborting." 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
# build monmap
|
|
monmap="$dir/monmap"
|
|
echo $BINDIR/monmaptool --create --clobber $args --print $monmap || exit 1
|
|
$BINDIR/monmaptool --create --clobber $args --print $monmap || exit 1
|
|
|
|
# copy conf
|
|
cp $conf $dir/conf
|
|
|
|
exit 0
|
|
fi
|
|
|
|
|
|
### init-daemon ###
|
|
|
|
if [ -n "$initdaemon" ]; then
|
|
name=$initdaemon
|
|
type=`echo $name | cut -c 1-3` # e.g. 'mon', if $name is 'mon1'
|
|
id=`echo $name | cut -c 4- | sed 's/^\\.//'`
|
|
name="$type.$id"
|
|
|
|
# create /var/run/ceph (or wherever pid file and/or admin socket live)
|
|
get_conf pid_file "/var/run/ceph/$name.pid" "pid file"
|
|
rundir=`dirname $pid_file`
|
|
if [ "$rundir" != "." ] && [ ! -d "$rundir" ]; then
|
|
mkdir -p $rundir
|
|
fi
|
|
get_conf asok_file "/var/run/ceph/$name.asok" "admin socket"
|
|
rundir=`dirname $asok_file`
|
|
if [ "$rundir" != "." ] && [ ! -d "$rundir" ]; then
|
|
mkdir -p $rundir
|
|
fi
|
|
|
|
if [ $type = "osd" ]; then
|
|
$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
|
|
fi
|
|
|
|
if [ $type = "mds" ]; then
|
|
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
|
|
fi
|
|
|
|
if [ $type = "mon" ]; then
|
|
get_conf mon_data "/var/lib/ceph/mon/ceph-$id" "mon data"
|
|
if test -d $mon_data && ! find "$mon_data" -maxdepth 0 -empty | read foo; then
|
|
echo "ERROR: $name mon_data directory $mon_data is not empty."
|
|
echo " Please make sure that it is empty before running mkcephfs."
|
|
exit 1
|
|
fi
|
|
$BINDIR/ceph-mon -c $conf --mkfs -i $id --monmap $dir/monmap --osdmap $dir/osdmap -k $dir/keyring.mon
|
|
fi
|
|
|
|
exit 0
|
|
fi
|
|
|
|
|
|
## init-local-daemons ##
|
|
|
|
if [ -n "$initlocaldaemons" ]; then
|
|
get_name_list "$initlocaldaemons"
|
|
for name in $what; do
|
|
type=`echo $name | cut -c 1-3` # e.g. 'mon', if $name is 'mon1'
|
|
id=`echo $name | cut -c 4- | sed 's/^\\.//'`
|
|
num=$id
|
|
name="$type.$id"
|
|
|
|
check_host || continue
|
|
|
|
$0 -d $dir --init-daemon $name
|
|
done
|
|
exit 0
|
|
fi
|
|
|
|
|
|
### prepare-osdfs ###
|
|
|
|
if [ -n "$prepareosdfs" ]; then
|
|
name=$prepareosdfs
|
|
type=`echo $name | cut -c 1-3` # e.g. 'mon', if $name is 'mon1'
|
|
id=`echo $name | cut -c 4- | sed 's/^\\.//'`
|
|
name="$type.$id"
|
|
|
|
get_conf osd_data "/var/lib/ceph/osd/ceph-$id" "osd data"
|
|
get_conf osd_journal "$osd_data/journal" "osd journal"
|
|
get_conf btrfs_path "$osd_data" "btrfs path" # mount point defaults so osd data
|
|
get_conf btrfs_devs "" "btrfs devs"
|
|
|
|
if [ -z "$btrfs_devs" ]; then
|
|
echo "no btrfs devs defined for $name"
|
|
exit 0
|
|
fi
|
|
|
|
first_dev=`echo $btrfs_devs | cut '-d ' -f 1`
|
|
get_conf btrfs_opt "noatime" "btrfs options"
|
|
[ -n "$btrfs_opt" ] && btrfs_opt="-o $btrfs_opt"
|
|
get_conf osd_user "root" "user"
|
|
|
|
if [ -n "$osd_journal" ] && echo "$btrfs_devs" | grep -q -w "$osd_journal" ; then
|
|
echo "ERROR: osd journal device ($osd_journal) also used by btrfs devs ($btrfs_devs)"
|
|
exit 1
|
|
fi
|
|
|
|
test -d $osd_data || mkdir -p $osd_data
|
|
|
|
if [ -n "$osd_journal" ]; then
|
|
test -d $osd_journal || mkdir -p `dirname $osd_journal`
|
|
fi
|
|
|
|
umount $btrfs_path || true
|
|
for f in $btrfs_devs ; do
|
|
umount $f || true
|
|
done
|
|
|
|
modprobe btrfs || true
|
|
mkfs.btrfs $btrfs_devs
|
|
btrfs device scan || btrfsctl -a
|
|
sync # seems to fix problems for some people...
|
|
mount -t btrfs $btrfs_opt $first_dev $btrfs_path
|
|
chown $osd_user $btrfs_path
|
|
chmod +w $btrfs_path
|
|
|
|
exit 0
|
|
fi
|
|
|
|
|
|
|
|
### prepare-mon ###
|
|
|
|
if [ $preparemon -eq 1 ]; then
|
|
|
|
if [ -n "$useosdmap" ]; then
|
|
echo "Using osdmap $useosdmap"
|
|
cp $useosdmap $dir/osdmap
|
|
else
|
|
echo "Building generic osdmap from $conf"
|
|
$BINDIR/osdmaptool --create-from-conf $dir/osdmap -c $conf
|
|
fi
|
|
|
|
# import crush map?
|
|
get_conf crushmapsrc "" "crush map src" mon global
|
|
if [ -n "$crushmapsrc" ]; then
|
|
echo Compiling crush map from $crushmapsrc to $dir/crushmap
|
|
$BINDIR/crushtool -c $crushmapsrc -o $dir/crushmap
|
|
fi
|
|
get_conf crushmap "$usecrushmap" "crush map" mon global
|
|
if [ -n "$crushmap" ]; then
|
|
echo Importing crush map from $crushmap
|
|
$BINDIR/osdmaptool --import-crush $crushmap $dir/osdmap
|
|
fi
|
|
|
|
# admin keyring
|
|
echo Generating admin key at $dir/keyring.admin
|
|
$BINDIR/ceph-authtool --create-keyring --gen-key -n client.admin $dir/keyring.admin
|
|
|
|
# mon keyring
|
|
echo Building initial monitor keyring
|
|
cp $dir/keyring.admin $dir/keyring.mon
|
|
$BINDIR/ceph-authtool -n client.admin --set-uid=0 \
|
|
--cap mon 'allow *' \
|
|
--cap osd 'allow *' \
|
|
--cap mds 'allow' \
|
|
$dir/keyring.mon
|
|
|
|
$BINDIR/ceph-authtool --gen-key -n mon. $dir/keyring.mon
|
|
|
|
for k in $dir/key.*
|
|
do
|
|
kname=`echo $k | sed 's/.*key\.//'`
|
|
ktype=`echo $kname | cut -c 1-3`
|
|
kid=`echo $kname | cut -c 4- | sed 's/^\\.//'`
|
|
kname="$ktype.$kid"
|
|
secret=`cat $k`
|
|
if [ "$ktype" = "osd" ]; then
|
|
$BINDIR/ceph-authtool -n $kname --add-key $secret $dir/keyring.mon \
|
|
--cap mon 'allow rwx' \
|
|
--cap osd 'allow *'
|
|
fi
|
|
if [ "$ktype" = "mds" ]; then
|
|
$BINDIR/ceph-authtool -n $kname --add-key $secret $dir/keyring.mon \
|
|
--cap mon "allow rwx" \
|
|
--cap osd 'allow *' \
|
|
--cap mds 'allow'
|
|
fi
|
|
done
|
|
|
|
exit 0
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
### do everything via ssh ###
|
|
|
|
if [ $allhosts -eq 1 ]; then
|
|
|
|
verify_conf
|
|
|
|
# do it all
|
|
if [ -z "$dir" ]; then
|
|
dir=`mktemp -d -t mkcephfs.XXXXXXXXXX` || exit 1
|
|
echo "temp dir is $dir"
|
|
trap "rm -rf $dir ; exit" INT TERM EXIT
|
|
fi
|
|
|
|
$0 --prepare-monmap -d $dir -c $conf
|
|
|
|
# osd, mds
|
|
get_name_list "osd mds"
|
|
for name in $what; do
|
|
type=`echo $name | cut -c 1-3` # e.g. 'mon', if $name is 'mon1'
|
|
id=`echo $name | cut -c 4- | sed 's/^\\.//'`
|
|
num=$id
|
|
name="$type.$id"
|
|
|
|
check_host || continue
|
|
|
|
if [ -n "$ssh" ]; then
|
|
rdir="/tmp/mkfs.ceph.$$"
|
|
echo pushing conf and monmap to $host:$rdir
|
|
do_cmd "mkdir -p $rdir"
|
|
scp -q $dir/conf $host:$rdir
|
|
scp -q $dir/monmap $host:$rdir
|
|
|
|
if [ $nocopyconf -eq 0 ]; then
|
|
# also put conf at /etc/ceph/ceph.conf
|
|
scp -q $dir/conf $host:/etc/ceph/ceph.conf
|
|
fi
|
|
else
|
|
rdir=$dir
|
|
|
|
if [ $nocopyconf -eq 0 ]; then
|
|
# also put conf at /etc/ceph/ceph.conf
|
|
cp $dir/conf /etc/ceph/ceph.conf
|
|
fi
|
|
fi
|
|
|
|
if [ $mkbtrfs -eq 1 ] && [ "$type" = "osd" ]; then
|
|
do_root_cmd "$0 -d $rdir --prepare-osdfs $name"
|
|
fi
|
|
|
|
do_root_cmd "$0 -d $rdir --init-daemon $name"
|
|
|
|
# collect the key
|
|
if [ -n "$ssh" ]; then
|
|
echo collecting $name key
|
|
scp -q $host:$rdir/key.$name $dir
|
|
do_cmd "rm -r $rdir"
|
|
fi
|
|
done
|
|
|
|
# prepare monitors
|
|
$0 -d $dir --prepare-mon $moreargs
|
|
|
|
# mons
|
|
get_name_list "mon"
|
|
for name in $what; do
|
|
type=`echo $name | cut -c 1-3` # e.g. 'mon', if $name is 'mon1'
|
|
id=`echo $name | cut -c 4- | sed 's/^\\.//'`
|
|
num=$id
|
|
name="$type.$id"
|
|
|
|
check_host || continue
|
|
|
|
if [ -n "$ssh" ]; then
|
|
echo pushing everything to $host
|
|
ssh $host mkdir -p $rdir
|
|
scp -q $dir/* $host:$rdir
|
|
|
|
if [ $nocopyconf -eq 0 ]; then
|
|
# also put conf at /etc/ceph/ceph.conf
|
|
scp -q $dir/conf $host:/etc/ceph/ceph.conf
|
|
fi
|
|
else
|
|
rdir=$dir
|
|
|
|
if [ $nocopyconf -eq 0 ]; then
|
|
# also put conf at /etc/ceph/ceph.conf
|
|
cp $dir/conf /etc/ceph/ceph.conf
|
|
fi
|
|
fi
|
|
|
|
do_root_cmd "$0 -d $rdir --init-daemon $name"
|
|
done
|
|
|
|
# admin keyring
|
|
if [ -z "$adminkeyring" ]; then
|
|
get_conf adminkeyring "/etc/ceph/keyring" "keyring" global
|
|
fi
|
|
echo "placing client.admin keyring in $adminkeyring"
|
|
cp $dir/keyring.admin $adminkeyring
|
|
|
|
exit 0
|
|
fi
|
|
|