#!/bin/bash -e # # Copyright (C) 2015 ScyllaDB . /usr/lib/scylla/scylla_lib.sh print_usage() { echo "scylla-raid-setup --disks /dev/hda,/dev/hdb... --raiddev /dev/md0 --update-fstab --root /var/lib/scylla --volume-role [all|data|commitlog]" echo " --disks specify disks for RAID" echo " --raiddev MD device name for RAID" echo " --update-fstab update /etc/fstab for RAID" echo " --root specify the root of the tree" echo " --volume-role specify how will this device be used (data, commitlog, or all)" exit 1 } RAID=/dev/md0 FSTAB=0 ROOT=/var/lib/scylla ROLE="all" while [ $# -gt 0 ]; do case "$1" in "--disks") DISKS=`echo "$2"|tr -s ',' ' '` NR_DISK=$((`echo "$2"|grep , -o|wc -w` + 1)) shift 2 ;; "--raiddev") RAID="$2" shift 2 ;; "--update-fstab") FSTAB=1 shift 1 ;; "--root") ROOT="$2" shift 2 ;; "--volume-role") ROLE="$2" shift 2 ;; *) print_usage ;; esac done ROOT=${ROOT%/} case "$ROLE" in "all") MOUNT_AT=$ROOT ;; "data") MOUNT_AT="$ROOT/data" ;; "commitlog") MOUNT_AT="$ROOT/commitlog" ;; *) echo "Invalid role specified ($ROLE)" print_usage ;; esac if [ "$DISKS" = "" ]; then print_usage fi for dsk in $DISKS; do if [ ! -b $dsk ]; then echo "$dsk is not found" exit 1 fi done echo Creating RAID0 for scylla using $NR_DISK disk\(s\): $DISKS if [ -e $RAID ]; then echo "$RAID is already using" exit 1 fi if mountpoint -q $MOUNT_AT; then echo "$MOUNT_AT is already mounted" exit 1 fi if is_debian_variant; then env DEBIAN_FRONTEND=noninteractive apt-get -y install mdadm xfsprogs else yum -y install mdadm xfsprogs fi if [ "$ID" = "ubuntu" ] && [ "$VERSION_ID" = "14.04" ]; then mdadm --create --verbose --force --run $RAID --level=0 -c1024 --raid-devices=$NR_DISK $DISKS mkfs.xfs $RAID -f else for dsk in $DISKS; do blkdiscard $dsk & done wait mdadm --create --verbose --force --run $RAID --level=0 -c1024 --raid-devices=$NR_DISK $DISKS mkfs.xfs $RAID -f -K fi mdadm --detail --scan > /etc/mdadm.conf mkdir -p "$MOUNT_AT" mount -t xfs -o noatime $RAID "$MOUNT_AT" # create this unconditionally so we are more robust about ordering # if the script is run multiple times. But must do after mount in case # we are mounting the root mkdir -p "$ROOT/data" mkdir -p "$ROOT/commitlog" mkdir -p "$ROOT/coredump" chown scylla:scylla "$ROOT" chown scylla:scylla "$ROOT"/* if [ $FSTAB -ne 0 ]; then UUID=`blkid $RAID | awk '{print $2}'` echo "$UUID $MOUNT_AT xfs noatime 0 0" >> /etc/fstab fi