Logo

Personal Ops Runbook

Personal runbook covering infrastructure operations for Cloud, Kubernetes, OpenStack, and Ceph environments. Includes deployment and teardown procedures, node management, cluster monitoring setup, and incident response workflows compiled from day-to-day operational work. Intended strictly for personal reference — configurations and scripts are environment-specific and not guaranteed to work as-is elsewhere.

Lỗi Device has a filesystem khi Triển khai OSD qua Ceph Orchestrator


🧭 Tổng quan

Trong quá trình triển khai Ceph với cephadmorchestrator, bạn có thể gặp lỗi không mong muốn như:

RuntimeError: Device /dev/sde has a filesystem.

Đây là lỗi thường thấy khi tạo OSD bằng ceph orch apply osd ... và nguyên nhân là vì Ceph yêu cầu các ổ đĩa dùng làm OSD phải sạch hoàn toàn, không chứa partition, filesystem, hoặc metadata từ các ứng dụng khác (như LVM, ext4, xfs…).

Bài viết này sẽ hướng dẫn bạn xử lý sự cố trên một cách chi tiết, an toàn và có thể áp dụng trong môi trường production.

🧪 Mô tả sự cố thực tế

Trên node Ceph MON:

ceph health detail

Trả về:

shell> ceph health detail
HEALTH_WARN Failed to apply 1 service(s): osd.osd_SSD_1.9TB; failed to probe daemons or devices
[WRN] CEPHADM_APPLY_SPEC_FAIL: Failed to apply 1 service(s): osd.osd_SSD_1.9TB
    osd.osd_SSD_1.9TB: cephadm exited with an error code: 1, stderr:Non-zero exit code 1 from /usr/bin/podman run --rm --ipc=host --stop-signal=SIGTERM --net=host --entrypoint /usr/sbin/ceph-volume --privileged --group-add=disk --init -e CONTAINER_IMAGE=172.16.21.13:5000/ceph/ceph@sha256:c7baf2afe0677eb1a36205ef4a6f1958e3b64234a64a897cad50617bcb28becf -e NODE_NAME=CEPH-LAB-OSD-006 -e CEPH_USE_RANDOM_NONCE=1 -e CEPH_VOLUME_OSDSPEC_AFFINITY=osd_SSD_1.9TB -e CEPH_VOLUME_SKIP_RESTORECON=yes -e CEPH_VOLUME_DEBUG=1 -v /var/run/ceph/9efd2cce-365b-11ee-853e-a59020fddc84:/var/run/ceph:z -v /var/log/ceph/9efd2cce-365b-11ee-853e-a59020fddc84:/var/log/ceph:z -v /var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/crash:/var/lib/ceph/crash:z -v /run/systemd/journal:/run/systemd/journal -v /dev:/dev -v /run/udev:/run/udev -v /sys:/sys -v /run/lvm:/run/lvm -v /run/lock/lvm:/run/lock/lvm -v /:/rootfs -v /tmp/ceph-tmp073etakk:/etc/ceph/ceph.conf:z -v /tmp/ceph-tmp5kzod89v:/var/lib/ceph/bootstrap-osd/ceph.keyring:z 172.16.21.13:5000/ceph/ceph@sha256:c7baf2afe0677eb1a36205ef4a6f1958e3b64234a64a897cad50617bcb28becf lvm batch --no-auto /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm /dev/sdn /dev/sdo /dev/sdp /dev/sdq /dev/sdr /dev/sds /dev/sdt /dev/sdu /dev/sdv /dev/sdw --yes --no-systemd
/usr/bin/podman: stderr Traceback (most recent call last):
/usr/bin/podman: stderr   File "/usr/sbin/ceph-volume", line 11, in <module>
/usr/bin/podman: stderr     load_entry_point('ceph-volume==1.0.0', 'console_scripts', 'ceph-volume')()
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/main.py", line 41, in __init__
/usr/bin/podman: stderr     self.main(self.argv)
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/decorators.py", line 59, in newfunc
/usr/bin/podman: stderr     return f(*a, **kw)
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/main.py", line 153, in main
/usr/bin/podman: stderr     terminal.dispatch(self.mapper, subcommand_args)
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/terminal.py", line 194, in dispatch
/usr/bin/podman: stderr     instance.main()
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/devices/lvm/main.py", line 46, in main
/usr/bin/podman: stderr     terminal.dispatch(self.mapper, self.argv)
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/terminal.py", line 192, in dispatch
/usr/bin/podman: stderr     instance = mapper.get(arg)(argv[count:])
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/devices/lvm/batch.py", line 348, in __init__
/usr/bin/podman: stderr     self.args = parser.parse_args(argv)
/usr/bin/podman: stderr   File "/usr/lib64/python3.6/argparse.py", line 1734, in parse_args
/usr/bin/podman: stderr     args, argv = self.parse_known_args(args, namespace)
/usr/bin/podman: stderr   File "/usr/lib64/python3.6/argparse.py", line 1766, in parse_known_args
/usr/bin/podman: stderr     namespace, args = self._parse_known_args(args, namespace)
/usr/bin/podman: stderr   File "/usr/lib64/python3.6/argparse.py", line 1954, in _parse_known_args
/usr/bin/podman: stderr     positionals_end_index = consume_positionals(start_index)
/usr/bin/podman: stderr   File "/usr/lib64/python3.6/argparse.py", line 1931, in consume_positionals
/usr/bin/podman: stderr     take_action(action, args)
/usr/bin/podman: stderr   File "/usr/lib64/python3.6/argparse.py", line 1824, in take_action
/usr/bin/podman: stderr     argument_values = self._get_values(action, argument_strings)
/usr/bin/podman: stderr   File "/usr/lib64/python3.6/argparse.py", line 2279, in _get_values
/usr/bin/podman: stderr     value = [self._get_value(action, v) for v in arg_strings]
/usr/bin/podman: stderr   File "/usr/lib64/python3.6/argparse.py", line 2279, in <listcomp>
/usr/bin/podman: stderr     value = [self._get_value(action, v) for v in arg_strings]
/usr/bin/podman: stderr   File "/usr/lib64/python3.6/argparse.py", line 2294, in _get_value
/usr/bin/podman: stderr     result = type_func(arg_string)
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/util/arg_validators.py", line 117, in __call__
/usr/bin/podman: stderr     return self._format_device(self._is_valid_device())
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/util/arg_validators.py", line 128, in _is_valid_device
/usr/bin/podman: stderr     super()._is_valid_device(raise_sys_exit=False)
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/util/arg_validators.py", line 105, in _is_valid_device
/usr/bin/podman: stderr     super()._is_valid_device()
/usr/bin/podman: stderr   File "/usr/lib/python3.6/site-packages/ceph_volume/util/arg_validators.py", line 76, in _is_valid_device
/usr/bin/podman: stderr     raise RuntimeError("Device {} has a filesystem.".format(self.dev_path))
/usr/bin/podman: stderr RuntimeError: Device /dev/sde has a filesystem.
Traceback (most recent call last):
  File "/var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/cephadm.7ab03136237675497d535fb1b85d1d0f95bbe5b95f32cd4e6f3ca71a9f97bf3c", line 9653, in <module>
    main()
  File "/var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/cephadm.7ab03136237675497d535fb1b85d1d0f95bbe5b95f32cd4e6f3ca71a9f97bf3c", line 9641, in main
    r = ctx.func(ctx)
  File "/var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/cephadm.7ab03136237675497d535fb1b85d1d0f95bbe5b95f32cd4e6f3ca71a9f97bf3c", line 2153, in _infer_config
    return func(ctx)
  File "/var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/cephadm.7ab03136237675497d535fb1b85d1d0f95bbe5b95f32cd4e6f3ca71a9f97bf3c", line 2069, in _infer_fsid
    return func(ctx)
  File "/var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/cephadm.7ab03136237675497d535fb1b85d1d0f95bbe5b95f32cd4e6f3ca71a9f97bf3c", line 2181, in _infer_image
    return func(ctx)
  File "/var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/cephadm.7ab03136237675497d535fb1b85d1d0f95bbe5b95f32cd4e6f3ca71a9f97bf3c", line 2056, in _validate_fsid
    return func(ctx)
  File "/var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/cephadm.7ab03136237675497d535fb1b85d1d0f95bbe5b95f32cd4e6f3ca71a9f97bf3c", line 6254, in command_ceph_volume
    out, err, code = call_throws(ctx, c.run_cmd(), verbosity=CallVerbosity.QUIET_UNLESS_ERROR)
  File "/var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/cephadm.7ab03136237675497d535fb1b85d1d0f95bbe5b95f32cd4e6f3ca71a9f97bf3c", line 1853, in call_throws
    raise RuntimeError('Failed command: %s' % ' '.join(command))
RuntimeError: Failed command: /usr/bin/podman run --rm --ipc=host --stop-signal=SIGTERM --net=host --entrypoint /usr/sbin/ceph-volume --privileged --group-add=disk --init -e CONTAINER_IMAGE=172.16.21.13:5000/ceph/ceph@sha256:c7baf2afe0677eb1a36205ef4a6f1958e3b64234a64a897cad50617bcb28becf -e NODE_NAME=CEPH-LAB-OSD-006 -e CEPH_USE_RANDOM_NONCE=1 -e CEPH_VOLUME_OSDSPEC_AFFINITY=osd_SSD_1.9TB -e CEPH_VOLUME_SKIP_RESTORECON=yes -e CEPH_VOLUME_DEBUG=1 -v /var/run/ceph/9efd2cce-365b-11ee-853e-a59020fddc84:/var/run/ceph:z -v /var/log/ceph/9efd2cce-365b-11ee-853e-a59020fddc84:/var/log/ceph:z -v /var/lib/ceph/9efd2cce-365b-11ee-853e-a59020fddc84/crash:/var/lib/ceph/crash:z -v /run/systemd/journal:/run/systemd/journal -v /dev:/dev -v /run/udev:/run/udev -v /sys:/sys -v /run/lvm:/run/lvm -v /run/lock/lvm:/run/lock/lvm -v /:/rootfs -v /tmp/ceph-tmp073etakk:/etc/ceph/ceph.conf:z -v /tmp/ceph-tmp5kzod89v:/var/lib/ceph/bootstrap-osd/ceph.keyring:z 172.16.21.13:5000/ceph/ceph@sha256:c7baf2afe0677eb1a36205ef4a6f1958e3b64234a64a897cad50617bcb28becf lvm batch --no-auto /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm /dev/sdn /dev/sdo /dev/sdp /dev/sdq /dev/sdr /dev/sds /dev/sdt /dev/sdu /dev/sdv /dev/sdw --yes --no-systemd

Chúng ta để ý dòng này.

HEALTH_WARN Failed to apply 1 service(s): osd.osd_SSD_1.9TB; failed to probe daemons or devices

Chi tiết lỗi:

RuntimeError: Device /dev/sde has a filesystem.

Lỗi này xảy ra trong quá trình orchestrator gọi container ceph-volume để tạo OSD batch.

📌 Nguyên nhân

Thành phần Vai trò Lỗi gây ra
ceph-volume Dùng để format disk và tạo OSD Phát hiện disk còn FS
/dev/sde Disk được chọn làm OSD Đã từng gắn filesystem, chưa được wipe sạch
orchestrator Điều phối container và OSD Không thể xử lý disk không sạch

⚙️ Hướng xử lý chi tiết

🔍 Bước 1: Xác minh ổ đĩa có filesystem

lsblk -f /dev/sde

Nếu cột FSTYPE hiện xfs, ext4, ntfs… ⇒ thiết bị chưa sạch.

🧹 Bước 2: Xóa sạch ổ đĩa

⚠️ CẢNH BÁO: Đảm bảo /dev/sde không chứa dữ liệu cần giữ!

Chạy:

wipefs -a /dev/sde
sgdisk --zap-all /dev/sde
partprobe /dev/sde

Giải thích:

  • wipefs -a: Xóa mọi filesystem signature.
  • sgdisk --zap-all: Xóa GPT/MBR partition table.
  • partprobe: Reload bảng phân vùng.

Nên lặp lại bước này cho các disk khác như /dev/sdf, /dev/sdg nếu cần.

🔁 Bước 3: Thực hiện lại thao tác tạo OSD

Nếu bạn dùng file spec:

ceph orch apply osd -i osd_SSD_1.9TB.yaml

Hoặc:

ceph orch apply osd osd_SSD_1.9TB

✅ Bước 4: Kiểm tra lại trạng thái sau khi sửa

ceph health detail
ceph orch ps | grep osd

Xác nhận không còn lỗi failed to probe daemons or devices.

📊 Sơ đồ luồng lỗi & xử lý (ASCII)

┌───────────────┐
│  Orchestrator │
└──────┬────────┘
       │ gọi podman/ceph-volume
       ▼
┌───────────────┐
│  ceph-volume  │──┐
└────┬──────────┘  │
     ▼             ▼
┌──────────────┐  ┌───────────────────────────┐
│ /dev/sde có  │  │ Lỗi: "has a filesystem"   │
│ filesystem   │  └───────────────────────────┘
└──────────────┘
        │
        ▼ wipefs/sgdisk
┌──────────────┐
│ Disk sạch OK │──> apply osd thành công
└──────────────┘

✅ Ưu điểm của quy trình này

Ưu điểm Mô tả
Chủ động xử lý lỗi Không cần reset toàn bộ node
Không cần sửa spec Vẫn giữ nguyên file spec nếu đã đúng
Có thể automation Có thể viết script xử lý nhiều ổ đĩa

❌ Nhược điểm cần lưu ý

Nhược điểm Ghi chú
Có thể xóa nhầm dữ liệu Phải chắc chắn disk không chứa OSD cũ
Cần truy cập shell trên node OSD Không thực hiện được nếu SSH bị chặn

🧠 Lời khuyên khi triển khai OSD với Ceph Orchestrator

  • Kiểm tra trước khi apply: Dùng lsblk, blkid, wipefs -n để kiểm tra tình trạng disk.
  • Chuẩn hóa disk sạch từ đầu: Với disk mới hoặc tái sử dụng, luôn wipe sạch trước khi chạy apply.
  • Sử dụng automation: Nếu có nhiều node và disk, hãy viết script auto-clean.

Ví dụ script cleanup toàn bộ disk:

for dev in /dev/sd{e..w}; do
  echo "Wiping $dev..."
  wipefs -a $dev
  sgdisk --zap-all $dev
  partprobe $dev
done

✅ Tổng kết

Việc cần làm Lệnh
Kiểm tra filesystem lsblk -f /dev/sdX
Wipe disk sạch wipefs -a, sgdisk --zap-all, partprobe
Deploy lại OSD ceph orch apply osd ...
Kiểm tra lỗi Ceph ceph health detail, ceph orch ps

📌 Kết luận

Việc chuẩn bị thiết bị lưu trữ sạch sẽ là bước quan trọng trước khi triển khai OSD trong Ceph. Ceph Orchestrator rất nghiêm ngặt trong việc đảm bảo an toàn dữ liệu, do đó sẽ từ chối bất kỳ thiết bị nào có dấu hiệu từng được sử dụng.

Đầu tư kỹ ở bước chuẩn bị đĩa sẽ giúp bạn tránh được nhiều rắc rối khi vận hành cluster Ceph về sau.