0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rsync によるGENKAIからOCTOPUSへの共有データコピー

0
Last updated at Posted at 2026-07-02

九州大学スパコン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

これは、グループメンバーに書き込み権限を与えない読み取り専用共有データ置き場としているためです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?