Score:0

ไม่สามารถเรียกใช้คำสั่ง systemctl บนโฮสต์จากคอนเทนเนอร์ซึ่งทำงานจนถึง Ubuntu 16.04

ธง ve

เมื่อระบบปฏิบัติการโฮสต์เป็น Ubuntu 16.04 หรือ RHEL 7.x คำสั่งต่อไปนี้ใช้งานได้ ซึ่งช่วยให้เราเรียกใช้คำสั่ง systemctl บนโฮสต์จากภายในคอนเทนเนอร์นักเทียบท่า:

# nsenter --mount=/hostroot/proc/1/ns/mnt -- systemctl เริ่ม dummy.service

แต่ในโฮสต์ OS-es ที่ใหม่กว่า, Ubuntu 20.04 และ RHEL 8.x ใช้งานไม่ได้ และเราได้รับข้อผิดพลาดต่อไปนี้:

# nsenter --mount=/hostroot/proc/1/ns/mnt -- systemctl เริ่ม dummy.service
ไม่สามารถเชื่อมต่อกับบัส: ไม่มีข้อมูล

ฉันได้แนบตัวอย่างที่เรียบง่ายและคำสั่งเพื่อเรียกใช้และจำลองปัญหา:

บริการตัวอย่างที่ฉันต้องการเริ่มต้นบนโฮสต์จากคอนเทนเนอร์:

# cat /etc/systemd/system/dummy.service
[หน่วย]
คำอธิบาย=บริการจำลอง
[บริการ]
ExecStart=/usr/bin/sleep อินฟินิตี้

Dockerfile ของคอนเทนเนอร์ของฉัน:

# cat Dockerfile
จากอูบุนตู:20.04
ENV TZ=UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt update -y --fix-missing
RUN apt install -y util-linux
STOPSIGNAL SIGRTนาที+3
CMD [ "/ถัง/ทุบตี" ]

สร้างภาพ:

# นักเทียบท่า build -t รุ่นทดลองใช้

ลบคอนเทนเนอร์เก่า:

# นักเทียบท่า rm -f ทดลองใช้

เรียกใช้ภาพ:

# docker run -it -d --net=host --privileged -v /:/hostroot -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name ทดลองใช้

ทำซ้ำปัญหา:

# นักเทียบท่า exec -it ทดลองทุบตี
# nsenter --mount=/hostroot/proc/1/ns/mnt -- systemctl เริ่ม dummy.service
ไม่สามารถเชื่อมต่อกับบัส: ไม่มีข้อมูล

ฉันต้องการทราบว่ามีตัวเลือกเพิ่มเติมหรือคำสั่ง docker run ใด ๆ ที่ต้องแก้ไขเพื่อให้ทำงานได้

Score:0
ธง cn

ฉันตรวจสอบสิ่งนี้เป็นเวลาหลายชั่วโมง ดูเหมือนว่าวิธีการนี้ sd_bus_start ถูกเปลี่ยนเป็นรวมการตรวจสอบเพิ่มเติม ฉันไม่สามารถจำกัดให้แคบลงว่ากำลังมองหาอะไรอีก แต่ฉันสามารถหาวิธีแก้ปัญหาที่สวยงามกว่านี้เพื่อทำงานเดียวกันให้สำเร็จโดยใช้คำสั่ง systemctl ระยะไกลแทนการเมานต์ไดเร็กทอรีทั้งหมดจากโฮสต์

ระบบระยะไกลctl

systemctl รองรับการสั่งการระยะไกลผ่านทาง --โฮสต์ / -H ธง. มันใช้ ssh เพื่อเชื่อมต่อกับรีโมตโฮสต์ ดังนั้นจึงจำเป็นต้องใช้คู่คีย์ ssh เนื่องจากเราเป็นผู้ควบคุมโฮสต์ที่เราใช้งานอยู่ การติดตั้งจึงค่อนข้างตรงไปตรงมา

คำสั่งนักเทียบท่า (หรือ Kubernetes arg)

นี่คือคำสั่งทั้งหมดที่สามารถใช้ได้ ฉันจะแยกย่อยแต่ละส่วนด้านล่าง ข้อสันนิษฐานของคอนเทนเนอร์มีอยู่ว่า systemctl และ จุ๊ๆ ติดตั้งแล้ว คอนเทนเนอร์กำลังทำงานบนเครือข่ายโฮสต์ และที่ ราก โฮมไดเร็กตอรี่ของบัญชีถูกเมาต์แล้ว (คุณสามารถใช้อย่างอื่นได้หากต้องการ)

(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] เริ่ม nfs-server.service

คำสั่งนี้กำลังดูว่า ~/.ssh/id_rsa มีไฟล์อยู่แล้ว มิฉะนั้นให้สร้างขึ้นใหม่

(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)

สิ่งนี้สามารถทำให้ปลอดภัยยิ่งขึ้นโดยวางไว้ในส่วนของการกำหนดค่า ssh สำหรับ 127.0.0.1แต่เราต้องการ

(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].

systemctl -H [email protected] เริ่ม nfs-server.service

เพื่อความปลอดภัยสูงสุด ควรตั้งค่าคีย์และผู้ใช้ภายนอกคอนเทนเนอร์ก่อน (ผ่าน Ansible หรือคล้ายกัน) และอนุญาตเฉพาะ systemctl -H คำสั่งภายในคอนเทนเนอร์

Aravindhan Krishnan avatar
ve flag
ขอขอบคุณที่สละเวลาอันมีค่าของคุณในเรื่องนี้นอกจากนี้ เรายังได้รับข้อสรุปที่คล้ายคลึงกันเป็นการภายใน (แม้ว่าจะผ่านการสังเกตอย่างเดียว & ไม่ใช่การอ่านโค้ด) ว่าการตรวจสอบใหม่เพิ่มเติมบางอย่างทำให้เกิดการเปลี่ยนแปลงในพฤติกรรม เรายังสังเกตว่าใน OS-es ก่อนหน้านี้ การดำเนินการคำสั่งดังกล่าวส่งผลให้เกิดความผิดพลาด ดูเหมือนว่า systemd-dev จะแก้ไขปัญหานี้ซึ่งทำให้เกิดพฤติกรรมผิดปกติกับผู้ใช้ปลายทาง วิธีแก้ปัญหาที่คุณแนะนำคือวิธีเดียวกับที่เราแนะนำจาก Canonical เช่นกัน ขอบคุณ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา