🧭 Tổng quan
Trong hệ thống lưu trữ phân tán Ceph, việc theo dõi sự cố và crash của các daemon như osd
, mon
, mgr
, v.v… là điều cần thiết để đảm bảo độ tin cậy và ổn định của cluster. Một trong những công cụ phục vụ mục tiêu này là ceph-crash
– một dịch vụ nhỏ đi kèm Ceph, có nhiệm vụ thu thập và gửi crash report về cho Ceph Manager (mgr
).
Tuy nhiên, trong quá trình triển khai Ceph trên môi trường thực tế (nhất là trên nền tảng như Proxmox), bạn có thể sẽ gặp lỗi liên quan tới ceph-crash
không gửi được report, hoặc quyền truy cập bị từ chối. Bài viết này chia sẻ chi tiết về:
ceph-crash
hoạt động ra sao- Các lỗi thường gặp
- Cách cấu hình lại an toàn
- Và một số mẹo tối ưu thực tiễn
🔍 Ceph-crash là gì và nó làm gì?
ceph-crash
là một systemd service chạy nền. Nhiệm vụ chính:
- Theo dõi thư mục
/var/lib/ceph/crash/
- Khi phát hiện crash mới, sẽ thực hiện
ceph crash post
để gửi thông tin về crash lên Ceph MGR - Ceph MGR ghi nhận và hiển thị cảnh báo như:
HEALTH_WARN 1 daemons have recently crashed
📁 Cấu trúc thư mục /var/lib/ceph/crash/
:
/var/lib/ceph/crash/
├── 2024-01-13T03:43:40.227595Z_xxxx/
│ ├── crash.log ← Log chi tiết tại thời điểm crash
│ ├── stacktrace.txt ← Stack trace nếu có
│ └── meta ← Thông tin daemon, hostname, timestamp
├── posted/ ← Nơi chứa các crash đã post thành công
⚠️ Lỗi thường gặp: Permission Denied hoặc TypeError
🧱 Lỗi 1: Không truy cập được keyring
auth: unable to find a keyring on /etc/pve/priv/ceph.client.admin.keyring: (13) Permission denied
💡 Nguyên nhân:
ceph-crash
không có quyền đọc file keyring nằm trong/etc/pve/priv/
(đây là khu vực riêng tư của Proxmox).
✅ Cách khắc phục:
- Sao chép file keyring ra
/etc/ceph/
và phân quyền đúng:
cp /etc/pve/priv/ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring
chown ceph:ceph /etc/ceph/ceph.client.admin.keyring
chmod 600 /etc/ceph/ceph.client.admin.keyring
🧱 Lỗi 2: TypeError: missing ‘inbuf’
TypeError: Module.do_post() missing 1 required positional argument: 'inbuf'
💡 Nguyên nhân:
- Đây là bug trong Ceph, khi module
ceph-crash
gọi sai hàm trong Ceph MGR → không truyền đủ tham số.
✅ Cách khắc phục:
- Nên nâng cấp Ceph lên phiên bản mới hơn (ví dụ: Quincy ≥ 17.2.5).
- Hoặc tạm thời dừng
ceph-crash
nếu không cần theo dõi crash:
systemctl stop ceph-crash
systemctl disable ceph-crash
🔐 Giải pháp tối ưu: Sử dụng user client.crash
thay vì client.admin
Việc dùng client.admin
tiềm ẩn rủi ro do user này có quyền toàn cluster. Ta nên tạo user mới có quyền hạn giới hạn chỉ cho ceph-crash
.
✅ Các bước:
Bước 1: Tạo user client.crash
:
ceph auth get-or-create client.crash mon 'allow r' mgr 'allow rw' osd 'allow r' -o /etc/ceph/ceph.client.crash.keyring
chown ceph:ceph /etc/ceph/ceph.client.crash.keyring
chmod 600 /etc/ceph/ceph.client.crash.keyring
Bước 2: Cấu hình ceph-crash
dùng user mới
Chạy:
systemctl edit ceph-crash
Thêm nội dung:
[Service]
Environment=CEPH_ARGS=--name=client.crash
ExecStart=
ExecStart=/usr/bin/python3 /usr/bin/ceph-crash
Bước 3: Restart dịch vụ
systemctl daemon-reexec
systemctl daemon-reload
systemctl restart ceph-crash
Đây là giải pháp mình thực hiện thành công ở Ceph 17.2.8.
Bạn có thể tạo ra đoạn keyring như sau một cách hoàn toàn chính thức và an toàn bằng lệnh ceph auth get-or-create
. Chạy lệnh sau trên một node có quyền admin:
ceph auth get-or-create client.crash \
mon 'allow r' \
mgr 'allow rw' \
osd 'allow r' \
-o /etc/ceph/ceph.client.crash.keyring
Lệnh trên sẽ:
- Tạo user
client.crash
nếu chưa có - Gán quyền:
mon
: cho phép đọcmgr
: cho phép ghi/đọc (cần để post crash)osd
: cho phép đọc
- Xuất file keyring ra đúng vị trí bạn cần
📄 File sinh ra sẽ có dạng như:
[client.crash]
key = AQCh5UdoNlLDNBAAoS8m0rd9tQ4TN0RvKXR1Vw==
caps mgr = "allow rw"
caps mon = "allow r"
caps osd = "allow r"
🔐 Gán quyền cho file keyring
Đảm bảo file có quyền hạn đúng để ceph-crash
có thể sử dụng:
chown ceph:ceph /etc/ceph/ceph.client.crash.keyring
chmod 600 /etc/ceph/ceph.client.crash.keyring
🧪 Kiểm tra
Bạn có thể kiểm tra quyền của user:
ceph auth get client.crash
🚫 Nếu user đã tồn tại và không cho ghi đè:
Bạn có thể dùng:
ceph auth caps client.crash \
mon 'allow r' \
mgr 'allow rw' \
osd 'allow r'
→ Lệnh này sửa quyền user hiện tại thay vì tạo mới.
Nếu key hoạt động tốt thì bạn tạo 1 block mới tên là [client.crash]
sau đó truyền nội dung của key vào block mới này như dưới.
shell> cat /etc/ceph/ceph.conf
[global]
auth_client_required = cephx
auth_cluster_required = cephx
auth_service_required = cephx
cluster_network = 10.10.10.5/24
fsid = 37a599e4-599e-4aef-ac0d-ab9e788de377
mon_allow_pool_delete = true
mon_host = 192.168.100.201 192.168.100.202 192.168.100.203 192.168.100.204 192.168.100.205
ms_bind_ipv4 = true
ms_bind_ipv6 = false
osd_pool_default_min_size = 3
osd_pool_default_size = 3
public_network = 192.168.100.205/24
[client.crash]
key = AQCh5UdoNlLDNBAAoS8m0rd9tQ4TN0RvKXR1Vw==
caps mgr = "allow rw"
caps mon = "allow r"
caps osd = "allow r"
[client]
keyring = /etc/pve/priv/$cluster.$name.keyring
[mon.pve01]
public_addr = 192.168.100.201
[mon.pve02]
public_addr = 192.168.100.202
[mon.pve03]
public_addr = 192.168.100.203
[mon.pve04]
public_addr = 192.168.100.204
[mon.pve05]
public_addr = 192.168.100.205
Hoặc có thể truyền thằng đến file key.
shell> cat /etc/ceph/ceph.conf
[global]
auth_client_required = cephx
auth_cluster_required = cephx
auth_service_required = cephx
cluster_network = 10.10.10.5/24
fsid = 37a599e4-599e-4aef-ac0d-ab9e788de377
mon_allow_pool_delete = true
mon_host = 192.168.100.201 192.168.100.202 192.168.100.203 192.168.100.204 192.168.100.205
ms_bind_ipv4 = true
ms_bind_ipv6 = false
osd_pool_default_min_size = 3
osd_pool_default_size = 3
public_network = 192.168.100.205/24
[client.crash]
keyring = /etc/ceph/ceph.client.crash.keyring
[client]
keyring = /etc/pve/priv/$cluster.$name.keyring
[mon.pve01]
public_addr = 192.168.100.201
[mon.pve02]
public_addr = 192.168.100.202
[mon.pve03]
public_addr = 192.168.100.203
[mon.pve04]
public_addr = 192.168.100.204
[mon.pve05]
public_addr = 192.168.100.205
📊 Ưu và nhược điểm của ceph-crash
Ưu điểm | Nhược điểm |
---|---|
Theo dõi tự động daemon crash | Có thể gây lỗi nếu dùng sai keyring |
Hữu ích để debug | Không cần thiết nếu đã có giám sát ngoài |
Dễ tích hợp với dashboard Ceph | Một số bản Ceph có bug do_post() |
🧩 So sánh: ceph-crash vs giám sát ngoài
Tiêu chí | ceph-crash | Giám sát ngoài (Prometheus, Zabbix…) |
---|---|---|
Crash report chi tiết | ✅ Có | ❌ Không cụ thể |
Health warning trong Ceph | ✅ Tích hợp sẵn | ❌ Phải cảnh báo thủ công |
Đòi hỏi quyền truy cập | ⚠️ Cần keyring | ✅ Tuỳ cấu hình |
Độ tin cậy | ⚠️ Phụ thuộc phiên bản Ceph | ✅ Ổn định nếu dùng log/syslog |
💡 Lời khuyên
- Luôn tách user riêng (
client.crash
) để hạn chế rủi ro bảo mật. - Nếu cluster đã giám sát tốt bằng Prometheus/Grafana → có thể tắt
ceph-crash
. - Trước khi sửa
ceph-crash
, luôn kiểm tra:journalctl -u ceph-crash -f
- Khi có lỗi
TypeError: missing 'inbuf'
, nên nâng cấp Ceph trước khi thực hiện workaround khác.
✅ Kết luận
ceph-crash
là một thành phần nhỏ nhưng quan trọng trong hệ sinh thái Ceph, giúp cảnh báo sớm và thu thập thông tin sự cố daemon. Tuy nhiên, việc cấu hình đúng quyền và khớp phiên bản là điều kiện cần để nó hoạt động ổn định.
Bạn hoàn toàn có thể kiểm soát ceph-crash
theo cách phù hợp với hạ tầng: dùng nếu cần theo dõi crash chi tiết – hoặc tắt nếu đã có giải pháp thay thế hiệu quả hơn.
Nếu bạn thấy bài viết này hữu ích, đừng quên chia sẻ hoặc để lại bình luận để mình cải thiện thêm nhé!