Cách sửa lỗi 'locale: Cannot set LC_ALL to default locale' trên Linux

beginner🐧 Linux2026-04-12| Thường gặp trên Debian, Ubuntu, CentOS và Arch Linux, đặc biệt là trong các phiên SSH hoặc bên trong các container Docker tối giản.

Error Message

locale: Cannot set LC_ALL to default locale: No such file or directory
#linux#ssh#ubuntu#docker#sysadmin

Vấn đề

Bạn vừa đăng nhập vào một máy chủ Linux từ xa qua SSH, hoặc có lẽ bạn đang khởi tạo một container Docker mới. Bạn chạy một lệnh đơn giản như apt-get upgrade hoặc một script Perl, và đột nhiên terminal của bạn hiển thị một loạt các cảnh báo:

locale: Cannot set LC_ALL to default locale: No such file or directory
/usr/bin/locale: Cannot set LC_MESSAGES to default locale: No such file or directory
/usr/bin/locale: Cannot set LC_COLLATE to default locale: No such file or directory

Những cảnh báo này không chỉ gây khó chịu về mặt thị giác. Mặc dù chúng hiếm khi làm dừng hoàn toàn một tiến trình, nhưng chúng có thể khiến các script Perl bị lỗi hoặc dẫn đến văn bản bị "biến dạng" trong terminal của bạn. Nếu script của bạn xử lý mã hóa ký tự nhạy cảm—như phân tích cú pháp cơ sở dữ liệu có tên không phải tiếng Anh—việc thiếu cấu hình này có thể dẫn đến hỏng dữ liệu thực sự.

Tại sao điều này xảy ra: Sự không tương thích về môi trường

Lỗi này thường bắt nguồn từ sự thiếu hụt thông tin liên lạc giữa máy tính cục bộ của bạn và máy chủ từ xa. Dưới đây là hai nguyên nhân phổ biến nhất:

  • Chuyển tiếp biến SSH (SSH Variable Passthrough): Đây là thủ phạm trong khoảng 90% trường hợp. Máy cục bộ của bạn (như Mac hoặc laptop Linux) được thiết lập là en_US.UTF-8. Khi bạn kết nối qua SSH, client của bạn cố gắng "export" các thiết lập này sang máy chủ. Nếu máy chủ không có gói ngôn ngữ cụ thể đó được tạo sẵn, nó sẽ báo lỗi.
  • Cài đặt hệ điều hành tối giản (Minimal OS Installs): Các image trên cloud và container Docker thường được lược bỏ để tiết kiệm dung lượng. Chúng có thể không có bất kỳ locale nào được tạo theo mặc định, khiến hệ thống ở trạng thái "C" hoặc "POSIX" chung chung.

Cách khắc phục

Bạn có thể giải quyết vấn đề này bằng cách cài đặt ngôn ngữ còn thiếu cho máy chủ hoặc yêu cầu máy chủ ngừng tiếp nhận các thiết lập từ máy cục bộ của bạn.

Cách 1: Tạo các Locale (Khuyên dùng)

Trên Debian hoặc Ubuntu, bạn cần biên dịch các định nghĩa locale sang định dạng nhị phân mà hệ thống có thể hiểu được. Trước tiên, hãy đảm bảo gói locales đã được cài đặt:

sudo apt-get update && sudo apt-get install -y locales

Tiếp theo, hãy tạo locale cụ thể mà bạn cần. Hầu hết người dùng nên sử dụng chuẩn tiếng Anh Mỹ UTF-8:

sudo locale-gen en_US.UTF-8

Finalmente, hãy thiết lập mặc định cho hệ thống để thay đổi này vẫn còn hiệu lực sau khi khởi động lại:

sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

Lưu ý cho người dùng Arch Linux: Bạn cần bỏ chú thích dòng en_US.UTF-8 UTF-8 trong tệp /etc/locale.gen và sau đó chạy lệnh locale-gen.

Cách 2: Giải pháp tạm thời qua SSH

Nếu bạn không có quyền root trên máy chủ, bạn có thể ngăn chặn lỗi bằng cách chỉnh sửa tệp ~/.bashrc hoặc ~/.zshrc cục bộ của mình. Thêm các dòng sau vào cuối tệp:

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

Chạy source ~/.bashrc để áp dụng ngay lập tức. Điều này buộc phiên làm việc hiện tại sử dụng định dạng chuẩn, bỏ qua các thiết lập mặc định bị lỗi của máy chủ.

Cách 3: Sửa cấu hình SSH Server

Nếu bạn là quản trị viên hệ thống (sysadmin) và muốn ngăn chặn điều này xảy ra với tất cả người dùng, bạn có thể yêu cầu SSH daemon bỏ qua các biến locale do client gửi đến. Mở tệp cấu hình:

sudo nano /etc/ssh/sshd_config

Tìm dòng AcceptEnv LANG LC_* và vô hiệu hóa nó bằng cách thêm dấu # ở đầu dòng:

#AcceptEnv LANG LC_*

Khởi động lại dịch vụ bằng lệnh sudo systemctl restart ssh. Giờ đây, máy chủ sẽ sử dụng nghiêm ngặt các thiết lập locale nội bộ của chính nó, bất kể máy tính của người dùng gợi ý gì.

Cách 4: Xử lý với Docker Container

Các Docker image tối giản (như ubuntu:latest hoặc debian:stable-slim) thường xuyên gặp lỗi này. Để khắc phục vĩnh viễn, hãy thêm các dòng sau vào Dockerfile của bạn. Việc này sẽ làm tăng kích thước image thêm khoảng 3-5MB nhưng giúp bạn tránh được các rắc rối về mã hóa sau này:

RUN apt-get update && apt-get install -y locales && \
    sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    locale-gen

ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
ENV LC_ALL en_US.UTF-8

Kiểm tra

Để đảm bảo việc khắc phục đã thành công, hãy chạy lệnh locale. Một hệ thống hoạt động tốt sẽ trả về một danh sách các biến mà không có bất kỳ lỗi "Cannot set" nào ở phía trên:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Mẹo nhỏ: Giữ hệ thống sạch sẽ

Khi tôi thiết lập một môi trường production mới, tôi luôn đưa việc tạo locale vào script bash ban đầu hoặc Ansible playbook của mình. Việc này chỉ mất 10 giây để chạy nhưng giúp ngăn chặn những cảnh báo Perl khó chịu làm đầy log của bạn.

Nếu bạn đang gỡ lỗi các script xử lý các chuỗi được mã hóa—như URL hoặc dữ liệu Base64—hãy đảm bảo môi trường của bạn tuân thủ UTF-8 để tránh bị lỗi ký tự. Để kiểm tra nhanh các chuỗi mã hóa bằng tay, tôi sử dụng các công cụ như URL Encoder/Decoder. Đây là một cách nhanh chóng trên trình duyệt để xác minh rằng dữ liệu của bạn không bị hỏng do cài đặt locale sai trong quá trình xử lý.

Related Error Notes