九州大学スパコンGENKAI上の共有ディレクトリを、SSH経由の rsync で大阪大学スパコンOCTOPUSへコピーする方法を説明です。東京大学MIYABIでも同様に可能でした.他のスパコンでも同様にできる可能性が高いと思います.
例として、GENKAI側の
/home/PROJECT_ID/share/Data/<DIR_NAME>/
を、OCTOPUS側の
/octfs/work/OCT_GROUP/share/Data/<DIR_NAME>/
へコピーします。
コピー先は、OCTOPUSのグループメンバーが読み取り専用で利用する共有データ置き場とします。グループメンバーはファイルの読み取りとディレクトリの移動・一覧表示ができますが、書き込み、削除、リネームはできません。
1. 仮名・置換対象
以下の仮名を、自分の環境に合わせて置き換えます。
GENKAI_USER="GENKAI_ACCOUNT"
GENKAI_HOST="genkai.hpc.kyushu-u.ac.jp"
GENKAI_PROJECT="PROJECT_ID"
OCT_GROUP="OCT_GROUP"
REMOTE_DATA_DIR="/home/PROJECT_ID/share/Data"
LOCAL_DATA_DIR="/octfs/work/OCT_GROUP/share/Data"
SSH_KEY="${HOME}/.ssh/genkai_from_octopus"
| 仮名 | 意味 |
|---|---|
GENKAI_ACCOUNT |
GENKAIのスーパーコンピュータアカウント |
PROJECT_ID |
GENKAI側のプロジェクト名または共有ディレクトリ名 |
OCT_GROUP |
OCTOPUSのグループ名 |
genkai_from_octopus |
OCTOPUSからGENKAIへSSH接続するための秘密鍵ファイル |
2. OCTOPUS上でSSH鍵を作成する
以下はOCTOPUS上で実行します。
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/genkai_from_octopus -C "genkai_from_octopus"
chmod 600 ~/.ssh/genkai_from_octopus
chmod 644 ~/.ssh/genkai_from_octopus.pub
公開鍵を表示します。
cat ~/.ssh/genkai_from_octopus.pub
表示された公開鍵をGENKAIの利用申請ポータルに登録します。
外部へ登録・コピーするのは公開鍵だけです。
~/.ssh/genkai_from_octopus.pub
秘密鍵は外部へ出してはいけません。
~/.ssh/genkai_from_octopus
3. OCTOPUSからGENKAIへのSSH接続を確認する
OCTOPUS上で実行します。
ssh -i ~/.ssh/genkai_from_octopus -l GENKAI_ACCOUNT genkai.hpc.kyushu-u.ac.jp
ログインできたら、GENKAIから抜けます。
exit
4. OCTOPUS上でコピースクリプトを作成する
以下をOCTOPUS上で実行して、スクリプトを作成します。
cat > ~/copy_data_from_genkai.sh <<'EOF'
#!/bin/bash
# copy_data_from_genkai.sh
#
# Run this script on OCTOPUS.
#
# Copy one or more directories from GENKAI:
# /home/PROJECT_ID/share/Data/<DIR_NAME>/
# to OCTOPUS:
# /octfs/work/OCT_GROUP/share/Data/<DIR_NAME>/
#
# Usage:
# ./copy_data_from_genkai.sh [--dry-run] [--resume-safe] DIR [DIR ...]
#
# Examples:
# ./copy_data_from_genkai.sh
# ./copy_data_from_genkai.sh bathymetry
# ./copy_data_from_genkai.sh bathymetry coastline forcing
# ./copy_data_from_genkai.sh --dry-run bathymetry
# ./copy_data_from_genkai.sh --resume-safe bathymetry
set -euo pipefail
usage() {
cat <<'USAGE'
Usage:
copy_data_from_genkai.sh [OPTIONS] DIR [DIR ...]
Description:
Copy one or more directories from GENKAI DATA_DIR to OCTOPUS DATA_DIR.
Options:
--dry-run
Show what would be copied without actually copying.
--resume-safe
Use --append-verify for safer resume of interrupted large-file transfers.
--help, -h
Show this help.
Examples:
copy_data_from_genkai.sh
copy_data_from_genkai.sh bathymetry
copy_data_from_genkai.sh bathymetry coastline forcing
copy_data_from_genkai.sh --dry-run bathymetry
USAGE
}
DRY_RUN=0
RESUME_SAFE=0
DIRS=()
for arg in "$@"; do
case "$arg" in
--dry-run)
DRY_RUN=1
;;
--resume-safe)
RESUME_SAFE=1
;;
--help|-h)
usage
exit 0
;;
-*)
echo "Unknown option: $arg" >&2
usage
exit 2
;;
*)
DIRS+=("$arg")
;;
esac
done
# GENKAI login settings.
REMOTE_USER="GENKAI_ACCOUNT"
REMOTE_HOST="genkai.hpc.kyushu-u.ac.jp"
SSH_KEY="${HOME}/.ssh/genkai_from_octopus"
# OCTOPUS group settings.
GROUP="OCT_GROUP"
# Data directories.
REMOTE_DATA_DIR="/home/PROJECT_ID/share/Data"
LOCAL_DATA_DIR="/octfs/work/OCT_GROUP/share/Data"
# SSH command used by rsync.
SSH_CMD="ssh -i ${SSH_KEY} -o Compression=no -o StrictHostKeyChecking=accept-new"
if [ ! -f "${SSH_KEY}" ]; then
echo "SSH key not found: ${SSH_KEY}" >&2
echo "Create the key on OCTOPUS and register ${SSH_KEY}.pub on GENKAI first." >&2
exit 1
fi
# If no directory is given, show available directories under the remote DATA_DIR.
if [ "${#DIRS[@]}" -eq 0 ]; then
echo "Please give one or more directory names under:"
echo " ${REMOTE_DATA_DIR}"
echo ""
echo "Examples:"
echo " $0 bathymetry"
echo " $0 bathymetry coastline forcing"
echo ""
echo "Available directories on GENKAI:"
ssh -i "${SSH_KEY}" \
-o Compression=no \
-o StrictHostKeyChecking=accept-new \
"${REMOTE_USER}@${REMOTE_HOST}" \
"find '${REMOTE_DATA_DIR}' -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort"
exit 0
fi
# Rsync options.
# Do not use -a here, because preserving owner/group/perms can cause quota
# and permission problems on the destination.
#
# -r: recursive
# -l: copy symlinks as symlinks
# -t: preserve modification times
# -P: show progress and keep partial files
# --inplace: avoid making a second full temporary copy of large files
# --no-owner/--no-group/--no-perms: do not preserve GENKAI metadata
# --omit-dir-times: avoid unnecessary directory timestamp operations
RSYNC_OPTS=(
-rltP
--inplace
--no-owner
--no-group
--no-perms
--omit-dir-times
)
if [ "${RESUME_SAFE}" -eq 1 ]; then
RSYNC_OPTS+=(--append-verify)
echo "Mode: resume-safe"
fi
if [ "${DRY_RUN}" -eq 1 ]; then
RSYNC_OPTS+=(--dry-run)
echo "Mode: dry-run"
fi
# Prepare the local shared Data directory.
mkdir -p "${LOCAL_DATA_DIR}"
chgrp "${GROUP}" "$(dirname "${LOCAL_DATA_DIR}")"
chgrp "${GROUP}" "${LOCAL_DATA_DIR}"
chmod 2750 "$(dirname "${LOCAL_DATA_DIR}")"
chmod 2750 "${LOCAL_DATA_DIR}"
# New files should be readable by the group, but not by others.
umask 027
sync_one_dir() {
local name="$1"
local remote_dir="${REMOTE_DATA_DIR}/${name}/"
local local_dir="${LOCAL_DATA_DIR}/${name}/"
# Accept only direct child directory names under DATA_DIR.
# This avoids accidental copies outside DATA_DIR.
if [[ "${name}" == /* || "${name}" == *..* || "${name}" == *"/"* ]]; then
echo "Unsafe directory name: ${name}" >&2
echo "Use a directory name directly under DATA_DIR, such as: bathymetry" >&2
return 2
fi
echo "========================================"
echo "Copy data directory from GENKAI to OCTOPUS"
echo "========================================"
echo "Name: ${name}"
echo "Remote: ${REMOTE_USER}@${REMOTE_HOST}:${remote_dir}"
echo "Local: ${local_dir}"
echo ""
# Check remote directory exists.
ssh -i "${SSH_KEY}" \
-o Compression=no \
-o StrictHostKeyChecking=accept-new \
"${REMOTE_USER}@${REMOTE_HOST}" \
"test -d '${REMOTE_DATA_DIR}/${name}'" || {
echo "Remote directory does not exist: ${REMOTE_DATA_DIR}/${name}" >&2
return 1
}
mkdir -p "${local_dir}"
chgrp "${GROUP}" "${local_dir}"
chmod 2750 "${local_dir}"
rsync "${RSYNC_OPTS[@]}" \
-e "${SSH_CMD}" \
"${REMOTE_USER}@${REMOTE_HOST}:${remote_dir}" \
"${local_dir}"
# Normalize permissions after transfer.
# Directories: 2750 = rwxr-s---
# Files: 0640 = rw-r-----
if [ "${DRY_RUN}" -eq 0 ]; then
chgrp -R "${GROUP}" "${local_dir}"
find "${local_dir}" -type d -exec chmod 2750 {} +
find "${local_dir}" -type f -exec chmod 0640 {} +
echo ""
echo "Disk usage:"
du -sh "${local_dir}" 2>/dev/null || true
echo ""
echo "Permission check:"
ls -ld "${local_dir}"
fi
echo ""
}
for dir in "${DIRS[@]}"; do
sync_one_dir "${dir}"
done
echo "All requested transfers finished."
EOF
chmod 700 ~/copy_data_from_genkai.sh
実行前に、スクリプト中の以下の行を自分の環境に合わせて編集します。
REMOTE_USER="GENKAI_ACCOUNT"
GROUP="OCT_GROUP"
REMOTE_DATA_DIR="/home/PROJECT_ID/share/Data"
LOCAL_DATA_DIR="/octfs/work/OCT_GROUP/share/Data"
5. コピー可能なディレクトリを確認する
引数なしで実行すると、GENKAI側のデータディレクトリ直下にある候補ディレクトリ名を表示します。
~/copy_data_from_genkai.sh
6. dry-runで確認する
最初は必ず --dry-run で確認します。
~/copy_data_from_genkai.sh --dry-run bathymetry
7. 1つのディレクトリをコピーする
~/copy_data_from_genkai.sh bathymetry
8. 複数ディレクトリをまとめてコピーする
ディレクトリ名をスペース区切りで並べます。
~/copy_data_from_genkai.sh bathymetry coastline forcing
9. 中断後に安全側で再開する
大きなファイルの転送が途中で止まった場合は、次のように再実行します。
~/copy_data_from_genkai.sh --resume-safe bathymetry
この場合、rsync に --append-verify が追加されます。
10. 権限の方針
転送後、権限は以下のようにそろえます。
ディレクトリ:
drwxr-s---
ファイル:
-rw-r-----
意味は次の通りです。
| 対象 | 所有者 | グループ | その他 |
|---|---|---|---|
| ディレクトリ | 読み・書き・入る | 読み・入る | 権限なし |
| ファイル | 読み・書き | 読み | 権限なし |
ディレクトリの実行権限 x は、プログラムを実行する権限ではなく、そのディレクトリに入る、または配下のファイルへ到達するための権限です。データファイル本体には実行権限を付けません。
11. 結果を確認する
ls -ld /octfs/work/OCT_GROUP/share
ls -ld /octfs/work/OCT_GROUP/share/Data
ls -ld /octfs/work/OCT_GROUP/share/Data/bathymetry
find /octfs/work/OCT_GROUP/share/Data/bathymetry -maxdepth 2 -ls | head
グループメンバーは、以下ができれば正常です。
cd /octfs/work/OCT_GROUP/share/Data/bathymetry
ls
cp some_file ~/some_file_copy
一方、以下は失敗するのが正常です。
touch test_file
これは、グループメンバーに書き込み権限を与えない読み取り専用共有データ置き場としているためです。