ablecloud-team / ablestack-cloud

Apache Cloudstack
Apache License 2.0
1 stars 12 forks source link

NFS, iSCSI, SMB 프로토콜 서비스용 VM 생성 및 관리 기능 #284

Open jschoiRR opened 1 year ago

jschoiRR commented 1 year ago

Mold(사용자용) 스토리지 VM 배포 UI 설계

Mold(관리자용) 스토리지 VM UI 설계

ServiceVM 생성 후 Cloudbase-Init 및 템플릿 구성 연구

  • [x] 디스크 자동 할당 및 확장, IP세팅 연구
  • [x] NFS 서비스 구성 연구
  • [x] iSCSI 서비스 구성 연구
  • [x] SMB 서비스 구성 연구
  • [x] 환경 구성 스크립트 iso 이미지로 생성연구(가상머신 생성 시 iso attach)

Mold UI 개발 (다영)

Mold API 개발(진성)

  • [x] 목록 조회 기능 개발
  • [x] 공유스토리지 가상머신 배포 기능 개발 (진행중)
  • 고려사항
  • 템플릿을 UI 에서 선택 or API 에서 서비스용 템플릿 ID를 가져와 사용? (고정으로 가면 mold 초기 구성시 템플릿이 업로드 된 상태여야 함)
  • 쉘 스크립트 및 패키지를 포함한 ISO도 마찬가지..?
  • [x] 서비스 시작, 정지, 삭제 기능 개발
  • [ ] 디스크 확장 기능 개발
  • [ ] 네트워크 추가 기능 개발

스크립트 개발(홍욱)

jeongda-young commented 1 year ago

cloud-init user-data test

L2 network로 Centos8-cloud-init 가상 머신을 만들어서 테스트

cloud-config

users:

jeongda-young commented 1 year ago

cloud-init 볼륨 확장

cloud-config

disk_setup: ephemeral: false devices:

fs_resize:

growpart: mode: auto devices:

!/bin/bash

사용 가능한 모든 EBS 볼륨을 가져옵니다. VOLUMES=$(lsblk -o NAME,TYPE | grep disk | awk '{print $1}')

for VOLUME in $VOLUMES; do 파일 시스템이 xfs 인 경우 if [ $(sudo file -s /dev/$VOLUME | grep -c xfs) -gt 0 ]; then 현재 파일 시스템 용량을 확인합니다. SIZE=$(sudo xfs_info /dev/$VOLUME | awk '/blocks/ {print $3}')

 EBS 볼륨 용량을 확인합니다.
BLOCK_SIZE=$(sudo blockdev --getsize64 /dev/$VOLUME)
NEW_SIZE=$((BLOCK_SIZE / 1024 / 1024 / 1024))

 EBS 볼륨 용량이 파일 시스템 용량보다 큰 경우
if [ $NEW_SIZE -gt $SIZE ]; then
   파일 시스템 크기를 조정합니다.
  sudo xfs_growfs /mnt/data

  파일 시스템을 마운트합니다.
  sudo mount /dev/$VOLUME /mnt/data
fi

fi done

jschoiRR commented 1 year ago

스토리지VM UI 및 흐름도-관리자 스토리지VM UI 및 흐름도-관리자

스토리지VM UI 및 흐름도-사용자 스토리지VM UI 및 흐름도-사용자

jeongda-young commented 1 year ago

nfs 서비스 구성

!/bin/bash

필요한 패키지 설치 sudo dnf install -y nfs-utils nfs4-acl-tools

새 디스크 파티션 및 포맷 sudo fdisk /dev/sdb sudo mkfs.xfs /dev/sdb1

새 디스크 생성 및 마운트 sudo mkdir /data1 sudo mount /dev/sdb1 /data1

sudo mkdir -p /var/nfs/share sudo mkdir -p /home

NFS 서버 설정 mkdir -p /var/nfs/share

echo "/var/nfs/share 10.10.254.136(rw,sync,no_subtree_check)" >> /etc/exports echo "/home 10.10.254.136(rw,sync,no_root_squash,no_subtree_check)" >> /etc/exports echo "/dev/sdb1 /data1 10.10.254.136(rw,sync,no_subtree_check)" >> /etc/exports exportfs -arv

systemctl enable nfs-server.service systemctl start nfs-server.service

마운트 지점 추가 echo "/dev/sdb1 /data1 /xfs defaults 0 0" >> /etc/fstab echo "/var/nfs/share /nfs/share nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" >> /etc/fstab echo "/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" >> /etc/fstab

nfs-client

!/bin/bash

nfs-utils 및 nfs4-acl-tools 설치 sudo dnf install nfs-utils nfs4-acl-tools -y

nfs 마운트 디렉토리 생성 sudo mkdir -p /nfs/share sudo mkdir -p /nfs/home

nfs 마운트 sudo mount host_ip:/var/nfs/share /nfs/share sudo mount host_ip:/home /nfs/home

테스트 파일 생성 sudo touch /nfs/share/test.txt sudo touch /nfs/home/home.txt

fstab 설정 echo "host_ip:/var/nfs/share /nfs/share nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" | sudo tee -a /etc/fstab echo "host_ip:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" | sudo tee -a /etc/fstab

nfs 마운트 실행 mount_nfs

fstab 설정 실행 set_fstab

nfs 마운트 해제 예시 umount_nfs

jeongda-young commented 1 year ago

nfs data-disk mount

!/bin/bash

sudo dnf install -y nfs-utils nfs4-acl-tools parted /dev/sdb mklabel gpt mkpart primary 0% 100%

sudo mkfs.xfs /dev/sdb1 sudo mkdir /data1 sudo mount /dev/sdb1 /data1

echo "/mnt/data *(rw,sync,no_root_squash)" >> /etc/exports exportfs -a

systemctl start nfs-utils systemctl enable nfs-utils systemctl restart nfs-utils

mount -t nfs -o rw,vers=4 127.0.0.1:/mnt/data /mnt/data

jeongda-young commented 1 year ago

smb data-disk mount 및 서비스 구성

!/bin/bash

sudo dnf install -y samba samba-client samba-common sudo dnf install -y xfsprogs

sudo parted /dev/sdb mklabel gpt mkpart primary 0% 100% sudo mkfs.xfs /dev/sdb1

sudo mkdir /mnt/data

sudo mount /dev/sdb1 /mnt/data

echo "[data] path = /mnt/data read only = no browseable = yes" | sudo tee -a /etc/samba/smb.conf

sudo systemctl start smb sudo systemctl enable smb

sudo firewall-cmd --permanent --zone=public --add-service=samba sudo firewall-cmd --reload

echo "/dev/sdb1 /mnt/data xfs defaults 0 0" >> /etc/fstab

smb-nic 추가

!/bin/bash

sudo dnf install -y samba samba-client samba-common sudo dnf install -y xfsprogs

sudo parted /dev/sdb mklabel gpt mkpart primary 0% 100% sudo mkfs.xfs /dev/sdb1

sudo mkdir /mnt/data

sudo mount /dev/sdb1 /mnt/data

echo "[data] path = /mnt/data read only = no browseable = yes" | sudo tee -a /etc/samba/smb.conf

IP_ADDRESS="192.168.0.100" NETMASK="255.255.255.0" GATEWAY="192.168.0.1"

sudo sed -i 's/; bind interfaces only = yes/bind interfaces only = yes/' /etc/samba/smb.conf sudo sed -i 's/; interfaces = 127.0.0.0\/8 ens3/interfaces = '$IP_ADDRESS'\/'$NETMASK'/' /etc/samba/smb.conf

sudo ip addr flush dev ens3 sudo ip addr add $IP_ADDRESS/$NETMASK dev ens3 sudo ip route add default via $GATEWAY dev ens3

sudo systemctl restart networking

sudo systemctl restart smbd sudo systemctl restart nmbd

echo "/dev/sdb1 /mnt/data xfs defaults 0 0" >> /etc/fstab

jeongda-young commented 1 year ago

iscsi data-disk mount 및 서비스 구성

!/bin/bash

필요한 패키지 설치 sudo dnf install -y targetcli sudo dnf install -y xfsprogs

디스크 파티션 생성 및 포맷 sudo parted /dev/sdb mklabel gpt mkpart primary 0% 100% sudo mkfs.xfs /dev/sdb1

iSCSI target 구성 sudo targetcli /backstores/block create iscsi_store /dev/sdb1 sudo targetcli /iscsi create iqn.2023-04.com.example:storage.target01 sudo targetcli /iscsi/iqn.2023-04.com.example:storage.target01/tpg1/luns create /backstores/block/iscsi_store sudo targetcli /iscsi/iqn.2023-04.com.example:storage.target01/tpg1/acls create iqn.2023-04.com.example:storage.initiator01

target 서비스 시작 및 부팅 시 자동 시작 설정 sudo systemctl start target sudo systemctl enable target

iSCSI 연결 설정 sudo iscsiadm -m discovery -t st -p 127.0.0.1 sudo iscsiadm -m node -T iqn.2023-04.com.example:storage.target01 -p 127.0.0.1:3260 -l

마운트 디렉토리 생성 및 마운트 sudo mkdir /mnt/data sudo mount /dev/sdb1 /mnt/data

fstab 설정 echo "/dev/sdb1 /mnt/data xfs _netdev 0 0" | sudo tee -a /etc/fstab

client

!/bin/bash

iSCSI initiator utils 설치 yum install -y iscsi-initiator-utils

initiator 이름 설정 echo "InitiatorName=iqn.mydisk.com:storage.disk1" > /etc/iscsi/initiatorname.iscsi

iscsid 서비스 시작 systemctl start iscsid

타겟 검색 iscsiadm -m discovery -t sendtargets -p ${ISCSI_SERVER_IP}

타겟 로그인 iscsiadm -m node -T ${IQN_NAME} -p ${ISCSI_SERVER_IP}:3260,1 --login

세션 정보 확인 iscsiadm -m session -o show

jschoiRR commented 1 year ago
jeongda-young commented 1 year ago

nic - 고정 ip setting

!/bin/bash

NIC 이름

NIC_NAME="ens3"

파일 수정 echo "NAME=$NIC_NAME" > /etc/sysconfig/network-scripts/ifcfg-$NIC_NAME echo "IPADDR=10.10.254.117" >> /etc/sysconfig/network-scripts/ifcfg-$NIC_NAME echo "PREFIX=16" >> /etc/sysconfig/network-scripts/ifcfg-$NIC_NAME echo "GATEWAY=10.10.0.1" >> /etc/sysconfig/network-scripts/ifcfg-$NIC_NAME echo "DNS1=8.8.8.8" >> /etc/sysconfig/network-scripts/ifcfg-$NIC_NAME echo "ONBOOT=yes" >> /etc/sysconfig/network-scripts/ifcfg-$NIC_NAME echo "TYPE=Ethernet" >> /etc/sysconfig/network-scripts/ifcfg-$NIC_NAME echo "BOOTPROTO=static" >> /etc/sysconfig/network-scripts/ifcfg-$NIC_NAME echo "DEVICE=$NIC_NAME" >> /etc/sysconfig/network-scripts/ifcfg-$NIC_NAME

NetworkManager 재시작 systemctl restart NetworkManager

jschoiRR commented 1 year ago

VM 생성 시 데이터 디스크 파티션 및 마운트

# df -h
# lsblk (새로 추가된 디스크 확인)

# fdisk /dev/sdb
  => n, 엔터, 엔터, 엔터, 엔터, 엔터, t, 8e, w

# pvdisplay
# pvcreate /dev/sdb1

#  vgcreate able /dev/sdb1
#  vgdisplay

#  lvcreate -l 100%FREE -n lv_data able
#  lvdisplay

#  mkfs.xfs /dev/able/lv_data

# mkdir /mnt/share
# mount /dev/able/lv_data /mnt/share

# vi /etc/fstab
/dev/able/lv_data /mnt/share xfs  defaults 1 2

or

# echo "/dev/able/lv_data /mnt/share xfs  defaults 1 2" >> /etc/fstab

#  df -h (마운트 확인)

데이터 디스크 추가 시(확장)

# fdisk /dev/sdc
  => n, 엔터, 엔터, 엔터, 엔터, 엔터, t, 8e, w
# fdisk -l

# vgextend able /dev/sdc1

# lvextend -l +100%FREE /dev/able/lv_data

# xfs_growfs /dev/mapper/able-lv_data
stardom3645 commented 1 year ago
[클릭] 메인 스크립트(ISO 마운트, 네트워크 설정, 전역변수 설정) ## 메인 스크립트 ```sh #!/bin/bash ############################################ SELinux permissive setenforce 0 ############################################ ISO Mount ## Check if the ISO is already mounted if grep -qs "/iso/" /proc/mounts; then echo "iso is already mounted" else ## If the ISO is not mounted, mount it echo "Mounting iso..." mount -o loop "iso" /iso ## Wait until the ISO is mounted while ! grep -qs "/iso" /proc/mounts; do echo "Waiting for iso to be mounted..." sleep 1 done echo "iso_name has been mounted" fi ############################################ Network Setting # Execute a command or operation and store the result in an array result_array=($(ls /sys/class/net)) # Iterate over the array to assign values to variables for ((i=0; i<(${#result_array[@]})-1; i++)); do variable_name="INTERFACES_$i" eval "$variable_name=${result_array[i]}" ## Classify SSV Network Type SSV_NETWORK_TYPE=$(jq -r '.["ssv.networks"][0]."ssv.network.type"' /ssv/ssv_userdata.json) if [ ${SSV_NETWORK_TYPE} = "L2" ];then SSV_NETWORK_IP=$(jq -r '.["ssv.networks"][0]."ssv.network.ip"' /ssv/ssv_userdata.json) SSV_NETWORK_L2_GATEWAY=$(jq -r '.["ssv.networks"][0]."ssv.network.l2.gateway"' /ssv/ssv_userdata.json) SSV_NETWORK_L2_NETMASK=$(jq -r '.["ssv.networks"][0]."ssv.network.l2.netmask"' /ssv/ssv_userdata.json) #SSV_NETWORK_L2_DNS=$(jq -r '.["ssv.networks"][0]."ssv.network.l2.dns"' /ssv/ssv_userdata.json) SSV_NETWORK_L2_DNS=8.8.8.8 ## Chaning to static IP echo "NAME="${result_array[i]}" IPADDR=$SSV_NETWORK_IP NETMASK=$SSV_NETWORK_L2_NETMASK GATEWAY=$SSV_NETWORK_L2_GATEWAY DNS1=$SSV_NETWORK_L2_DNS ONBOOT=yes TYPE=Ethernet BOOTPROTO=static DEVICE=${result_array[i]}" > /etc/sysconfig/network-scripts/ifcfg-"${result_array[i]}" ## Restart NetworkManager start systemctl restart NetworkManager fi done ############################################ Disk Setting # Unparted disk lsblk -rno "NAME,TYPE" | awk '$2=="disk" {print $1}' | sort > ~/disk_list.txt lsblk -rno "NAME,TYPE" | awk '$2=="part" {gsub(/[0-9]/,"",$1); print $1}' | sort | uniq > ~/part_list.txt unparted_disk=$(comm -3 ~/disk_list.txt ~/part_list.txt | tr -d ' ') NEW_DISK=$unparted_disk # Check sdc disk lsblk -rno "NAME" | awk '$1=="sdc" {print $1}' > ~/check_sdc.txt | tr -d ' ' CHECK_SDC=$(cat ~/check_sdc.txt) SSV_TYPE=$(jq -r '.["ssv.type"]' /ssv/ssv_userdata.json) if [ "$SSV_TYPE" = "NFS" ]; then if [ "$NEW_DISK" = "sdb" ] && [ "$CHECK_SDC" != "sdc" ]; then # Partition the disk with fdisk parted /dev/${NEW_DISK} mklabel msdos mkpart primary ext4 0% 100% vgcreate vgroup /dev/${NEW_DISK}1 lvcreate -l 100%FREE -n lv_data vgroup # New disk partition and format with xfs mkfs.xfs /dev/vgroup/lv_data # Extract first sdb1 disk's uuid SDB_UUID=$(blkid -o value -s UUID "/dev/sdb1") # Create a mount point and mount the partition mkdir /mnt/share/ mount /dev/vgroup/lv_data /mnt/share # Add an entry to /etc/fstab so the partition is mounted at boot time echo "/dev/vgroup/lv_data /mnt/share xfs defaults 0 0" >> /etc/fstab mount -a # Install required packages rpm -i /iso/nfs/rpm/* # NFS server settings mkdir -p /mnt/share/nfs # Export nfs configuration echo "/mnt/share/nfs *(rw,sync,no_subtree_check)" >> /etc/exports exportfs -arv # Enable and start nfs service sudo systemctl enable nfs-server.service sudo systemctl start nfs-server.service # Add firewall policy sudo firewall-cmd --zone=public --permanent --add-service={nfs,mountd,rpc-bind} sudo firewall-cmd --reload elif [ "$NEW_DISK" = "sdb" ] && [ "$CHECK_SDC" = "sdc" ]; then # Partition the disk with fdisk parted /dev/${NEW_DISK} mklabel msdos mkpart primary ext4 0% 100% # Extend volume vgextend vgroup /dev/sdb1 lvextend -l +100%FREE /dev/vgroup/lv_data xfs_growfs /dev/mapper/vgroup-lv_data elif [ "$NEW_DISK" = "" ]; then echo 'NO NEW_DISK' fi # rm trash rm -f ~/disk_list.txt ~/part_list.txt ~/check_sdc.txt elif [ ${SSV_TYPE} = "smb" ];then sh /iso/smb/script/smb.sh elif [ ${SSV_TYPE} = "iscsi" ];then sh /iso/iscsi/script/iscsi.sh else echo 'ERROR' fi ```