Lỗi Thường Gặp và Cách Khắc Phục của Ceph-crash

🧭 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 đọc
    • mgr: 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ểmNhược điểm
Theo dõi tự động daemon crashCó thể gây lỗi nếu dùng sai keyring
Hữu ích để debugKhông cần thiết nếu đã có giám sát ngoài
Dễ tích hợp với dashboard CephMộ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-crashGiá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é!

Bài viết gần đây

spot_img

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here

Đăng ký nhận thông tin bài viết qua email