ฮาวทูย้าย Synology Add-on Package ไปอีก Volume

เรื่องราวเกิดจาก เราจำเป็นต้อง Replace SSD ออกจาก Synology NAS ในนั้นมันมี Add-on Package ติดตั้งหลายตัวเช่น Container Manager และ Surveillance Station หากเราดูจาก Guideline ของ Synology บอกว่าต้องลบออกแล้วติดตั้งใหม่ แต่การทำแบบนั้น มันค่อนข้างเสียเวลามาก ๆ วันนี้เราจะมาแนะนำวิธี การย้ายแบบไม่ต้องลงใหม่ ทุกอย่างอยู่ครบ? และ สนุกแบบสุด ๆ กัน

ปล. การเล่นท่านี้ ไม่สามารถทำจาก GUI ของ DSM ได้ จำเป็นต้อง SSH เข้าไป ดังนั้น หากจิต และ Linux Command ไม่แข็ง อย่า หา ทำ เตือนแล้วนะ !

Moving App

ก่อนเราจะเริ่มกัน สำคัญมาก ๆ เพื่อป้องกันความเสียหายที่อาจจะเกิดขึ้น เราแนะนำให้ 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 ได้ปกติ ก็เป็นอันเรียบร้อยละ

ปัญหาที่พบ #1: Start Package แล้วขึ้น Stopped เหมือนเดิม

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 ติด ผ่านใช้งานได้ปกติ

ปัญหาที่พบ #2: บาง Package ไม่ได้เก็บอยู่แค่ใน 5 Folder ที่ย้าย

ความชิบหายการช่างนี้ เกิดกับเราอีกแล้ว ถ้ามันย้ายแล้วไม่มีปัญหา มันจะไปสนุกอะไร๊ ใช่มะทุกคน เรื่องเกิดกับ 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 ไม่ได้เด้อ