Linux

在引導時掛載 iSCSI 驅動器 - 系統停止

  • December 14, 2021

我在裝有 OS X 10.10 的 Mac 上的 VirtualBox VM 中執行 Oracle Linux 7(基於 CentOS / RedHat 的發行版)。我有一個 Synology Diskstation 作為 iSCSI 目標。

我已成功連接到 Synology,對磁碟進行分區並創建了文件系統。它被稱為/dev/sdb和分區是/dev/sdb1。現在,我想做的是創建一個掛載點,以便我可以輕鬆訪問它:

   mount /dev/sdb1 /mnt/www

該命令有效。但顯然,它不會在重新啟動後持續存在。不用擔心……/etc/fstab我們開始吧。

首先,我獲得了分區的 UUID 以確保我始終使用正確的設備:

   blkid /dev/sdb1

Result:
   /dev/sdb1: UUID="723eb295-8fe0-409f-a75f-a26eede8904f" TYPE="ext3"

現在,我將以下行插入我的/etc/fstab

   UUID=723eb295-8fe0-409f-a75f-a26eede8904f /mnt/www    ext3   defaults   0 0

重新啟動後,系統崩潰並進入維護模式。如果我刪除我插入的行,一切都會再次工作。但是,我正在逐字遵循Oracle-Base的說明

我知道我錯過了一些東西..有人能指出我正確的方向嗎?

只需通過“_netdev”更改參數“defaults”,如下所示:

UUID=723eb295-8fe0-409f-a75f-a26eede8904f /mnt/www ext3 _netdev 0 0

這樣掛載點只有在網路正確啟動後才會掛載。

介紹:

這是在引導時安裝 iSCSI 驅動器的SystemD替代方案。

在引導時掛載 iSCSI 磁碟是一個 (2) 步驟過程:

  1. LUN 必須由主機連接
  2. 然後掛載到本地文件系統上的一個點。

使用 Ubuntu 20.04 LTS 開發的腳本- 粘貼在以下答案中 這確實是一項繁瑣而乏味的工作。截至發布之日,它們可以正常工作並產生一致、正確的結果。

要將腳本直接下載到安裝 iSCSI 驅動器的主機:

git clone https://github.com/f1linux/iscsi-automount.git

請注意, Github 儲存庫中的完整腳本中有一些Debian 特定的命令dpkg:下面的刪節腳本是特定於發行版的,應該適用於使用 SystemD 的任何發行版。

先決條件:

  1. open-iscsi安裝和它的配置文件/etc/iscsi/iscsid.confinitiatorname.iscsi配置。
  2. iscsiadm在執行腳本之前使用命令手動測試連接。

(2) 腳本:

config-iscsi-storage.sh:通過創建名為connect-luns.service的 SystemD 服務在啟動時自動連接 LUN 。該腳本必須首先執行。連接 LUN 後,您必須在執行下一個腳本之前對其進行下一個分區並在其上放置一個文件系統。

config-iscsi-storage-mounts.sh: 自動將連接的分區 iSCSI 磁碟與文件系統掛載到本地文件系統上的掛載點,作為啟動時的 SystemD 掛載。

腳本:

注意:我已經echo從腳本中刪除了’ed 回饋、說明和其他碎片,以幫助您輕鬆閱讀以評估它們的操作。

config-iscsi-storage.sh

#######   SET VARIABLES   #######

# Host exposing the LUNs:
STORAGEIP=''

# Get this value from the storage host exposing the LUN:
IQNTARGET=''


if [ ! -d /root/scripts ]; then
   mkdir /root/scripts
fi


if [ ! -f /root/scripts/connect-luns.sh ]; then 

cat <<EOF> /root/scripts/connect-luns.sh
#!/bin/bash

# Use of "sendtargets" necessary to wake up the Synology Storage Host:
iscsiadm -m discovery -t sendtargets -p $STORAGEIP

# The iscsiadm command to CONNECT the LUN lives in this file
iscsiadm -m node -T $IQNTARGET -p $STORAGEIP:3260 --login
EOF

chmod 700 /root/scripts/connect-luns.sh
chown root:root /root/scripts/connect-luns.sh

else
   echo "iscsiadm -m node -T $IQNTARGET -p $STORAGEIP:3260 --login" >> /root/scripts/connect-luns.sh
fi

if [ ! -f /root/scripts/disconnect-luns.sh ]; then

cat <<EOF> /root/scripts/disconnect-luns.sh
#!/bin/bash

# The iscsiadm command to DISCONNECT the LUN lives in this file
iscsiadm -m node -T $IQNTARGET -p $STORAGEIP:3260, 1 -u
EOF

chmod 700 /root/scripts/disconnect-luns.sh
chown root:root /root/scripts/disconnect-luns.sh

else
   echo "iscsiadm -m node -T $IQNTARGET -p $STORAGEIP:3260, 1 -u" >> /root/scripts/disconnect-luns.sh
fi

if [ ! -f /etc/systemd/system/connect-luns.service ]; then

cat <<EOF> /etc/systemd/system/connect-luns.service
[Unit]
Description=Connect iSCSI LUN
Documentation=https://github.com/f1linux/iscsi-automount
Requires=network-online.target
DefaultDependencies=no

[Service]
User=root
Group=root
Type=oneshot
RemainAfterExit=true
ExecStart=/root/scripts/connect-luns.sh "Connecting LUN"
StandardOutput=journal

[Install]
WantedBy=multi-user.target

EOF

chmod 644 /etc/systemd/system/connect-luns.service

systemctl daemon-reload
systemctl enable connect-luns.service
systemctl start connect-luns.service

fi

iscsiadm -m discovery -t sendtargets -p $STORAGEIP
fdisk -l

echo
echo "$(tput setaf 5)#######   NEXT STEPS:   #######$(tput sgr 0)"
echo
echo 'STEP 1: Find the iSCSCI disk in the output above and then partition it,'
echo '       ie: fdisk /dev/sdX where "X" is the letter of the iSCSI disk'
echo
echo 'STEP 2: Format the iSCSI disk with a filesystem'
echo '       ie: mkfs.ext4 /dev/sdX1 where the iSCSI disk is /dev/sdX'
echo
echo 'STEP 3: Execute script config-iscsi-storage-mounts.sh to configure auto-mounting the iSCSI disk'
echo '        to configure mounting the newly formatted iSCSI disks on boot'
echo

config-iscsi-storage-mounts.sh

#######   SET VARIABLES   #######

# Use 'fdisk -l' to identify the iSCSI disk
ISCSIDEVICE='sda1'

# The script will create the folder with the name supplied in "ISCSIDISKMOUNTFOLDER" variable
# in the path /mnt. Therefore do NOT manually create the folder the LUN is mounted to.
#
# NAMING REQUIREMENTS: Do NOT specify a folder name with a hypen in folder name that the LUN will be mounted on.
#         This will cause the SystemD mount to fail.
#         ie: "logsproxy" is a valid name and WILL work but "logs-proxy" will NOT and cause the mount to fail.
#
ISCSIDISKMOUNTFOLDER='logs'

# Filesystem type the LUN was formatted for which is supplied in the 'Type' field below
FILESYSTEM='ext4'

# SystemD mount file comment:
# Below variable sets "Description" field in the file that starts the mount.
MOUNTDESCRIPTION='Persistent Data living on iSCSI LUN'

## NOTE: Most settings below show work out of the box

if [ ! -d /mnt/$ISCSIDISKMOUNTFOLDER ]; then
   mkdir /mnt/$ISCSIDISKMOUNTFOLDER
   chmod 770 /mnt/$ISCSIDISKMOUNTFOLDER
fi

if [ ! -f /etc/systemd/system/mnt-$ISCSIDISKMOUNTFOLDER.mount ]; then

cat <<EOF> /etc/systemd/system/mnt-$ISCSIDISKMOUNTFOLDER.mount
[Unit]
Description=$MOUNTDESCRIPTION
After=connect-luns.service
DefaultDependencies=no

[Mount]
What=/dev/disk/by-uuid/$(ls -al /dev/disk/by-uuid | grep $ISCSIDEVICE | awk '{print $9}')
Where=/mnt/$ISCSIDISKMOUNTFOLDER
Type=$FILESYSTEM
StandardOutput=journal

[Install]
WantedBy=multi-user.target

EOF

chown root:root /etc/systemd/system/mnt-$ISCSIDISKMOUNTFOLDER.mount
chmod 644 /etc/systemd/system/mnt-$ISCSIDISKMOUNTFOLDER.mount

systemctl daemon-reload
systemctl enable mnt-$ISCSIDISKMOUNTFOLDER.mount
sudo systemctl start mnt-$ISCSIDISKMOUNTFOLDER.mount

else
   echo "'/etc/systemd/system/mnt-$ISCSIDISKMOUNTFOLDER.mount' already exists"
fi

echo
echo "$(tput setaf 5)#######   NEXT STEPS:   #######$(tput sgr 0)"
echo
echo 'Reboot and verify that the iscsi disk automatically mounted on boot using the "mount" command'
echo

結論:

如您所見,連接 iSCSI 磁碟是一項繁瑣的工作。希望這可以為您節省一些繁重的工作-

引用自:https://unix.stackexchange.com/questions/195116