🧭 Tổng quan
Trong quá trình triển khai Ceph với cephadm
và orchestrator
, 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.