ไพน์, อัลไพน์ลินุกซ์ตาม OSTree
เลือกอะไร OS ทำงานบนเซิร์ฟเวอร์ของคุณเป็นเรื่องของความสะดวกและความคุ้นเคย ความสะดวกสบายหมายถึงคุณต้องการบางสิ่งบางอย่างที่ทำให้คุณมีปัญหาน้อยที่สุด ความคุ้นเคยหมายความว่าคุณต้องการ ไม่ เพื่อเรียนรู้เพิ่มเติมหากไม่จำเป็น
เซิร์ฟเวอร์ของฉันคือ สัตว์เลี้ยงดังนั้นฉันจึงสามารถออกคำสั่งสองสามคำสั่งด้วยตนเองเป็นระยะ ๆ และไม่ต้องการระบบอัตโนมัติที่สมบูรณ์
หลังจากได้ลอง CoreOS เป็นเวลาหนึ่งปีที่ฉันเปลี่ยนมาใช้ตัวย่อของฉันเอง distro ขึ้นอยู่กับเทือกเขาแอลป์และ ostree.
อัลไพน์รุ่นนี้ใช้สัญญาณจาก รถแบน และ โครงการอะตอม และควรจะติดตั้งเป็นระบบไฟล์รูทแบบอ่านอย่างเดียวที่มีการอัพเดตที่เกิดขึ้นแบบอะตอม นั่นคือ สำเร็จหรือระบบสลับกลับเป็นสถานะก่อนหน้า เพื่อให้เป็นไปได้ที่ระบบจะต้องมีอย่างน้อยเสมอ สองสแนปชอต ของเวอร์ชันระบบไฟล์ที่นำออกใช้ ซึ่งมีอยู่ในที่จัดเก็บ
ระบบจะทำงานในสภาพแวดล้อมใดบ้าง ฉันตั้งเป้า OVZ และ [KVM] แต่โดยทั่วไปคุณสามารถพูดได้ ตู้คอนเทนเนอร์ และ เครื่องเสมือน ด้วยข้อแตกต่างที่สำคัญคือคอนเทนเนอร์ไม่ได้รันเคอร์เนลของตัวเอง โดยเฉพาะอย่างยิ่งพวกเขาไม่มีกระบวนการบู๊ต พวกเขาเรียกโดยตรงไปยัง ในนั้น ระบบ (เช่นใน aDockerfile
มันจะถูกกำหนดโดยCMD
หรือENTRYPOINT
คำสั่ง) ซึ่งมีหน้าที่จัดการแผนผังของ prcesses ที่จะทำให้คอนเทนเนอร์ทำงานต่อไป (เช่นเดียวกับเซสชันปกติ หากกระบวนการเริ่มต้นตาย คอนเทนเนอร์จะสิ้นสุดลง) นอกจากนี้ คอนเทนเนอร์ยังกำหนดค่าลูกบิดระบบไม่ได้ และสามารถมีข้อจำกัดเพิ่มเติมเกี่ยวกับความสามารถได้
ภาพถูกสร้างขึ้นอย่างไร?
NSprepare.sh
สคริปต์จัดการการพึ่งพาซึ่งส่วนใหญ่เป็นแพ็คเกจเพื่อเสนอเครื่องมือ cli ทั่วไปเช่นcoreutils
, util-linux
, binutils
, ยูทิลิตี้ที่จะทำงานกับอุปกรณ์บล็อกเช่นblkid
, sfdisk
, multipath-tools
และระบบไฟล์ด้วยxfsprogs
และe2fsprogs
. NSsquashfs-tools
แพ็คเกจถูกใช้ในตอนท้ายเพื่อบีบอัดระบบไฟล์รูทที่สร้างขึ้น NSglib
แพ็คเกจความเข้ากันได้ยังถูกติดตั้งตามค่าเริ่มต้นเพราะอัลไพน์นั้นอิงตามmusl
, แพ็คเกจความเข้ากันได้ทำงานโดยจัดเตรียมไลบรารีบางตัวที่สร้างขึ้นจาก .
โครงสร้างไฟล์สำหรับทั้ง VM และคอนเทนเนอร์ถูกสร้างด้วยตามลำดับmake.sh
และmake_ovz.sh
. นี่คือคำอธิบายอย่างง่ายของขั้นตอน
ตั้งค่าเวอร์ชันที่จะสร้างตามแท็กที่เก็บ
สร้างไดเร็กทอรีสำหรับทรีใหม่และล้างสภาพแวดล้อม
สร้างไดเร็กทอรีเป้าหมายฐานและไดเร็กทอรีที่ต้องการโดย ostree เช่นsysroot
สร้าง symlink เพื่อให้สอดคล้องกับ มาตรฐานลำดับชั้นของระบบไฟล์
คัดลอกบริการที่กำหนดเองและการกำหนดค่าที่กำหนดเอง
ตั้งค่า chroot ด้วยไดเร็กทอรีระบบที่เมาท์
บูตสแตรปอัลไพน์ rootfs พร้อมแพ็คเกจฐาน
ใช้การกำหนดค่าขั้นต่ำกับ rootfs เช่น ข้อมูลประจำตัว เขตเวลา ชื่อโฮสต์
บริการคัดลอกที่จะเริ่มต้นโดย init
ตั้งค่าการกำหนดค่าการบูตด้วยเคอร์เนลอิมเมจที่ระบุ
เลือกเพิ่มโมดูลเคอร์เนลที่กำหนดเองได้
ทำความสะอาด
คอมมิต rootfs[1] ไปยังที่เก็บ ostree
สำหรับคอนเทนเนอร์ ลำดับจะเหมือนกัน แต่การกำหนดค่าเปลี่ยนแปลง เนื่องจากระบบไม่ได้บูตจาก a bootloader ostree มีปัญหาในการตรวจสอบสภาพแวดล้อม เราต้องสมัครบ้าง วิธีแก้ปัญหา และตั้งค่าอุปกรณ์บางอย่างซึ่งมักจะจัดการโดย initramfs ขั้นตอน อย่างนี้นี่เอง OVZ หรือ LXC มีการกำหนดค่าเทมเพลต
เมื่อเรามีต้นไม้ไฟล์ที่คอมมิต ostree แล้วbuild.sh
หรือbuild-update.sh
ดูแลการผลิตสิ่งประดิษฐ์ที่จะแจกจ่าย ความแตกต่างระหว่างสคริปต์คือเวอร์ชันการอัพเดทเริ่มต้นจากที่เก็บ ostree ก่อนหน้าและ อีกด้วย สร้างสิ่งประดิษฐ์เดลต้าที่ระบบที่ทำงานอยู่สามารถนำไปใช้กับอินสแตนซ์ ostree เพื่อทำการอัปเกรด นี่คือคำอธิบายอย่างง่ายของขั้นตอนการสร้าง
ถ้าสร้างใหม่
สร้างพาร์ติชั่นใหม่บนอิมเมจใหม่ที่ติดตั้งเป็นอุปกรณ์วนซ้ำ
อื่น
เมานต์ sysroot และพาร์ติชันสำหรับเริ่มระบบของ build ก่อนหน้า
ล้างการปรับใช้ ostree ก่อนหน้า (ลิงก์ฟาร์ม) บน build ที่เมาท์
มอบต้นไม้ที่สร้างขึ้นใหม่บนบิลด์แบบเมานท์
ตรวจสอบความสมบูรณ์และเช็คซัม
สร้างเดลต้าใหม่สำหรับการอัพเกรด
ดำเนินการปรับใช้ ostree เพื่อสร้างการกำหนดค่าการบูตใหม่
ลบข้อผูกมัดเก่าออก
ตรวจสอบความสมบูรณ์ของพาร์ติชันสำหรับบูต
เลิกเมานต์อิมเมจบิลด์ที่อัปเดตใหม่
สร้างเช็คซัมรูปภาพและบีบอัด (ด้วยsquashfs
สำหรับตู้คอนเทนเนอร์)
การกำหนดค่าพาร์ติชันใช้กับfdisklayout.cfg
ไฟล์ที่กำหนดขนาดพาร์ติชั่น เรามีหนึ่งพาร์ติชั่นสำหรับ rootfs (~430M
) พาร์ติชันสำหรับเริ่มระบบ (~40M
) และพาร์ติชั่นสว็อป (~40M
). ด้วยคอนเทนเนอร์ที่เพียงแค่ข้ามการติดตั้งบิลด์ก่อนหน้าบนอุปกรณ์วนซ้ำ และเพียงแค่ดึง ostree คอมมิทใหม่บนที่เก็บ ostree เก่า (แยก)
ฉันกำลังรวมกลุ่มอะไรในรูปภาพนี้ (นอกเหนือจากแพ็คเกจที่ติดตั้ง)
lib ขนาดเล็กในfunctions.sh
สำหรับงานทั่วไปที่ดำเนินการภายในเชลล์
สคริปต์อัปเกรดที่ใช้ ostree พร้อมกลไกการล็อกตาม KV store
สคริปต์การตรวจสอบสำหรับ IO ทั้งในพื้นที่ (iomon
) และเครือข่าย (tcpmon
)
สคริปต์การตั้งค่าสำหรับรันไทม์คอนเทนเนอร์อื่นที่ไม่ใช่bubblewrap
: podman
, toolbox
สิ่งที่เคยเป็นและไม่ใช่อีกต่อไป
sup
: จีบ ถูกใช้สำหรับการประสาน (ปรับใช้คอนเทนเนอร์) และการกำหนดค่าเครื่องโฮสต์ แต่แล้วฉันก็เปลี่ยนเป็น ansible เนื่องจากมีข้อบกพร่องใน sup ที่ยาวนานซึ่งขาดการแก้ไข ฉันไม่ได้เลือก ansible ตั้งแต่เริ่มต้นเพราะฉันไม่ต้องการให้มีการพึ่งพา python ในทุกเซิร์ฟเวอร์ ในที่สุดฉันก็ตกลงกับอัลไพน์รอง chroot บนเครื่องโฮสต์ซึ่งอยู่ใน/opt/alp
ฉันติดตั้งซอฟต์แวร์เพิ่มเติมที่มีความสำคัญน้อยกว่าหรือไม่ อย่างไรก็ตาม วันนี้ฉันจะเปลี่ยนจาก ansible เป็น pyinfra , เพราะ
มันคือ python ที่ไม่มีสำเร็จรูป (ansible มี pseudoDSL
ที่ทำให้ปวดหัวมากกว่าแก้)
มันรันสูตรด้วยคำสั่ง ssh ธรรมดา ดังนั้นจึงไม่มีข้อกำหนดการพึ่งพาหลามบนโฮสต์เป้าหมาย
containerpilot
: กรณีการใช้งานสำหรับนักบินคอนเทนเนอร์คือการจัดการการพึ่งพาที่ซับซ้อนระหว่างคอนเทนเนอร์โดยไม่มีเชลล์สคริปต์...มันหยุดรับการอัปเดตจาก ความสุข และอยู่ในโหมดบำรุงรักษา ฉันไม่ชอบความต้องการหน่วยความจำและการใช้หน่วยความจำจะเพิ่มขึ้นอย่างต่อเนื่องเป็นระยะเวลานาน ฉันเปลี่ยนเป็นเชลล์สคริปต์อย่างง่ายด้วย กงสุล ฉันอาจมองหาทางเลือกอื่นที่เหมาะสมกว่านี้หากเชลล์สคริปต์เริ่มเติบโตมากเกินไป วิธีแก้ปัญหาที่หนักกว่าเช่น kubernetes, ฝูง หรือ เร่ร่อน ถูกละทิ้งจากการไป
beegfs
: ฉันเคยจัดส่งโมดูลเคอร์เนลที่จำเป็นสำหรับ beegfs แต่หลังจากนั้นไม่นานความเข้ากันได้ก็พังและความจริงที่ว่าไม่มีการรองรับอย่างเหมาะสม ฟิวส์ โมดูลที่วางไว้ทั้งหมด ฉันไม่ได้ใช้งาน [DFS] บนเซิร์ฟเวอร์ของฉัน แต่ความเป็นไปได้ของการมีระบบไฟล์ที่พร้อมใช้งานเพื่อเสียบเครือข่ายยังคงน่าสนใจ
ในการติดตั้งอิมเมจ คุณสามารถอัปโหลดไปยังผู้ให้บริการโฮสต์และติดตั้งจาก VNC ในกรณีของเวอร์ชวลแมชชีน แต่ฉันมักจะจี้การติดตั้งที่มีอยู่ เพราะมันเป็นไปได้เสมอ และตราบใดที่ฉันได้ทดสอบสคริปต์การตั้งค่ากับเวอร์ชันของ การกระจาย linux โดยทั่วไปฉันใช้ debian-8 หรือ ubuntu-14 ยังไม่ได้ทดสอบอันอื่นเนื่องจากฉันพบว่าสิ่งเหล่านี้พร้อมใช้งานเสมอ ขั้นตอนการตั้งค่ามีดังนี้
ตรวจสอบให้แน่ใจว่า https รองรับการดาวน์โหลด
ดาวน์โหลดรุ่น busybox
ติดตั้ง busybox link-farm
กำหนดที่อยู่ ipv4/ipv6 สำหรับการกำหนดค่าเครือข่าย
รับรองความสามารถของ chroot
ดาวน์โหลดภาพต้นสนและแยกออก
ถ้าVM
แฟลชเหนืออุปกรณ์เป้าหมาย
ติดตั้งบนอุปกรณ์วนรอบ
เขียนการกำหนดค่าเครือข่ายท้องถิ่นบน ที่จะเปล่งประกาย rootfs
ถ้าคอนเทนเนอร์
คัดลอกบริการ init (สำหรับคอนเทนเนอร์) เหนือจุดต่อเชื่อมหลัก/sbin/init
ถ้าVM
แบ่งพาร์ติชั่นดิสก์ที่เหลือด้วยมาตรฐาน (xfs
) พาร์ทิชัน
เลิกเมานท์
ตรวจสอบความสมบูรณ์ของพาร์ติชัน
รีบูต
ฉันทำ ต้นสน 5 years from time of writing and I am still using it, and I see no reasons to switch to anything else. Alpine as a linux distro is great, simple, and I have never experienced breakage. I can easily deploy on แนท เซิร์ฟเวอร์ที่มักจะมีทรัพยากรต่ำมาก จริง ๆ แล้วฉันมีกล่องที่ทำงานด้วยเพียง64M
ของ RAM และยังมีคุณสมบัติทั้งหมดที่ฉันต้องการ
[1] | ระบบไฟล์รูท |