# 迁移数据
<subtitle>将两个 Volume 挂载到同一个沙箱，使用 rsync 在它们之间复制数据。</subtitle>

需要把数据从旧 Volume 迁移到新 Volume 时，最简单的做法是把两个 Volume 挂载到同一个沙箱，然后在沙箱内复制文件。本页的脚本会基于 **base** 模板创建沙箱，挂载源 Volume 和目标 Volume，并把源 Volume 的全部数据复制到目标 Volume。

- **源** Volume 必须已经存在，否则脚本会报错退出。
- **目标** Volume 如果已存在则直接复用，不存在则自动创建。

## 前置条件

请先按照 [前置条件与认证](/docs/agent-sandbox/product/prerequisites.md) 配置 API Key，并安装 UCloud Sandbox SDK。

## 脚本

脚本先按名称查找两个 Volume：连接源 Volume，连接或创建目标 Volume。然后将两者挂载到沙箱中，使用 [rsync](https://rsync.samba.org/) 复制数据。

将以下内容保存为 `copy_volume.py`：

```python
import sys

from ucloud_sandbox import Sandbox, Volume

args = sys.argv[1:]
if len(args) != 2:
    raise SystemExit('Usage: copy_volume <source-volume> <dest-volume>')
source_name, dest_name = args


def find_volume_by_name(name):
    return next((v for v in Volume.list() if v.name == name), None)


source_info = find_volume_by_name(source_name)
if source_info is None:
    raise SystemExit(f'Source volume "{source_name}" does not exist')
source_volume = Volume.connect(source_info.volume_id)

dest_info = find_volume_by_name(dest_name)
dest_volume = (
    Volume.connect(dest_info.volume_id) if dest_info else Volume.create(dest_name)
)

sandbox = Sandbox.create(
    volume_mounts={
        '/mnt/source': source_volume,
        '/mnt/dest': dest_volume,
    },
)

try:
    install = sandbox.commands.run(
        'sudo apt-get update && sudo apt-get install -y rsync',
    )
    if install.exit_code != 0:
        raise RuntimeError(f'rsync install failed: {install.stderr}')

    result = sandbox.commands.run('rsync -a /mnt/source/ /mnt/dest/')
    if result.exit_code != 0:
        raise RuntimeError(f'Copy failed: {result.stderr}')

    listing = sandbox.commands.run('ls -la /mnt/dest')
    print(listing.stdout)
finally:
    sandbox.kill()
```

## 使用方法

运行脚本时传入源 Volume 和目标 Volume 的名称。例如，将 `prod-data` 中的全部数据复制到 `prod-data-backup`：

```bash
python copy_volume.py prod-data prod-data-backup
```

执行成功后，脚本会打印目标 Volume 的文件列表，方便确认数据已复制完成。无论成功与否，沙箱都会在最后被关闭，两个 Volume 及其中的数据会继续保留。
