Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
8 of 17 tasks
Tracked by #281 ...
jschoiRR opened this issue Apr 11, 2023 · 11 comments
Open
8 of 17 tasks
Tracked by #281 ...
Assignees

Comments

@jschoiRR
Copy link

jschoiRR commented Apr 11, 2023

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

  • 스토리지VM 생성시 필요항목 정의
    • 이름, 설명, Zone, 프로토콜 선택{NFS, iSCSI, SMB}, 템플릿, 데이터디스크,사이즈, 네트워크, IP, GW, Netmask
  • 스토리지VM 생성 후 상세화면에서 엔드포인트 및 사용방식 안내 제공 필요

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

  • 스토리지VM 현황 목록
  • 상세 화면에서 VM 상세화면에서 엔드포인트 및 사용방식 안내 제공
  • 서비스 제어 버튼(가상머신 정지, 시작, 재시작, 삭제, 네트워크 추가, 디스크 확장)
  • 사용자 계정 별 스토리지VM 스토리지(디스크) 사이즈 제한

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

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

Mold UI 개발 (다영)

  • 관리자 공유 스토리지 메뉴 개발(인프라스트럭처 메뉴 아래) (진행중)
    • 목록, 상세 화면 개발
    • 가상머신 시작, 정지, 재시작, 삭제, 디스크 확장, 네트워크 추가 기능 개발
  • 사용자 공유스토리지 메뉴 개발(스토리지 메뉴 아래)
    • 목록, 상세화면 개발
    • 가상머신 시작, 정지, 재시작, 삭제, 디스크 확장, 네트워크 추가 기능 개발

Mold API 개발(진성)

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

스크립트 개발(홍욱)

  • 공유 스토리지 서비스 프로토콜 별 환경 세팅 스크립트 개발( nfs, smb, iscsi ) (nfs 진행중)
  • L2 네트워크 일 경우 NIC환경 세팅(isolated 네트워크 일 경우 x)
  • 가상머신 생성시 데이터 디스크 확장 후 마운트
  • 디스크 추가시 자동 확장
  • 네트워크 추가시 NIC 세팅
@jschoiRR jschoiRR mentioned this issue Apr 11, 2023
27 tasks
@jschoiRR jschoiRR changed the title 스토리지 > NFS, iSCSI 스토리지 생성 기능 NFS, iSCSI, SMB 프로토콜 컨트롤VM 생성 및 관리 기능 Apr 12, 2023
@jschoiRR jschoiRR changed the title NFS, iSCSI, SMB 프로토콜 컨트롤VM 생성 및 관리 기능 NFS, iSCSI, SMB 프로토콜 서비스용 VM 생성 및 관리 기능 Apr 12, 2023
@gigs4014 gigs4014 self-assigned this Apr 13, 2023
@jeongda-young
Copy link

cloud-init user-data test

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

#cloud-config
users:

  • default
  • name: user2
    gecos: User N. Ame
    selinux-user: staff_u
    groups: users,wheel
    ssh_pwauth: True
    ssh_authorized_keys:
    • ssh-rsa AA..vz [email protected]
      chpasswd:
      list: |
      root:password
      cloud-user:mypassword
      user2:mypassword2
      expire: False

@jeongda-young
Copy link

jeongda-young commented Apr 17, 2023

cloud-init 볼륨 확장

#cloud-config

disk_setup:
ephemeral: false
devices:
- /dev/sda2
layout:
- label: root
filesystem: xfs
device: /dev/sda2

fs_resize:

  • /dev/sda2

growpart:
mode: auto
devices:
- /dev/sda2

#!/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
Copy link
Author

jschoiRR commented Apr 19, 2023

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

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

@jeongda-young
Copy link

jeongda-young commented Apr 19, 2023

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
Copy link

jeongda-young commented Apr 24, 2023

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
Copy link

jeongda-young commented Apr 24, 2023

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
Copy link

jeongda-young commented Apr 24, 2023

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
Copy link
Author

jschoiRR commented Apr 25, 2023

  • ISO 이미지 생성
mkisofs -o test.iso /mnt
mount -t iso9660 -o loop test.iso /mnt  => iso를 마운트 할때
  • Mold 이미지> ISO > ISO 등록
  • 가상머신에 iso 연결 후 콘솔접속
mkdir /iso
mount /dev/cdrom /iso  => 연결된 iso 이미지는 가상머신의 /dev/cdrom 으로 연결됨
  • 현재 추가된 물리 디스크 용량(GB)
fdisk -l | grep 'Disk /dev/sd[b-z]' | awk '{ sub(/,/,""); sum +=$5;} END { print sum/1024/1024/1024  }'
또는
lsblk -o NAME,SIZE | egrep sd[b-z]

@jeongda-young
Copy link

jeongda-young commented Apr 25, 2023

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
Copy link
Author

jschoiRR commented Apr 25, 2023

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
Copy link

stardom3645 commented May 12, 2023

[클릭] 메인 스크립트(ISO 마운트, 네트워크 설정, 전역변수 설정)

메인 스크립트

#!/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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants