Điểm:0

Không thể chạy các lệnh systemctl trên Máy chủ từ vùng chứa đang hoạt động cho đến Ubuntu 16.04

lá cờ ve

Khi hệ điều hành máy chủ là Ubuntu 16.04 hoặc RHEL 7.x, lệnh sau đang hoạt động, giúp chúng tôi chạy các lệnh systemctl trên máy chủ từ bên trong bộ chứa docker:

# nsenter --mount=/hostroot/proc/1/ns/mnt -- systemctl start dummy.service

Nhưng trong OS-es máy chủ mới hơn, Ubuntu 20.04 và RHEL 8.x, điều này không hoạt động và chúng tôi gặp lỗi sau:

# nsenter --mount=/hostroot/proc/1/ns/mnt -- systemctl start dummy.service
Không thể kết nối với xe buýt: Không có dữ liệu

Tôi đã đính kèm một ví dụ tối giản và các lệnh để chạy và tạo lại sự cố:

Dịch vụ mẫu mà tôi muốn bắt đầu trên Máy chủ, từ vùng chứa:

# con mèo /etc/systemd/system/dummy.service
[Đơn vị]
Mô tả=dịch vụ giả
[Dịch vụ]
ExecStart=/usr/bin/ngủ vô cùng

Dockerfile của container của tôi:

# mèo dockerfile
TỪ Ubuntu:20.04
ENV TZ=UTC
CHẠY ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
CHẠY apt update -y --fix-missing
CHẠY cài đặt apt -y util-linux
DỪNG TÍN HIỆU SIGRTMIN+3
CMD [ "/ bin/bash" ]

Xây dựng hình ảnh:

# docker build -t dùng thử .

Xóa mọi vùng chứa cũ:

# docker rm -f dùng thử

Chạy hình ảnh:

# docker run -it -d --net=host --privileged -v /:/hostroot -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name dùng thử dùng thử

Tái tạo vấn đề:

# docker exec -it dùng thử bash
# nsenter --mount=/hostroot/proc/1/ns/mnt -- systemctl start dummy.service
Không thể kết nối với xe buýt: Không có dữ liệu

Tôi muốn biết liệu có bất kỳ tùy chọn bổ sung nào hoặc bất kỳ lệnh chạy docker nào cần được thay đổi để làm việc này không.

Điểm:0
lá cờ cn

Tôi đã xem xét điều này trong vài giờ, có vẻ như phương pháp này sd_bus_start đã được thay đổi để bao gồm kiểm tra bổ sung. Tôi không thể thu hẹp những gì nó đang tìm kiếm, tuy nhiên tôi đã có thể đưa ra một giải pháp tinh tế hơn để hoàn thành cùng một nhiệm vụ bằng cách sử dụng các lệnh systemctl từ xa thay vì gắn tất cả các thư mục từ Máy chủ.

hệ thống từ xa

hệ thống hỗ trợ các lệnh từ xa thông qua --host / -H lá cờ. Nó đang sử dụng ssh để kết nối với máy chủ từ xa, vì vậy sẽ cần một cặp khóa ssh. Vì chúng tôi đang kiểm soát máy chủ mà chúng tôi đang sử dụng nên việc thiết lập này khá đơn giản.

Lệnh Docker (hoặc Kubernetes arg)

Dưới đây là toàn bộ câu lệnh có thể sử dụng, mình sẽ chia nhỏ từng phần bên dưới. Các giả định của container là nó có hệ thốngssh được cài đặt, vùng chứa đang chạy trên mạng máy chủ và rằng nguồn gốc thư mục chính của tài khoản được gắn kết (bạn có thể sử dụng cách sử dụng khác nếu muốn).

(ls ~/.ssh/id_rsa || ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "") 
  && (grep -qxF $(cat ~/.ssh/id_rsa.pub) ~/.ssh/authorized_keys || echo $(cat ~/.ssh/id_rsa.pub) > ~/.ssh/authorized_keys)
  && (grep -qxF "StrictHostKeyChecking no" ~/.ssh/config || echo "StrictHostKeyChecking no" >> ~/.ssh/config)
  && (grep -qxF "UserKnownHostsFile /dev/null" ~/.ssh/config || echo "UserKnownHostsFile /dev/null" >> ~/.ssh/config)
  && systemctl -H [email protected] bắt đầu nfs-server.service

Lệnh này đang xem nếu ~/.ssh/id_rsa tệp tồn tại, nếu không thì tạo một tệp.

(ls ~/.ssh/id_rsa || ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "")

Bây giờ chúng tôi thêm khóa công khai của mình vào các khóa được ủy quyền nếu nó chưa tồn tại trong tệp.

(grep -qxF "$(cat ~/.ssh/id_rsa.pub)" ~/.ssh/authorized_keys || echo "$(cat ~/.ssh/id_rsa.pub)" > ~/.ssh/authorized_keys)

Điều này có thể được thực hiện an toàn hơn bằng cách đặt nó vào một phần của cấu hình ssh chỉ dành cho 127.0.0.1, Nhưng chúng tôi cần

(grep -qxF "StrictHostKeyChecking no" ~/.ssh/config || echo "StrictHostKeyChecking no" >> ~/.ssh/config) 
  && (grep -qxF "UserKnownHostsFile /dev/null" ~/.ssh/config || echo "UserKnownHostsFile /dev/null" >> ~/.ssh/config)

Cuối cùng chúng ta có thực tế hệ thống chỉ huy. chú ý -H [email protected].

systemctl -H [email protected] bắt đầu nfs-server.service

Để bảo mật tối đa, trước tiên, tốt nhất bạn nên thiết lập khóa và người dùng bên ngoài vùng chứa (thông qua Ansible hoặc tương tự) và chỉ cho phép systemctl -H lệnh bên trong container.

Aravindhan Krishnan avatar
lá cờ ve
Cảm ơn bạn đã dành thời gian quý báu của mình cho việc này.Nội bộ chúng tôi cũng đã đi đến một suy luận rất giống nhau (mặc dù chỉ thông qua quan sát chứ không phải đọc mã) rằng một số kiểm tra mới bổ sung đang gây ra sự thay đổi trong hành vi. Chúng tôi cũng lưu ý rằng trong các OS-es trước đó, việc thực thi lệnh như vậy dẫn đến sự cố. Có khả năng systemd-dev đã khắc phục sự cố này đang gây ra sự bất thường về hành vi cho người dùng cuối. Giải pháp được đề xuất bởi bạn cũng giống như giải pháp mà chúng tôi đã đề xuất từ ​​kinh điển. Cảm ơn

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.