By Arnon Puitrakul - 20 เมษายน 2024
เรื่องราวเกิดจาก เราจำเป็นต้อง Replace SSD ออกจาก Synology NAS ในนั้นมันมี Add-on Package ติดตั้งหลายตัวเช่น Container Manager และ Surveillance Station หากเราดูจาก Guideline ของ Synology บอกว่าต้องลบออกแล้วติดตั้งใหม่ แต่การทำแบบนั้น มันค่อนข้างเสียเวลามาก ๆ วันนี้เราจะมาแนะนำวิธี การย้ายแบบไม่ต้องลงใหม่ ทุกอย่างอยู่ครบ? และ สนุกแบบสุด ๆ กัน
ปล. การเล่นท่านี้ ไม่สามารถทำจาก GUI ของ DSM ได้ จำเป็นต้อง SSH เข้าไป ดังนั้น หากจิต และ Linux Command ไม่แข็ง อย่า หา ทำ เตือนแล้วนะ !
ก่อนเราจะเริ่มกัน สำคัญมาก ๆ เพื่อป้องกันความเสียหายที่อาจจะเกิดขึ้น เราแนะนำให้ Stop Service ตัวที่เราต้องการย้าย และ ตัวที่เป็น Dependencies ก่อนนะ เข้าไปกด Stop ใน Package Manager ได้เลย
จากนั้น เราจะมาเริ่มย้าย Package ทั้งหมดกัน โดยตัว Package นั้นจะอยู่ใน Root Directory ของ Volume ที่เราติดตั้งเอาไว้ เช่น "volume2" เป็นต้น
arnon@thevault:/volume1$ ll | grep "@app"
drwxr-xr-x 1 root root 754 Apr 18 00:46 @appconf
drwxr-xr-x 1 root root 754 Apr 18 00:46 @appdata
drwxr-xr-x 1 root root 754 Apr 18 00:46 @apphome
drwxr-xr-x 1 root root 720 Apr 18 00:46 @appshare
drwxr-xr-x 1 root root 720 Apr 18 00:47 @appstore
drwxr-xr-x 1 root root 720 Apr 18 00:47 @apptemp
ส่วนต่าง ๆ ของ Package นั้นจะถูกแยกส่วนไว้ใน 5 Folder หากเราเข้าไปดูในแต่ละ Folder เราจะพบกับ Folder ย่อย ๆ ที่เป็นชื่อของ Package ต่าง ๆ ที่เราติดตั้งอยู่ นั่นแหละ คือเป้าหมายในการย้ายของเรา
sudo cp /volume2/@appconf/SurveillanceStation/ /volume1/\@appconf/ -R
sudo cp /volume2/@appdata/SurveillanceStation/ /volume1/\@appdata/ -R
sudo cp /volume2/@apphome/SurveillanceStation/ /volume1/\@apphome/ -R
sudo cp /volume2/@appshare/SurveillanceStation/ /volume1/\@appshare/ -R
sudo cp /volume2/@appstore/SurveillanceStation/ /volume1/\@appstore/ -R
sudo cp /volume2/@apptemp/SurveillanceStation/ /volume1/\@apptemp/ -R
ถามว่า ย้ายมันไปที่ไหน ก็ต้องตอบว่า ให้ย้ายไปที่เดิม แค่เปลี่ยน Volume เท่านั้นเอง แต่เราแนะนำว่า อย่าใช้คำสั่ง mv ให้ Copy เอาน่าจะดีกว่า เผื่อไว้ก่อน และเมื่อเราจัดการย้ายอะไรเรียบร้อยค่อยลบออกก็ยังไม่สาย
หลังจาก Copy ทุกอย่างไปหมดแล้ว เราดูที่ Package Manager เราจะเห็นว่า Installed Volume ยังไม่เปลี่ยน เอ๊ะ มันเกิดอะไรขึ้น
สิ่งที่เกิดขึ้นจริงคือ เมื่อ Synology อนุญาติให้เราติดตั้ง Package ลงไปใน Volume ไหนก็ได้ ถ้ามันต้องมานั่งจำว่าอะไรติดตั้งไว้ตรงไหน มันน่าจะเป็นเรื่องยุ่งยากแน่นอน ทำให้เขาเลือกใช้วิธีการเป็นทำเป็นเหมือน Shortcut เอาไว้ในอีกส่วนหนึ่ง ดังนั้น เราจะต้องเข้าไปลบ Shortcut ของเก่า และ แทนที่ด้วยของใหม่นั่นเอง
arnonpuitrakul@thevault:/var/packages/SurveillanceStation$ ll
total 100
drwxr-xr-x 5 root root 4096 Apr 14 21:41 .
drwxr-xr-x 48 root root 4096 Apr 18 00:47 ..
drwxr-xr-x 2 root root 4096 Apr 14 21:41 conf
-rw-r--r-- 1 root root 0 Apr 14 21:41 enabled
lrwxrwxrwx 1 root root 37 Apr 13 22:52 etc -> /volume1/@appconf/SurveillanceStation
lrwxrwxrwx 1 root root 37 Apr 13 22:54 home -> /volume1/@apphome/SurveillanceStation
-rw-r--r-- 1 root root 80603 Apr 13 22:42 INFO
drwxr-xr-x 3 root root 4096 Apr 13 22:42 scripts
lrwxrwxrwx 1 root root 38 Apr 13 22:55 share -> /volume1/@appshare/SurveillanceStation
lrwxrwxrwx 1 root root 38 Apr 13 22:56 target -> /volume1/@appstore/SurveillanceStation
lrwxrwxrwx 1 root root 37 Apr 13 22:57 tmp -> /volume1/@apptemp/SurveillanceStation
lrwxrwxrwx 1 root root 37 Apr 13 22:57 var -> /volume1/@appdata/SurveillanceStation
drwxr-xr-x 2 root root 4096 Apr 13 22:42 WIZARD_UIFILES
โดย Folder ที่ว่า มันจะอยู่ใน /var/packages/[package_name] หากเราลอง List ออกมาดู เราจะพบว่า มันมีทั้งหมด 5 Folder เป็น Shortcut ที่ต่อไปที่ 5 Folder ที่เราพึ่งย้ายไปนิหว่า แปลว่านี่แหละ คือเป้าหมายของเราแน่นอนละ
sudo rm etc home share target tmp var
ดังนั้น ก่อนที่เราจะ Link Folder ใหม่ใส่เข้าไป เราจะต้องลบของเก่าออกก่อน
sudo ln -s "/volume2/@appconf/SurveillanceStation" /var/packages/SurveillanceStation/etc
sudo ln -s "/volume2/@apphome/SurveillanceStation" /var/packages/SurveillanceStation/home
sudo ln -s "/volume2/@appshare/SurveillanceStation" /var/packages/SurveillanceStation/share
sudo ln -s "/volume2/@appstore/SurveillanceStation" /var/packages/SurveillanceStation/target
sudo ln -s "/volume2/@apptemp/SurveillanceStation" /var/packages/SurveillanceStation/tmp
sudo ln -s "/volume2/@appdata/SurveillanceStation" /var/packages/SurveillanceStation/var
จากนั้น เราก็แค่ Link Folder ใหม่ทับเข้าไปก็เป็นอันเรียบร้อย ถ้าเรากลับไปดูที่ Package Manager ตอนนี้เราจะเห็นว่า Installed Volume จะกลายเป็น volume2 ละ เพราะเรา Link Folder ที่มันเรียกไปใน Volume 2 นั่นเอง สุดท้ายเราแค่กด Start ใน Package Manager อีกครั้ง หาก Start ได้ปกติ ก็เป็นอันเรียบร้อยละ
drwx------ 1 SurveillanceStation SurveillanceStation 450 Apr 18 11:47 SurveillanceStation
ปัญหานี้เราเจอกับการย้าย Surveillance Station ก็ งง ๆ นะว่ามันเกิดอะไรขึ้น ปัญหาพื้นฐานสุด เดาว่า น่าจะเกิดจาก Permission ของ Folder หรือไม่ เลยลองเข้าไปเช็คใน Folder ต้นฉบับ พบว่า Group และ Owner เป็นชื่อว่า SurveillanceStation ทั้งหมด
chown -R SurveillanceStation:SurveillanceStation /volume2/@appstore/SurveillanceStation
วิธีการแก้ไขคือ ให้เราใช้คำสั่ง chown เปลี่ยน Group และ Owner ให้ตรงกับต้นฉบับก็จบแล้ว และทำแบบนี้ให้ครบทั้ง 5 Folder ที่เราย้ายไป
ปัญหานี้มันจะเกิดกับบาง Package เท่านั้น เท่าที่เรารู้จะมี Surveillance Station, Synology Drive, Synology Photo, Contracts และ Download Station ส่วนตัวอื่น ๆ เราไม่เคยย้ายเลยไม่ทราบ วิธีการเช็คอย่างที่บอกคือ ให้เข้าไปดูที่ต้นฉบับ เขาเซ็ตไว้ยังไง อย่าไปเปลี่ยนเขา เซ็ตให้เหมือนกับต้นฉบับโลด ปลอดภัยแน่นอน สุดท้ายให้เราลอง Start Package ผ่าน Package Manager อีกครั้ง มันควรจะ Start ติด ผ่านใช้งานได้ปกติ
ความชิบหายการช่างนี้ เกิดกับเราอีกแล้ว ถ้ามันย้ายแล้วไม่มีปัญหา มันจะไปสนุกอะไร๊ ใช่มะทุกคน เรื่องเกิดกับ Package ที่สำคัญมากอย่าง Container Manager หรือ Docker นั่นเอง เรารัน Container ไว้เยอะมาก ๆ สิ่งที่เกิดขึ้นหลังจากการ Relink App Directory คือ ภาษาใน GUI มันแปลก ๆ เหมือนมันหาอ่าน Language ไม่เจอ มันเลยแสดงผลเป็นค่า Default เช่น container:name อะไรเทือก ๆ นั้น ตอนแรกก็เออ ช่าง ๆ มันไม่น่ามีอะไร
จนกระทั่งลบ Volume ออกไป เปิดขึ้นมาใหม่ พบว่า Container Manager ไม่สามารถ Start ได้ มันขึ้นให้ Repair เลยลองกดไปทีนึง มันก็ไม่ Start อีก ขึ้นเหมือนเดิม สรุปต้องลบออกแล้วลงใหม่เหมือนเดิม
สุดท้าย มานั่งดูจริง ๆ เรามาเจอ Post นี้ Moving the Docker package from one volume to another on Synology เขาเล่าวิธีการย้ายเอาไว้ สิ่งที่เราขาดจากเขาไปคือ การย้ายสิ่งที่อยู่ใน Folder @docker ที่ในนั้นมันจะมีทั้ง Volume, Network และส่วนต่าง ๆ ของ Container แต่เราไม่แน่ใจว่า เมื่อย้ายมาแล้ว เราจะต้อง Relink ที่ Folder ไหน ดังนั้น เราแนะนำให้ทำแบบเขาดีกว่า คือ การ Backup @docker ไว้ก่อน แล้วลง Container Manager ใหม่ แล้วค่อยจุ๊บ Backup เราทับเข้าไป
หรืออีกวิธีนึง คือให้เรา Export Container ออกมา ผ่าน Container Manager ตรง ๆ หลังจากติดตั้งใหม่ เราแค่ Import มันกลับเข้าไป ก็ได้เหมือนกัน ค่าทุกอย่างควรจะกลับมาเหมือนเดิม แค่อาจจะต้องไล่ Download Image เข้ามาใหม่ทั้งหมด เสียเวลาเพิ่มนิดหน่อย แต่ชัวร์กว่าเยอะ
การย้าย Add-on Package บน DSM ประกอบด้วย 2 ขั้นตอนใหญ่ ๆ คือ การย้าย Package Folder ทั้งหมด และการสร้าง Symlink เพื่อต่อไปที่ Folder ที่อยู่ Volume ปลายทางใหม่ของเรา แต่แค่อยากให้ระวังเรื่อง Permission และ ข้อมูลของแต่ละ Package หน่อยว่ามันมีอะไรที่แปลกไปจากตัวอื่น ๆ หรือไม่ Package ส่วนใหญ่สามารถใช้วิธีการของเราได้ แต่บางตัว อาจจะมีอะไรมากกว่านั้นเช่น Container Manager ดังนั้น เพื่อความปลอดภัย อย่าลบหรือใช้การย้าย เพราะหากเกิดอะไรขึ้น มันจะ Rollback ไม่ได้เด้อ
Obsidian เป็นโปรแกรมสำหรับการจด Note ที่เรียกว่า สารพัดประโยชน์มาก ๆ เราสามารถเอามาทำอะไรได้เยอะมาก ๆ หนึ่งในสิ่งที่เราเอามาทำคือ นำมาใช้เป็นระบบสำหรับการจัดการ Todo List ในแต่ละวันของเรา ทำอะไรบ้าง วันนี้เราจะมาเล่าให้อ่านกันว่า เราจัดการะบบอย่างไร...
อะ อะจ๊ะเอ๋ตัวเอง เป็นยังไงบ้างละ เมื่อหลายเดือนก่อน เราไปเล่าเรื่องกันขำ ๆ ว่า ๆ จริง ๆ แล้วพวก Loop ที่เราใช้เขียนโปรแกรมกันอยู่ มันไม่มีอยู่จริง สิ่งที่เราใช้งานกันมันพยายาม Abstract บางอย่างออกไป วันนี้เราจะมาถอดการทำงานของ Loop จริง ๆ กันว่า มันทำงานอย่างไรกันแน่ ผ่านภาษา Assembly...
นอกจากการทำให้ Application รันได้แล้ว อีกเรื่องที่สำคัญไม่แพ้กันคือการวางระบบ Monitoring ที่ดี วันนี้เราจะมาแนะนำวิธีการ Monitor การทำงานของ MySQL ผ่านการสร้าง Dashboard บน Grafana กัน...
จากตอนที่แล้ว เราเล่าในเรื่องของการ Harden Security ของ SSH Service ของเราด้วยการปรับการตั้งค่าบางอย่างเพื่อลด Attack Surface ที่อาจจะเกิดขึ้นได้ หากใครยังไม่ได้อ่านก็ย้อนกลับไปอ่านกันก่อนเด้อ วันนี้เรามาเล่าวิธีการที่มัน Advance มากขึ้น อย่างการใช้ fail2ban...