2012-10-27 21 views
0

我具有內部SD卡的嵌入式Linux設備上工作的內部SD卡。此設備需要更新才能打開設備並取出SD卡。目標是讓用戶使用USB閃存驅動器更新設備。我想用新的SD卡映像完全覆蓋內部SD卡。閃爍被安裝作爲根

我首先想到的是要卸載的根文件系統和使用的東西來的效果:

dd if=/mnt/flashdrive/update.img of=/dev/sdcard 

然而,這似乎難以真正正確卸載根文件系統,像「登錄」和「systemd過程「仍在使用根目錄上的資源。例如,一旦您終止登錄,更新腳本也會被終止。

當然,我們總是可以使用DD,而無需卸載根。然而,這看起來很愚蠢。 :P

我還想到修改系統初始化腳本系統實際安裝根文件系統之前執行此邏輯。

有沒有執行此類型的更新的正確/簡單的方法?我會想象它已經完成。

謝謝!

回答

0

重新鏡像安裝的文件系統聽起來不像是個好主意,即使安裝是隻讀的。

考慮:

  • 使用RAMDISK(從壓縮的圖像初始化)爲您的實際根文件系統,但也許有所有,但在文件系統中最重要的工具裝下,它可以滴升級。大多數Linux實現在啓動過程中儘早執行此操作,然後再安裝主磁盤文件系統:重新啓動以執行升級可能是一種選擇。

  • SD卡比你需要的反正可能更大。每次升級時都有兩個分區並在它們之間交替。或者有一個維護分區,您可以啓動它來執行升級/恢復。

  • 不是實際映像文件系統,而是升級單個文件。

+0

我想我們將會用你描述的雙分區設置。這給了很多有趣的優勢,我們可以用2GB的SD卡來支付。感謝你的回答。 – beta

0

嘗試的一個或兩個:

  1. 拉低到單用戶模式第一:telinit 1

或/和

  1. 重新裝入/爲只讀:mount -o remount,ro /
runn之前

荷蘭國際集團的dd

0

就我個人而言,我不會像你一樣做某件事,但它是可以做到的。

您的Linux系統每次啓動時都會啓動它。實際上,發生的情況是你的內核最初掛載了initrd,加載了所有的模塊,之後它調用pivot_root來掛載real /。

pivot_root也可以從外殼中使用的命令,你最好運行man 8 pivot_root但只給你一個想法,你可以做這樣的事情

mount /dev/hda1 /new-root 
cd /new-root 
pivot_root . old-root 
exec chroot . sh <dev/console >dev/console 2>&1 
umount /old-root 

最後一件事:這種方式執行軟件升級是非常薄弱的​​。請考慮其他解決方案。