ประวัติปัญหา
ในทางกลับกัน บริษัทขนาดเล็กต้องการการตรวจสอบโครงสร้างพื้นฐานคุณภาพสูง (โดยเฉพาะอย่างยิ่งในแง่ของการจำลองเสมือนที่แพร่หลาย) ในทางกลับกัน การซื้ออุปกรณ์ใหม่เป็นเรื่องยากทางการเงินสำหรับพวกเขา ปัญหาเซิร์ฟเวอร์/ฮาร์ดแวร์ก็เป็นเรื่องปกติเช่นกัน โดยมักจะมีเซิร์ฟเวอร์แบบทาวเวอร์ 1-3 เครื่องถัดจากเวิร์กสเตชันของผู้ใช้หรือในช่อง/ตู้เสื้อผ้าขนาดเล็ก
การใช้ชุดประกอบสำเร็จรูป (การกระจาย) ง่ายกว่าซึ่งคุณเพียงแค่ต้องอัปโหลดไปยังการ์ด microSD และใส่ลงในคอมพิวเตอร์บอร์ดเดี่ยวทั่วไป (ตระกูลบีเกิ้ลโบน, ราสเบอร์รี่ pi และตระกูลส้มปี่, ตระกูล asus tinker) นอกจากนี้อุปกรณ์ดังกล่าวยังมีราคาไม่แพงและสามารถติดตั้งได้ทุกที่
คำแถลงปัญหา
ในหลาย ๆ ด้าน โครงการนี้ได้รับการพัฒนาให้เป็นงานห้องปฏิบัติการชนิดหนึ่งที่มีความเป็นไปได้ที่จะนำผลลัพธ์ไปใช้
Zabbix ได้รับเลือกให้เป็นระบบตรวจสอบเนื่องจากเป็นระบบที่มีประสิทธิภาพ ฟรี และมีเอกสารครบถ้วน
ปัญหาเกี่ยวกับแพลตฟอร์มฮาร์ดแวร์กลายเป็นเรื่องรุนแรง การวางเครื่องแยกต่างหากภายใต้การตรวจสอบก็ไม่ใช่วิธีแก้ปัญหาที่ดีนัก - ไม่ว่าจะซื้ออุปกรณ์ใหม่มีราคาแพงหรือมองหาอุปกรณ์เก่า + ในบริษัทขนาดเล็กที่มีปัญหาบ่อยครั้งกับเซิร์ฟเวอร์/ ฮาร์ดแวร์.
การใช้ระบบบิลด์ buildroot ช่วยให้คุณสร้างโซลูชันพิเศษที่สามารถดำเนินการโดยบุคลากรที่มีความรู้ระบบปฏิบัติการ Linux เพียงเล็กน้อย ระบบนี้เป็นมิตรกับผู้เริ่มต้น แต่ในขณะเดียวกันก็ให้โอกาสในการปรับแต่งมากมายในมือของนักพัฒนาที่มีประสบการณ์ เหมาะอย่างยิ่งสำหรับการแก้ปัญหาการตรวจสอบโครงสร้างพื้นฐานด้านไอทีที่ราคาไม่แพง แต่ใช้งานได้เต็มรูปแบบ โดยมีข้อกำหนดขั้นต่ำสำหรับการฝึกอบรมบุคลากรที่ปฏิบัติงาน
ขั้นตอนการแก้ปัญหา
มีการตัดสินใจที่จะเริ่มสร้างเฟิร์มแวร์สำหรับ x86_64 เพื่อให้ทำงานใน qemu เนื่องจากนี่เป็นวิธีแก้ปัญหาที่สะดวกและรวดเร็วสำหรับการดีบัก จากนั้นย้ายไปยังคอมพิวเตอร์บอร์ดเดี่ยวแบบแขน (ฉันชอบบอร์ด asus tinker)
buildroot ถูกเลือกเป็นระบบบิลด์ ในตอนแรก ไม่มีแพ็คเกจ zabbix ดังนั้นจึงต้องย้ายพอร์ต มีปัญหากับภาษารัสเซีย ซึ่งแก้ไขได้โดยใช้แพตช์ที่เหมาะสม (หมายเหตุ: ใน buildroot เวอร์ชันใหม่กว่า แพตช์เหล่านี้ไม่จำเป็นอีกต่อไป)
การย้ายแพ็คเกจ zabbix นั้นจะมีการอธิบายไว้ในบทความแยกต่างหาก
เนื่องจากทุกอย่างควรทำงานเป็นเฟิร์มแวร์ (อิมเมจระบบที่ไม่สามารถเปลี่ยนแปลงได้ + ไฟล์การกำหนดค่า/ฐานข้อมูลที่กู้คืนได้) จึงจำเป็นต้องเขียนเป้าหมาย systemd บริการและตัวจับเวลาของคุณเอง (เป้าหมาย บริการ ตัวจับเวลา)
มีการตัดสินใจที่จะแบ่งสื่อออกเป็น 2 ส่วน - ส่วนที่มีไฟล์ระบบและส่วนที่มีการกำหนดค่าที่เปลี่ยนแปลงได้และไฟล์ฐานข้อมูล zabbix
การแก้ปัญหาที่เกี่ยวข้องกับฐานข้อมูลกลายเป็นเรื่องยากขึ้นเล็กน้อย ฉันไม่ต้องการวางไว้บนสื่อโดยตรง ในเวลาเดียวกัน ขนาดของฐานข้อมูลสามารถเข้าถึงขนาดที่เกินขนาดของ ramdisk ที่เป็นไปได้ ดังนั้นจึงเลือกวิธีแก้ปัญหาการประนีประนอม: ฐานข้อมูลตั้งอยู่บนพาร์ติชันที่สองของการ์ด SD (การ์ด SLC สมัยใหม่มีรอบการเขียนสูงสุด 30 รอบ) แต่มีการตั้งค่าที่อนุญาตให้ใช้สื่อภายนอก (เช่น usb- ฮาร์ดดิสก์)
การตรวจสอบอุณหภูมิดำเนินการผ่านอุปกรณ์ RODOS-5 แน่นอนว่าคุณสามารถใช้ Dallas 1820 ได้โดยตรง แต่การเสียบ USB จะเร็วกว่าและง่ายกว่า
เลือก grub86 เป็น bootloader สำหรับ x64_2 จำเป็นต้องเขียนการกำหนดค่าขั้นต่ำเพื่อเปิดใช้งาน
หลังจากการดีบักบน qemu แล้ว มันก็ถูกย้ายไปยัง asus tinker board ในตอนแรกโครงสร้างของโอเวอร์เลย์ของฉันตั้งใจให้เป็นแบบข้ามแพลตฟอร์ม โดยจัดสรรการกำหนดค่าเฉพาะสำหรับแต่ละบอร์ด (defconfig ของบอร์ด, bootloader, การสร้างอิมเมจด้วยพาร์ติชันระบบ) และความสม่ำเสมอสูงสุดในการปรับแต่งระบบไฟล์/การสร้างอิมเมจด้วยข้อมูล เนื่องจากการเตรียมการดังกล่าว การขนย้ายจึงดำเนินไปอย่างรวดเร็ว
ขอแนะนำอย่างยิ่งให้อ่านบทความเบื้องต้น:
วิธีการประกอบ
หลังจากการโคลนที่เก็บ จะได้โครงสร้างไฟล์ต่อไปนี้:
[alexey@comp monitor]$ ls -1
buildroot-2019.05.tar.gz
overlay
README.md
run_me.sh
buildroot-2019.05.tar.gz - ทำความสะอาดไฟล์ buildroot
การซ้อนทับคือไดเร็กทอรีของฉันที่มีแผนผังภายนอก นี่คือที่เก็บทุกสิ่งที่คุณต้องการในการสร้างเฟิร์มแวร์โดยใช้ buildroot
README.md - คำอธิบายโครงการและคู่มือเป็นภาษาอังกฤษ
run_me.sh เป็นสคริปต์ที่เตรียมระบบบิลด์ ขยาย buildroot จากไฟล์เก็บถาวร แนบโอเวอร์เลย์เข้าไป (ผ่านกลไกภายนอกต้นไม้) และอนุญาตให้คุณเลือกบอร์ดเป้าหมายสำหรับการประกอบ
[0] my_asus_tinker_defconfig
[1] my_beaglebone_defconfig
[2] x86_64_defconfig
Select defconfig, press A for abort. Default [0]
หลังจากนี้ เพียงไปที่ไดเร็กทอรี buildroot-2019.05 และรันคำสั่ง make
เมื่อการสร้างเสร็จสมบูรณ์ ผลลัพธ์ของการสร้างทั้งหมดจะอยู่ในไดเร็กทอรี output/images:
[alexey@comp buildroot-2019.05]$ ls -1 output/images/
boot.img
boot.vfat
bzImage
data
data.img
external.img
external.qcow2
grub-eltorito.img
grub.img
intel-ucode
monitor-0.9-beta.tar.gz
qemu.qcow2
rootfs.cpio
sdcard.img
sys
update
ไฟล์ที่จำเป็น:
- sdcard.img - ภาพสื่อสำหรับบันทึกลงในการ์ด SD (ผ่าน dd หรือ rufus ภายใต้ wibdows)
- qemu.qcow2 - อิมเมจสื่อที่จะทำงานใน qemu
- external.qcow2 - อิมเมจสื่อภายนอกสำหรับฐานข้อมูล
- monitor-0.9-beta.tar.gz - เก็บถาวรสำหรับการอัพเดตผ่านทางเว็บอินเตอร์เฟส
การสร้างคำแนะนำ
การเขียนคำแนะนำเดียวกันหลายครั้งไม่คุ้มค่า และสิ่งที่สมเหตุสมผลที่สุดคือการเขียนครั้งเดียวในมาร์กดาวน์จากนั้นแปลงเป็น PDF เพื่อดาวน์โหลดและ html สำหรับเว็บอินเตอร์เฟส สิ่งนี้เป็นไปได้ด้วยแพ็คเกจ pandoc
ในเวลาเดียวกัน ไฟล์ทั้งหมดเหล่านี้จำเป็นต้องถูกสร้างขึ้นก่อนที่จะประกอบอิมเมจระบบ สคริปต์หลัง build เหล่านั้นไม่มีประโยชน์แล้ว ดังนั้นการสร้างจึงทำในรูปแบบของแพ็คเกจคู่มือ คุณสามารถดูโอเวอร์เลย์/แพ็คเกจ/คู่มือได้
ไฟล์ manuals.mk (ซึ่งทำงานได้ทั้งหมด)
################################################################################
#
# manuals
#
################################################################################
MANUALS_VERSION:= 1.0.0
MANUALS_SITE:= ${BR2_EXTERNAL_monitorOverlay_PATH}/package/manuals
MANUALS_SITE_METHOD:=local
define MANUALS_BUILD_CMDS
pandoc -s -o ${TARGET_DIR}/var/www/manual_en.pdf ${BR2_EXTERNAL_monitorOverlay_PATH}/../README.md
pandoc -f markdown -t html -o ${TARGET_DIR}/var/www/manual_en.html ${BR2_EXTERNAL_monitorOverlay_PATH}/../README.md
endef
$(eval $(generic-package))
systemd
โลกของ Linux กำลังเคลื่อนตัวไปสู่ systemd อย่างจริงจัง และฉันก็ต้องทำเช่นกัน
หนึ่งในนวัตกรรมที่น่าพึงพอใจคือการมีตัวจับเวลา โดยทั่วไปมีการเขียนบทความแยกต่างหากเกี่ยวกับพวกเขา (และไม่เพียงเกี่ยวกับพวกเขา) แต่ฉันจะบอกคุณสั้น ๆ
มีการกระทำที่ต้องทำเป็นระยะ ฉันจำเป็นต้องเรียกใช้ logrotate เพื่อล้างบันทึก lighttpd และ php-fpm สิ่งปกติคือการเขียนคำสั่งใน cron แต่ฉันตัดสินใจใช้ตัวจับเวลาแบบ monotonic systemd ดังนั้น logrotate จึงทำงานในช่วงเวลาที่เข้มงวด
แน่นอนว่าคุณสามารถสร้างตัวจับเวลาที่ทำงานในวันที่กำหนดได้ แต่ฉันไม่ต้องการสิ่งนี้
ตัวอย่างตัวจับเวลา:
- ไฟล์ตัวจับเวลา
[Unit] Description=RODOS temp daemon timer
OnUnitActiveSec=1 นาที [ติดตั้ง] WantedBy=timers.target
- Файл сервиса, вызываемого таймером:
```bash
[Unit]
Description=RODOS temp daemon
[Service]
ExecStart=/usr/bin/rodos.sh
บอร์ดที่รองรับ
Asus tinker board เป็นกระดานหลักที่ทุกอย่างควรใช้งานได้ คัดสรรมาว่าราคาไม่แพงและทรงพลังมาก
Beaglebone black เป็นบอร์ดแรกที่ทดสอบการทำงาน (ระหว่างการเลือกบอร์ดที่ทรงพลังกว่า)
Qemu x86_64 - ใช้สำหรับการดีบักการพัฒนา
วิธีการทำงาน
เมื่อเริ่มต้นระบบ การคืนค่าการตั้งค่าสองขั้นตอนจะเกิดขึ้น:
- เรียกใช้สคริปต์ settings_restore (ผ่านบริการ) คืนค่าการตั้งค่าระบบพื้นฐาน - โซนเวลา สถานที่ การตั้งค่าเครือข่าย ฯลฯ
- เรียกใช้สคริปต์เตรียมการ (ผ่านบริการ) - ที่นี่ zabbix และฐานข้อมูลถูกจัดเตรียมไว้ IP จะถูกส่งออกไปยังคอนโซล
เมื่อคุณเริ่มใช้งานครั้งแรก ขนาดของพาร์ติชันที่สองของการ์ด SD จะถูกกำหนด หากยังมีพื้นที่ที่ไม่ได้จัดสรร สื่อจะถูกแบ่งพาร์ติชันใหม่ และส่วนข้อมูลจะใช้พื้นที่ว่างทั้งหมด ทำเช่นนี้เพื่อลดขนาดของอิมเมจการติดตั้ง (sdcard.img) นอกจากนี้ ไดเร็กทอรีการทำงานของ postgresql จะถูกสร้างขึ้น ณ จุดนี้ นั่นคือเหตุผลว่าทำไมการเปิดตัวครั้งแรกกับผู้ให้บริการรายใหม่จึงนานกว่าครั้งถัดไป
เมื่อเชื่อมต่อไดรฟ์ภายนอก ในขณะที่เริ่มต้นระบบจะค้นหาไดรฟ์ฟรีและจัดรูปแบบเป็น ext4 ด้วยป้ายกำกับภายนอก
ความสนใจ! เมื่อเชื่อมต่อไดรฟ์ภายนอก (รวมถึงการถอดหรือเปลี่ยนไดรฟ์) คุณต้องสำรองข้อมูลและกู้คืนการตั้งค่า!
ใช้สำหรับการตรวจสอบอุณหภูมิอุปกรณ์ RODOS 5 ผู้ผลิตให้ซอร์สโค้ดของยูทิลิตี้สำหรับการทำงานกับอุปกรณ์ เมื่อระบบเปิดอยู่ ตัวจับเวลา rodos จะเริ่มทำงาน ซึ่งจะเรียกใช้ยูทิลิตี้นี้นาทีละครั้ง อุณหภูมิปัจจุบันจะถูกเขียนลงในไฟล์ /tmp/rodos_current_temp หลังจากนั้น zabbix จะสามารถตรวจสอบไฟล์นี้เป็นเซ็นเซอร์ได้
สื่อจัดเก็บข้อมูลการกำหนดค่าถูกเมาท์ในไดเร็กทอรี /data
เมื่อเริ่มต้นระบบและเตรียมการทำงาน ข้อความต่อไปนี้จะปรากฏขึ้นในคอนโซล:
System starting, please wait
หลังจากเสร็จสิ้นงานเตรียมการจะเปลี่ยนเป็นการแสดงที่อยู่ IP:
current ip 192.168.1.32
Ready to work
การตั้งค่า zabbix เพื่อตรวจสอบอุณหภูมิ
หากต้องการติดตามอุณหภูมิ เพียง 2 ขั้นตอน:
- เชื่อมต่ออุปกรณ์ RODOS เข้ากับพอร์ต USB
- สร้างรายการข้อมูลใน zabbix
เปิดเว็บอินเตอร์เฟส zabbix:
- เปิดส่วนการกำหนดค่า → โฮสต์
- คลิกที่รายการในบรรทัดของเซิร์ฟเวอร์ zabbix ของเรา
- คลิกที่สร้างรายการ
ป้อนข้อมูลต่อไปนี้:
- ชื่อ - ขึ้นอยู่กับดุลยพินิจของคุณ (เช่น serverRoomTemp )
- ประเภท - ตัวแทน zabbix
- คีย์ - โรดอส
- ประเภท-ตัวเลข
- หน่วย - ค
- ระยะเวลาการเก็บประวัติ — ระยะเวลาการเก็บประวัติ เหลืออีก 10 วัน
- ระยะเวลาการจัดเก็บเทรนด์—ระยะเวลาการจัดเก็บสำหรับการเปลี่ยนแปลงของการเปลี่ยนแปลง เหลืออีก 30 วัน
- แอปพลิเคชั่นใหม่ - อุณหภูมิห้องเซิร์ฟเวอร์
และกดปุ่มเพิ่ม
จัดการการตั้งค่าผ่านทางเว็บอินเตอร์เฟส
เว็บอินเตอร์เฟสเขียนด้วย PHP มีหน้าที่หลัก:
- ดูสถานะอุปกรณ์
- การเปลี่ยนการตั้งค่าเครือข่าย
- การเปลี่ยนรหัสผ่านผู้ใช้
- การเลือกโซนเวลา
- สำรอง/กู้คืน/รีเซ็ตเป็นค่าจากโรงงาน
- ความสามารถในการเชื่อมต่อไดรฟ์ภายนอก
- การอัปเดตระบบ
การเข้าสู่ระบบเว็บอินเตอร์เฟสมีการป้องกันด้วยรหัสผ่าน หน้าเริ่มต้น - คู่มือ
ที่อยู่อินเทอร์เฟซของ Zabbix: ${ip/dns}/zabbix
ที่อยู่อินเทอร์เฟซการจัดการ: ${ip/dns}/manage
กำลังวิ่งอยู่ในคิวมู
qemu-system-x86_64 -smp 4 -m 4026M -enable-kvm -machine q35,accel=kvm -อุปกรณ์ intel-iommu -cpu โฮสต์ -net nic -net bridge,br=bridge0 -device virtio-scsi-pci,id= scsi0 -drive file=output/images/qemu.qcow2,format=qcow2,aio=threads -device virtio-scsi-pci,id=scsi0 -drive file=output/images/external.qcow2,format=qcow2,aio=threads
คำสั่งนี้จะเริ่มต้นระบบด้วย 4 คอร์, 2048 RAM, เปิดใช้งาน KVM, การ์ดเครือข่ายบนบริดจ์ 0 และดิสก์สองตัว: หนึ่งอันสำหรับระบบและอีกอันหนึ่งสำหรับภายนอกสำหรับ postgresql
รูปภาพสามารถแปลงและรันใน Virtualbox:
qemu-img convert -f qcow2 qemu.qcow2 -O vdi qcow2.vdi
qemu-img convert -f qcow2 external.qcow2 -O vdi external.vdi
จากนั้นนำเข้าไปยัง virtualbox และเชื่อมต่อผ่าน sata
ข้อสรุป
ในกระบวนการนี้ ฉันเริ่มสนใจที่จะสร้างผลิตภัณฑ์ที่พร้อมใช้งานซึ่งมีอินเทอร์เฟซที่ไม่สวยงามมากนัก (ฉันไม่ชอบเขียนเลย) แต่เป็นผลิตภัณฑ์ที่ใช้งานได้และกำหนดค่าได้ง่าย
ความพยายามครั้งสุดท้ายในการติดตั้ง zabbix-appliance ใน KVM แสดงให้เห็นว่าขั้นตอนนี้ถูกต้อง (หลังจากการติดตั้งเสร็จสิ้น ระบบจะไม่เริ่มทำงาน) บางทีฉันอาจจะทำอะไรผิด😉
ที่มา: will.com