ddab09fdd8
When deploying osd, if the user does not use the extra block partition, the kolla will automatically partition the disk and then clean up the data on the disk partition. Sometimes the disk partition will not be updated, there will be an error not finding the partition. This commit fixes the problem. Change-Id: I14708f38614dcb75268c2f460ae3d921748c2d10 Closes-bug: #1824787
180 lines
8.1 KiB
Bash
180 lines
8.1 KiB
Bash
#!/bin/bash
|
|
|
|
if [[ ! -d "/var/log/kolla/ceph" ]]; then
|
|
mkdir -p /var/log/kolla/ceph
|
|
fi
|
|
if [[ $(stat -c %a /var/log/kolla/ceph) != "755" ]]; then
|
|
chmod 755 /var/log/kolla/ceph
|
|
fi
|
|
|
|
# Bootstrap and exit if KOLLA_BOOTSTRAP variable is set. This catches all cases
|
|
# of the KOLLA_BOOTSTRAP variable being set, including empty.
|
|
if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
|
|
# NOTE(SamYaple): Static gpt partcodes
|
|
CEPH_JOURNAL_TYPE_CODE="45B0969E-9B03-4F30-B4C6-B4B80CEFF106"
|
|
CEPH_OSD_TYPE_CODE="4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D"
|
|
CEPH_OSD_BS_WAL_TYPE_CODE="0FC63DAF-8483-4772-8E79-3D69D8477DE4"
|
|
CEPH_OSD_BS_DB_TYPE_CODE="CE8DF73C-B89D-45B0-AD98-D45332906d90"
|
|
|
|
# Wait for ceph quorum before proceeding
|
|
ceph quorum_status
|
|
|
|
if [[ "${USE_EXTERNAL_JOURNAL}" == "False" ]]; then
|
|
# Formatting disk for ceph
|
|
if [[ "${OSD_STORETYPE}" == "bluestore" ]]; then
|
|
if [[ "${OSD_BS_DEV}" =~ "/dev/loop" ]]; then
|
|
sgdisk --zap-all -- "${OSD_BS_DEV}""p${OSD_BS_PARTNUM}"
|
|
else
|
|
sgdisk --zap-all -- "${OSD_BS_DEV}""${OSD_BS_PARTNUM}"
|
|
fi
|
|
|
|
if [ -n "${OSD_BS_BLK_DEV}" ] && [ "${OSD_BS_DEV}" != "${OSD_BS_BLK_DEV}" ] && [ -n "${OSD_BS_BLK_PARTNUM}" ]; then
|
|
if [[ "${OSD_BS_BLK_DEV}" =~ "/dev/loop" ]]; then
|
|
sgdisk --zap-all -- "${OSD_BS_BLK_DEV}""p${OSD_BS_BLK_PARTNUM}"
|
|
else
|
|
sgdisk --zap-all -- "${OSD_BS_BLK_DEV}""${OSD_BS_BLK_PARTNUM}"
|
|
fi
|
|
else
|
|
sgdisk --zap-all -- "${OSD_BS_DEV}"
|
|
sgdisk --new=1:0:+100M --mbrtogpt -- "${OSD_BS_DEV}"
|
|
sgdisk --largest-new=2 --mbrtogpt -- "${OSD_BS_DEV}"
|
|
partprobe || true
|
|
sgdisk --zap-all -- "${OSD_BS_DEV}"2
|
|
fi
|
|
|
|
if [ -n "${OSD_BS_WAL_DEV}" ] && [ "${OSD_BS_BLK_DEV}" != "${OSD_BS_WAL_DEV}" ] && [ -n "${OSD_BS_WAL_PARTNUM}" ]; then
|
|
if [[ "${OSD_BS_WAL_DEV}" =~ "/dev/loop" ]]; then
|
|
sgdisk --zap-all -- "${OSD_BS_WAL_DEV}""p${OSD_BS_WAL_PARTNUM}"
|
|
else
|
|
sgdisk --zap-all -- "${OSD_BS_WAL_DEV}""${OSD_BS_WAL_PARTNUM}"
|
|
fi
|
|
fi
|
|
|
|
if [ -n "${OSD_BS_DB_DEV}" ] && [ "${OSD_BS_BLK_DEV}" != "${OSD_BS_DB_DEV}" ] && [ -n "${OSD_BS_DB_PARTNUM}" ]; then
|
|
if [[ "${OSD_BS_DB_DEV}" =~ "/dev/loop" ]]; then
|
|
sgdisk --zap-all -- "${OSD_BS_DB_DEV}""p${OSD_BS_DB_PARTNUM}"
|
|
else
|
|
sgdisk --zap-all -- "${OSD_BS_DB_DEV}""${OSD_BS_DB_PARTNUM}"
|
|
fi
|
|
fi
|
|
else
|
|
sgdisk --zap-all -- "${OSD_DEV}"
|
|
sgdisk --new=2:1M:5G -- "${JOURNAL_DEV}"
|
|
sgdisk --largest-new=1 -- "${OSD_DEV}"
|
|
fi
|
|
# NOTE(SamYaple): This command may throw errors that we can safely ignore
|
|
partprobe || true
|
|
|
|
fi
|
|
|
|
if [[ "${OSD_STORETYPE}" == "bluestore" ]]; then
|
|
OSD_UUID=$(uuidgen)
|
|
OSD_ID=$(ceph osd new "${OSD_UUID}")
|
|
OSD_DIR="/var/lib/ceph/osd/ceph-${OSD_ID}"
|
|
mkdir -p "${OSD_DIR}"
|
|
|
|
if [[ "${OSD_BS_DEV}" =~ "/dev/loop" ]]; then
|
|
mkfs.xfs -f "${OSD_BS_DEV}""p${OSD_BS_PARTNUM}"
|
|
mount "${OSD_BS_DEV}""p${OSD_BS_PARTNUM}" "${OSD_DIR}"
|
|
else
|
|
mkfs.xfs -f "${OSD_BS_DEV}""${OSD_BS_PARTNUM}"
|
|
mount "${OSD_BS_DEV}""${OSD_BS_PARTNUM}" "${OSD_DIR}"
|
|
fi
|
|
|
|
# This will through an error about no key existing. That is normal. It then
|
|
# creates the key in the next step.
|
|
ceph-osd -i "${OSD_ID}" --mkkey
|
|
echo "bluestore" > "${OSD_DIR}"/type
|
|
if [ -n "${OSD_BS_BLK_DEV}" ] && [ "${OSD_BS_BLK_DEV}" != "${OSD_BS_DEV}" ] && [ -n "${OSD_BS_BLK_PARTNUM}" ]; then
|
|
sgdisk "--change-name="${OSD_BS_BLK_PARTNUM}":KOLLA_CEPH_DATA_BS_${OSD_ID}_B" "--typecode="${OSD_BS_BLK_PARTNUM}":${CEPH_OSD_TYPE_CODE}" -- "${OSD_BS_BLK_DEV}"
|
|
else
|
|
sgdisk "--change-name=2:KOLLA_CEPH_DATA_BS_${OSD_ID}_B" "--typecode=2:${CEPH_OSD_TYPE_CODE}" -- "${OSD_BS_DEV}"
|
|
fi
|
|
|
|
if [ -n "${OSD_BS_WAL_DEV}" ] && [ "${OSD_BS_BLK_DEV}" != "${OSD_BS_WAL_DEV}" ] && [ -n "${OSD_BS_WAL_PARTNUM}" ]; then
|
|
sgdisk "--change-name="${OSD_BS_WAL_PARTNUM}":KOLLA_CEPH_DATA_BS_${OSD_ID}_W" "--typecode="${OSD_BS_WAL_PARTNUM}":${CEPH_OSD_BS_WAL_TYPE_CODE}" -- "${OSD_BS_WAL_DEV}"
|
|
fi
|
|
|
|
if [ -n "${OSD_BS_DB_DEV}" ] && [ "${OSD_BS_BLK_DEV}" != "${OSD_BS_DB_DEV}" ] && [ -n "${OSD_BS_DB_PARTNUM}" ]; then
|
|
sgdisk "--change-name="${OSD_BS_DB_PARTNUM}":KOLLA_CEPH_DATA_BS_${OSD_ID}_D" "--typecode="${OSD_BS_DB_PARTNUM}":${CEPH_OSD_BS_DB_TYPE_CODE}" -- "${OSD_BS_DB_DEV}"
|
|
fi
|
|
|
|
partprobe || true
|
|
|
|
ln -sf /dev/disk/by-partlabel/KOLLA_CEPH_DATA_BS_"${OSD_ID}"_B "${OSD_DIR}"/block
|
|
|
|
if [ -n "${OSD_BS_WAL_DEV}" ] && [ "${OSD_BS_BLK_DEV}" != "${OSD_BS_WAL_DEV}" ] && [ -n "${OSD_BS_WAL_PARTNUM}" ]; then
|
|
ln -sf /dev/disk/by-partlabel/KOLLA_CEPH_DATA_BS_"${OSD_ID}"_W "${OSD_DIR}"/block.wal
|
|
fi
|
|
|
|
if [ -n "${OSD_BS_DB_DEV}" ] && [ "${OSD_BS_BLK_DEV}" != "${OSD_BS_DB_DEV}" ] && [ -n "${OSD_BS_DB_PARTNUM}" ]; then
|
|
ln -sf /dev/disk/by-partlabel/KOLLA_CEPH_DATA_BS_"${OSD_ID}"_D "${OSD_DIR}"/block.db
|
|
fi
|
|
|
|
ceph-osd -i "${OSD_ID}" --mkfs -k "${OSD_DIR}"/keyring --osd-uuid "${OSD_UUID}"
|
|
ceph auth add "osd.${OSD_ID}" osd 'allow *' mon 'allow profile osd' -i "${OSD_DIR}/keyring"
|
|
if [[ "${OSD_BS_DEV}" =~ "/dev/loop" ]]; then
|
|
umount "${OSD_BS_DEV}""p${OSD_BS_PARTNUM}"
|
|
else
|
|
umount "${OSD_BS_DEV}""${OSD_BS_PARTNUM}"
|
|
fi
|
|
else
|
|
OSD_ID=$(ceph osd create)
|
|
OSD_DIR="/var/lib/ceph/osd/ceph-${OSD_ID}"
|
|
mkdir -p "${OSD_DIR}"
|
|
|
|
if [[ "${OSD_FILESYSTEM}" == "btrfs" ]]; then
|
|
mkfs.btrfs -f "${OSD_PARTITION}"
|
|
elif [[ "${OSD_FILESYSTEM}" == "ext4" ]]; then
|
|
mkfs.ext4 "${OSD_PARTITION}"
|
|
else
|
|
mkfs.xfs -f "${OSD_PARTITION}"
|
|
fi
|
|
mount "${OSD_PARTITION}" "${OSD_DIR}"
|
|
|
|
# This will through an error about no key existing. That is normal. It then
|
|
# creates the key in the next step.
|
|
ceph-osd -i "${OSD_ID}" --mkfs --osd-journal="${JOURNAL_PARTITION}" --mkkey
|
|
ceph auth add "osd.${OSD_ID}" osd 'allow *' mon 'allow profile osd' -i "${OSD_DIR}/keyring"
|
|
umount "${OSD_PARTITION}"
|
|
fi
|
|
|
|
if [[ "${!CEPH_CACHE[@]}" ]]; then
|
|
CEPH_ROOT_NAME=cache
|
|
fi
|
|
|
|
if [[ "${OSD_INITIAL_WEIGHT}" == "auto" ]]; then
|
|
OSD_INITIAL_WEIGHT=$(parted --script ${OSD_PARTITION} unit TB print | awk 'match($0, /^Disk.* (.*)TB/, a){printf("%.2f", a[1])}')
|
|
fi
|
|
|
|
# These commands only need to be run once per host but are safe to run
|
|
# repeatedly. This can be improved later or if any problems arise.
|
|
host_bucket_name="${HOSTNAME}${CEPH_ROOT_NAME:+-${CEPH_ROOT_NAME}}"
|
|
host_bucket_check=$(ceph osd tree | awk '/'"${host_bucket_name}"'/{print $0}' | wc -l)
|
|
if [[ "${host_bucket_check}" -eq 0 ]]; then
|
|
ceph osd crush add-bucket "${host_bucket_name}" host
|
|
ceph osd crush move "${host_bucket_name}" root=${CEPH_ROOT_NAME:-default}
|
|
fi
|
|
|
|
# Adding osd to crush map
|
|
ceph osd crush add "${OSD_ID}" "${OSD_INITIAL_WEIGHT}" host="${HOSTNAME}${CEPH_ROOT_NAME:+-${CEPH_ROOT_NAME}}"
|
|
|
|
# Setting partition name based on ${OSD_ID}
|
|
if [[ "${OSD_STORETYPE}" == "bluestore" ]]; then
|
|
sgdisk "--change-name=${OSD_PARTITION_NUM}:KOLLA_CEPH_DATA_BS_${OSD_ID}" "--typecode=${OSD_PARTITION_NUM}:${CEPH_OSD_TYPE_CODE}" -- "${OSD_BS_DEV}"
|
|
else
|
|
sgdisk "--change-name=${OSD_PARTITION_NUM}:KOLLA_CEPH_DATA_${OSD_ID}" "--typecode=${OSD_PARTITION_NUM}:${CEPH_OSD_TYPE_CODE}" -- "${OSD_DEV}"
|
|
sgdisk "--change-name=${JOURNAL_PARTITION_NUM}:KOLLA_CEPH_DATA_${OSD_ID}_J" "--typecode=${JOURNAL_PARTITION_NUM}:${CEPH_JOURNAL_TYPE_CODE}" -- "${JOURNAL_DEV}"
|
|
fi
|
|
partprobe || true
|
|
|
|
exit 0
|
|
fi
|
|
|
|
OSD_DIR="/var/lib/ceph/osd/ceph-${OSD_ID}"
|
|
if [[ "${OSD_STORETYPE}" == "bluestore" ]]; then
|
|
ARGS="-i ${OSD_ID}"
|
|
else
|
|
ARGS="-i ${OSD_ID} --osd-journal ${JOURNAL_PARTITION} -k ${OSD_DIR}/keyring"
|
|
fi
|