Cách sửa lỗi 'GLIBC_2.34 Not Found': 4 giải pháp thực tế

intermediate🐧 Linux2026-05-30| Các bản phân phối Linux (như Ubuntu 20.04 hoặc Debian 10) khi cố gắng chạy các tệp binary được biên dịch trên các hệ thống mới hơn (như Ubuntu 22.04 hoặc Fedora 35).

Error Message

/lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.34' not found
#glibc#linux#devops#sysadmin

Nguyên nhân gốc rễ: Không tương thích phiên bản

Có lẽ bạn đã gặp phải vấn đề này khi di chuyển một tệp binary mới từ máy phát triển hiện đại sang một máy chủ production cũ. Lỗi này khá rõ ràng: ứng dụng của bạn đang tìm kiếm một phiên bản của GNU C Library (glibc) mà hệ thống hiện tại không có.

/lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.34' not found

Các thư viện Linux tuân theo một quy tắc nghiêm ngặt: chúng tương thích ngược (backward-compatible) nhưng không tương thích xuôi (forward-compatible). Một ứng dụng được xây dựng cho hệ thống cũ sẽ chạy được trên hệ thống mới. Tuy nhiên, một ứng dụng được build trên hệ thống mới (như Ubuntu 22.04 sử dụng glibc 2.34) không thể chạy trên hệ thống cũ hơn (như Ubuntu 20.04 sử dụng glibc 2.31).

Trước tiên, hãy kiểm tra phiên bản hệ thống của bạn

Trước khi bắt đầu sửa lỗi, hãy xác nhận phiên bản mà máy chủ của bạn đang chạy. Thực thi lệnh sau:

ldd --version

Nếu kết quả hiển thị 2.31 hoặc 2.27, bạn đã xác nhận được sự chênh lệch. Bạn cũng có thể xem chính xác các symbol mà binary đang yêu cầu:

strings /path/to/your/app | grep GLIBC_2.34

Nếu có kết quả trả về, điều đó chứng minh binary đã được hard-code để yêu cầu phiên bản 2.34 trở lên.

Tùy chọn 1: Đóng gói bằng Docker

Docker thường là cách khắc phục dễ dàng nhất vì các container mang theo môi trường riêng của chúng. Nếu host của bạn chạy OS cũ nhưng ứng dụng cần glibc 2.34, chỉ cần sử dụng một base image hiện đại như Ubuntu 22.04. Thư viện của container sẽ xử lý các tác vụ nặng nề bất kể phiên bản của máy host là gì.

# Ví dụ Dockerfile
FROM ubuntu:22.04

COPY ./your-app /usr/local/bin/your-app
RUN chmod +x /usr/local/bin/your-app

ENTRYPOINT ["/usr/local/bin/your-app"]

Cách tiếp cận này bỏ qua hoàn toàn thư viện lỗi thời của máy host mà không yêu cầu bất kỳ thay đổi mã nguồn nào.

Tùy chọn 2: Build trực tiếp trên môi trường đích

Nếu bạn có quyền truy cập vào mã nguồn, giải pháp "native" sạch sẽ nhất là biên dịch lại ứng dụng trực tiếp trên máy chủ cũ. Bằng cách build tại chỗ, trình biên dịch sẽ tự động liên kết với phiên bản glibc cũ hơn hiện có (ví dụ: 2.31).

# Ví dụ build tiêu chuẩn
g++ main.cpp -o my_app

# Xác nhận liên kết
ldd my_app | grep libc.so.6

Điều này đảm bảo binary được tối ưu hóa hoàn hảo cho môi trường cụ thể đó.

Tùy chọn 3: Chiến lược "Build trên hệ thống cũ"

Các đội ngũ phát triển chuyên nghiệp thường sử dụng quy tắc "build trên hệ thống cũ nhất được hỗ trợ". Để hỗ trợ cả Ubuntu 20.04 và 22.04, hãy thực hiện build trên 20.04. Điều này sẽ tạo ra một binary với yêu cầu phiên bản thấp hơn, giúp nó hoạt động được trên cả các hệ thống mới hơn.

Nếu bạn sử dụng GitHub Actions, hãy cố định runner của mình vào một image cũ hơn:

# Đoạn mã GitHub Actions
jobs:
  build:
    runs-on: ubuntu-20.04  # Nhắm mục tiêu glibc 2.31 để tương thích tốt hơn
    steps:
      - uses: actions/checkout@v4
      - run: make build

Tùy chọn 4: Sử dụng Static Linking với Musl

Các ngôn ngữ như Go và Rust cho phép liên kết tĩnh (static linking). Điều này nhúng tất cả mã thư viện cần thiết trực tiếp vào tệp binary. Bằng cách sử dụng musl-libc thay vì glibc, bạn tạo ra một binary "chạy mọi nơi" mà không quan tâm đến phiên bản libc.so.6 của hệ thống.

# Rust: Nhắm mục tiêu musl để có binary di động
rustup target add x86_64-unknown-linux-musl
cargo build --release --target x86_64-unknown-linux-musl

Kết quả là một tệp có dung lượng lớn hơn một chút nhưng hoàn toàn miễn nhiễm với các lỗi phiên bản glibc.

Cảnh báo: Đừng làm hỏng hệ thống của bạn

Tuyệt đối không bao giờ thử thay thế thủ công /lib/x86_64-linux-gnu/libc.so.6 hoặc ép buộc nâng cấp glibc từ mã nguồn trên một máy chủ production. Hầu hết mọi lệnh cơ bản (ls, sudo, ssh) đều phụ thuộc vào tệp cụ thể này. Một sai lầm ở đây sẽ gây ra lỗi kernel panic ngay lập tức, khiến hệ thống của bạn thậm chí không thể khởi động.

Các bước xác minh

Sau khi áp dụng giải pháp, hãy xác minh kết quả bằng các bước kiểm tra sau:

  • Kiểm tra các liên kết động: Chạy ldd your-app. Mọi mục nhập phải trỏ đến một đường dẫn tệp hợp lệ, không phải "not found".
  • Chạy smoke test: Thực thi ./your-app --help để đảm bảo nó khởi động mà không bị crash bộ liên kết (linker).
  • Kiểm tra các symbol: Sử dụng nm your-app | grep GLIBC để xem chính xác các phiên bản mà binary của bạn hiện đang tham chiếu.

Related Error Notes