1. 程式人生 > >【swupdate文件 四】SWUpdate:使用預設解析器的語法和標記

【swupdate文件 四】SWUpdate:使用預設解析器的語法和標記

SWUpdate:使用預設解析器的語法和標記

介紹

SWUpdate使用庫“libconfig”作為映象描述的預設解析器。
但是,可以擴充套件SWUpdate並新增一個自己的解析器,
以支援不同於libconfig的語法和語言。
在examples目錄中,有一個用Lua編寫的,支援解析XML形式 描述檔案的解析器。

使用預設解析器,則sw-description遵循libconfig手冊中描述的語法規則。
請參閱http://www.hyperrealm.com/libconfig/libconfig_manual.html
以瞭解基本型別。 整個描述必須包含在sw-description檔案中:
SWUpdate不允許使用#include指令。 下面的例子更好地解釋了當前實現的標記:

software =
{
    version = "0.1.0";
    description = "Firmware update for XXXXX Project";

    hardware-compatibility: [ "1.0", "1.2", "1.3"];

    /* partitions tag is used to resize UBI partitions */
    partitions: ( /* UBI Volumes */
        {
            name = "rootfs";
            device = "mtd4";
            size = 104896512; /* in bytes */
        },
        {
            name = "data";
            device = "mtd5";
            size = 50448384; /* in bytes */
        }
    );


    images: (
        {
            filename = "rootfs.ubifs";
            volume = "rootfs";
        },
        {
            filename = "swupdate.ext3.gz.u-boot";
            volume = "fs_recovery";
        },
        {
            filename = "sdcard.ext3.gz";
            device = "/dev/mmcblk0p1";
            compressed = true;
        },
        {
            filename = "bootlogo.bmp";
            volume = "splash";
        },
        {
            filename = "uImage.bin";
            volume = "kernel";
        },
        {
            filename = "fpga.txt";
            type = "fpga";
        }
    );

    files: (
        {
            filename = "README";
            path = "/README";
            device = "/dev/mmcblk0p1";
            filesystem = "vfat"
        }
    );

    scripts: (
        {
            filename = "erase_at_end";
            type = "lua";
        },
        {
            filename = "display_info";
            type = "lua";
        }
    );

    bootenv: (
        {
            filename = "bootloader-env";
            type = "bootloader";
        },
        {
            name = "vram";
            value = "4M";
        },
        {
            name = "addfb";
            value = "setenv bootargs ${bootargs} omapfb.vram=1:2M,2:2M,3:2M omapdss.def_disp=lcd"
        }
    );
}

第一個標籤是“軟體”。整個描述包含在這個標籤中。 可以使用 特定的板級設定_
_對每個裝置的設定進行分組。

處理配置的差異

這個概念可以擴充套件到交付單個映像,在其中包含用於多個不同裝置的釋出。
每個裝置都有自己的核心、dtb和根檔案系統,或者它們可以共享某些部分。

目前,這是通過編寫自己的解析器來管理的(並且已經在實際專案中使用),
解析器在識別出軟體當前執行在什麼裝置上之後,檢查必須安裝哪些映象。
因為外部解析器可以用Lua編寫,而且它是完全可定製的,
所以每個人都可以設定自己的規則。
對於這個特定的例子,sw-description是用XML格式編寫的,
帶有標識來標記每個裝置對應的映象。要執行它需要liblxp庫。

<?xml version="1.0" encoding="UTF-8"?>
<software version="1.0">
  <name>Update Image</name>
  <version>1.0.0</version>
  <description>Firmware for XXXXX Project</description>

  <images>
    <image device="firstdevice" version="0.9">
      <stream name="dev1-uImage" type="ubivol" volume="kernel" />
      <stream name="dev1.dtb" type="ubivol" volume="dtb" />
      <stream name="dev1-rootfs.ubifs" type="ubivol" volume="rootfs"/>
      <stream name="dev1-uboot-env" type="uboot" />
      <stream name="raw_vfat" type="raw" dest="/dev/mmcblk0p4" />
      <stream name="sdcard.lua" type="lua" />
    </image>

    <image device="seconddevice" version="0.9">
      <stream name="dev2-uImage" type="ubivol" volume="kernel" />
      <stream name="dev2.dtb" rev="0.9" type="ubivol" volume="dtb" />
      <stream name="dev2-rootfs.ubifs" type="ubivol" volume="rootfs"/>
    </image>
  </images>
</software>

支援本例子的解析器位於/examples目錄中。
通過識別哪個是正在執行的裝置,解析器返回一個表,
其中包含必須安裝的映象及其關聯的處理程式。

讀取交付的映象時,SWUpdate將忽略解析器處理列表之外的所有映象。
通過這種方式,可以使用單個交付映象來更新多個裝置。

預設解析器也支援多個裝置。

software =
{
    version = "0.1.0";

    target-1 = {
            images: (
                    {
                            ...
                    }
            );
    };

    target-2 = {
            images: (
                    {
                            ...
                    }
            );
    };
}

通過這種方式,可以使用單個映象為你的所有裝置提供軟體。

預設情況下,硬體資訊是從 /etc/hwrevision 檔案中提取的。
檔案應包含單行資訊,格式如下:

<boardname> <revision>

Where:

  • <revision> 將用於與硬體相容列表匹配
  • <boardname> 可用於對板子的具體設定進行分組

軟體集合

軟體集合和操作模式可用於實現雙拷貝策略。
最簡單的情況是為韌體映像定義兩個安裝位置, 並在呼叫 SWUpdate
時選擇適當的映象。

software =
{
        version = "0.1.0";

        stable = {
                copy-1: {
                        images: (
                        {
                                device = "/dev/mtd4"
                                ...
                        }
                        );
                }
                copy-2: {
                        images: (
                        {
                                device = "/dev/mtd5"
                                ...
                        }
                        );
                }
        };
}

通過這種方式,可以指定 copy-1 安裝到 /dev/mtd4 , 而 copy-2 安裝到
/dev/mtd5 。 通過正確選擇安裝位置, SWUpdate 將更新另一個插槽中的韌體。

具體映象的選擇方法超出了SWUpdate的範圍內, 使用者要負責呼叫 SWUpdate
並傳入適當的設定。

查詢檔案元素的優先順序

SWUpdate根據以下優先順序搜尋sdw-description檔案中的條目:

  1. 嘗試 <boardname>.<selection>.<mode>.<entry>
  2. 嘗試 <selection>.<mode>.<entry>
  3. 嘗試 <boardname>.<entry>
  4. 嘗試 <entry>

舉一個例子。下面的sw-description描述了一組板子的釋出。

software =
{
        version = "0.1.0";

        myboard = {
            stable = {
                copy-1: {
                        images: (
                        {
                                device = "/dev/mtd4"
                                ...
                        }
                        );
                }
                copy-2: {
                        images: (
                        {
                                device = "/dev/mtd5"
                                ...
                        }
                        );
                }
            }
        }

        stable = {
            copy-1: {
                  images: (
                      {
                           device = "/dev/mtd6"
                                ...
                      }
                   );
            }
            copy-2: {
                   images: (
                   {
                           device = "/dev/mtd7"
                                ...
                   }
                   );
            }
        }
}

myboard 上執行時,SWUpdate會搜尋並找到myboard.stable.copy1(2)。
當在其他板子上執行時,SWUpdate則無法找到一個與板子名字對應的條目,
那它就會退回到沒有指定板子名字的版本。
這樣就可以使用一個釋出版本,適配擁有完全不同硬體的不同板子。 例如,
myboard 可以是eMMC和ext4檔案系統,而另一個裝置可以是raw flash並安裝
UBI檔案系統。然而,它們都是同一版本的不同格式,可以在sw-description中一起描述。
重要的是,要理解SWUpdate在解析期間如何按優先順序掃描條目。

使用連結

sw-description可能變得非常複雜。
讓我們假設只有一個板子,但是存在多個硬體版本,它們在硬體上是不同的。
這些版本中有些可以統一處理,有些則需要特殊的部分。
一種方法(但不是唯一的方法!)是新增 mode 並使用 -e stable,<rev number>
做選擇。

software =
{
    version = "0.1.0";

    myboard = {
            stable = {

        hardware-compatibility: ["1.0", "1.2", "2.0", "1.§, "3.0", "3.1"];
        rev-1.0: {
            images: (
                ...
            );
            scripts: (
                ...
            );
        }
        rev-1.2: {
            hardware-compatibility: ["1.2"];
            images: (
                ...
            );
            scripts: (
                ...
            );
        }
        rev-2.0: {
            hardware-compatibility: ["2.0"];
            images: (
                ...
            );
            scripts: (
                               ...
            );
        }
        rev-1.3: {
            hardware-compatibility: ["1.3"];
            images: (
                                ...
            );
            scripts: (
                                ...
            );
        }

        rev-3.0:
        {
            hardware-compatibility: ["3.0"];
            images: (
                ...
            );
            scripts: (
                ...
            );
                }
        rev-3.1:
        {
            hardware-compatibility: ["3.1"];
            images: (
                ...
            );
            scripts: (
                ...
            );
        }
         }
        }
}

如果它們每個都需要一個單獨的部分,那麼這是一種方法。
儘管如此,更可能的情況時,不同的修訂版本可以被當成一類,
例如,具有相同主要修訂號的板子可能具有相同的安裝說明。
在這個例子中,則可匯出三個分組,rev1.X, rev2.X 和 rev3.X。
連結允許將部分分組在一起。當SWUpdate搜尋組
(images、files、scripts、bootenv)時,如果發現“ref”,
它將用字串的值替換樹中的當前路徑。這樣,上面的例子可以這樣寫:

software =
{
            version = "0.1.0";

            myboard = {
            stable = {

                    hardware-compatibility: ["1.0", "1.2", "2.0", "1.3, "3.0", "3.1"];
                    rev-1x: {
                            images: (
                               ...
                            );
                            scripts: (
                                ...
                            );
                    }
                    rev1.0 = {
                            ref = "#./rev-1x";
                    }
                    rev1.2 = {
                            ref = "#./rev-1x";
                    }
                    rev1.3 = {
                            ref = "#./rev-1x";
                    }
                    rev-2x: {
                            images: (
                                 ...
                            );
                            scripts: (
                                 ...
                            );
                    }
                    rev2.0 = {
                            ref = "#./rev-2x";
                    }

                    rev-3x: {
                            images: (
                                 ...
                            );
                            scripts: (
                                  ...
                            );
                }
                    rev3.0 = {
                            ref = "#./rev-3x";
                    }
                    rev3.1 = {
                            ref = "#./rev-3x";
                    }
         }
        }
   }

這種連結可以是絕對的,也可以是相對的。關鍵字 ref 用於指示一個連結。
如果找到連結,SWUpdate將遍歷樹,並將當前路徑替換為 "ref"
指向的字串中的值。 用於連結的規則很簡單:

  • 必須以字元 '#' 開頭
  • "." 指向樹中的當前層級,即 "ref" 的父級
  • ".." 指向樹中的父級
  • "/" 在連結中用作欄位分隔符

一個相對路徑有許多前導 "../" 以從當前位置移動到樹的高層級節點
在下面的例子中,rev40設定了一個連結到 "common", 在那可以找到 "images"。
這也是通過連結到父節點中的一個部分來設定的。 路徑
software.myboard.stable.common.images 被替換為
software.myboard.stable.trythis

software =
{
  version = {
      ref = "#./commonversion";
  }

  hardware-compatibility = ["rev10", "rev11", "rev20"];

  commonversion = "0.7-linked";

pc:{
  stable:{

    common:{
    images =
    {
      ref = "#./../trythis";
    }
      };

    trythis:(
    {
    filename = "rootfs1.ext4";
    device = "/dev/mmcblk0p8";
    type = "raw";
    } ,
    {
    filename = "rootfs5.ext4";
    device = "/dev/mmcblk0p7";
    type = "raw";
    }
      );
    pdm3rev10:
      {
      images:(
      {
      filename = "rootfs.ext3"; device = "/dev/mmcblk0p2";}
    );
      uboot:(
      { name = "bootpart";
      value = "0:2";}
    );
      };
      pdm3rev11 =
      {
    ref = "#./pdm3rev10";
      }
      pdm3rev20 =
      {
    ref = "#./pdm3rev10";
      }
      pdm3rev40 =
      {
    ref = "#./common";
      }
    };
  };
}

可以通過連結重定向sw-description中的每個條目,就像上面示例中的 "version"
屬性那樣。

硬體相容性

硬體相容性: [ "major.minor", "major.minor", ... ]

它列出了與此軟體映象相容的硬體修訂版本。

例子:

hardware-compatibility: [ "1.0", "1.2", "1.3"];

這意味著該軟體可以相容硬體修訂版本1.0, 1.2 和 1.3,但不能相容1.1
和其他未在此明確列出的版本。
如何找到正在執行SWUpdate的板子的修訂版本,是另一件事情了。
這裡並沒有假設如何獲得修訂版本(可以通過GPIOs,EEPROM等),
每個專案都可以自由選擇最合適的方式。
在啟動SWUpdate之前,結果必須寫入檔案/etc/hwrevision(如果配置中
指定了另一個檔案,則必須寫入對應的檔案)。

partitions : UBI 佈局

此標記允許更改UBI卷的佈局。
請注意,此處不涉及MTDs,它們是由裝置樹配置的,
或者直接在核心中以另一種方式配置的。

partitions: (
    {
        name = <volume name>;
        size = <size in bytes>;
        device = <MTD device>;
    },
);

所有欄位都是強制的。SWUpdate搜尋所選名稱的卷並調整大小,
如果不存在具有給定名稱的卷,則建立新卷。
在後一種情況下,它是在連線到"device"所指定MTD裝置的UBI裝置上建立的。
"device"可以以數字(如 "mtd4")或名字(及MTD裝置的名字,如
"ubi_partition") 的方式給出。UBI裝置的連線是自動進行的。

images

標籤 "images" 收集安裝到系統中的映像。 語法是:

images: (
    {
        filename[mandatory] = <Name in CPIO Archive>;
        volume[optional] = <destination volume>;
        device[optional] = <destination volume>;
        mtdname[optional] = <destination mtd name>;
        type[optional] = <handler>;
        /* optionally, the image can be copied at a specific offset */
        offset[optional] = <offset>;
        /* optionally, the image can be compressed if it is in raw mode */
        compressed;
    },
    /* Next Image */
    .....
);

volume 僅用於將映象安裝到UBI卷中。 volumedevice 不能同時使用。
如果設定了device,則會自動選中裸資料處理程式(raw handler)。

以下時一個更新UBI卷的例子:

{
    filename = "core-image-base.ubifs";
    volume = "rootfs";
}

要以裸資料形式更新體格映象,語法如下:

{
    filename = "core-image-base.ext3";
    device = "/dev/mmcblk0p1";
}

要將映象寫入到一個指定偏移處,語法如下:

{
    filename = "u-boot.bin";
    device = "/dev/mmcblk0p1";
    offset = "16K";
}

偏移量可處理以下乘法字尾:K=1024和M=1024*1024。

但是,在裸資料模式下寫flash必須以一種特殊的方式進行管理。
Flash在寫入之前必須先擦除,並且寫入NAND時必須處理壞塊和ECC錯誤。
因此,必須選擇處理程式"flash":

例如,要將核心複製到NAND快閃記憶體的MTD7中:

{
    filename = "uImage";
    device = "mtd7";
    type = "flash";
}

filename 是必須的。它是由流提取的檔案的名稱。 volume
僅在UBI卷中是強制性的。它不應該在其他情況下使用。

另外,對於處理程式 "flash",可以指定 mtdname 來代替裝置名稱:

{
    filename = "uImage";
    mtdname = "kernel";
    type = "flash";
}

Files

可以複製單個檔案而不是完整映象。
這不是首選的方法,但是可以用於除錯或特殊目的。

files: (
    {
        filename = <Name in CPIO Archive>;
        path = <path in filesystem>;
        device[optional] = <device node >;
        filesystem[optional] = <filesystem for mount>;
        properties[optional] = {create-destination = "true";}
    }
);

"files" 部分中的條目會作為單個檔案進行管理。 "filename" 和 "path"
屬性是必須的。 屬性 "device" 和 "filesystem" 是可選的;
它們用於告訴SWUpdate,在將"filename"拷貝到"path"之前
先掛載裝置(以給定的檔案系統型別進行掛載,如 "ext4")。
如果沒有指定"device"和"filesystem",
則"filename"會被拷貝到當前根檔案系統的"path"。

一般來說,如果目標路徑不存在,swupdate不會複製檔案。
可以使用特殊屬性"create-destination"更改此行為。

Scripts

指令碼按照它們被放入sw-description檔案的順序執行。
指令碼的結果由SWUpdate進行評估,如果結果是<> 0,則停止更新並報錯。

它們在執行之前會被複制到一個臨時目錄中,
並且它們的名字在同一個cpio歸檔中必須是惟一的。

如果沒有給出型別,SWUpdate預設為 "lua"。

Lua

scripts: (
    {
        filename = <Name in CPIO Archive>;
        type = "lua";
    },
);

Lua指令碼使用內部直譯器執行。

它們必須具有下列函式中的至少一個:

function preinst()

SWUpdate掃描所有指令碼並檢查preinst函式。在安裝映象之前呼叫它。

function postinst()

SWUpdate掃描所有指令碼並檢查postinst函式。它是在安裝映象之後呼叫的。

shellscript

scripts: (
    {
        filename = <Name in CPIO Archive>;
        type = "shellscript";
    },
);

Shell指令碼通過system命令呼叫。
SWUpdate掃描所有指令碼,並在安裝映象之前和之後呼叫它們。
SWUpdate將'preinst'或'postinst'作為指令碼的第一個引數傳遞。
如果定義了data屬性,它的值將作為最後一個引數傳遞給指令碼。

preinstall

scripts: (
    {
        filename = <Name in CPIO Archive>;
        type = "preinstall";
    },
);

preinstall 是通過system命令呼叫的shell指令碼。
SWUpdate掃描所有指令碼並在安裝映像之前呼叫它們。
如果定義了data屬性,它的值將作為最後一個引數傳遞給指令碼。

postinstall

scripts: (
    {
        filename = <Name in CPIO Archive>;
        type = "postinstall";
    },
);

postinstall 是通過system命令呼叫的shell指令碼。
SWUpdate掃描所有指令碼,並在安裝映象後呼叫它們。
如果定義了data屬性,它的值將作為最後一個引數傳遞給指令碼。

bootloader

有兩種方法可以更新引導載入程式(當前支援U-Boot、GRUB和EFI Boot Guard)
的環境變數。 第一種方法是新增一個包含要更改的變數列表的檔案,
並將“bootloader”設定為映象的型別。
這將通知SWUpdate呼叫引導載入程式處理程式來處理檔案
(需要在配置中啟用引導載入程式處理程式)。
對於所有受支援的引導載入程式,都有一個引導載入程式處理程式。 必須從
menuconfig 的引導載入程式選擇選單中選擇適當的引導載入程式。

bootenv: (
    {
        filename = "bootloader-env";
        type = "bootloader";
    },
)

檔案的格式在U-boot文件中有描述。每一行都是如下格式

<name of variable>  <value>

如果值缺失,則變數將被去掉。 在當前實現中,GRUB和EFI Boot Guard
的環境變數修改也繼承了上述檔案格式。

第二種方法是在組設定中定義需要更改的變數:

bootenv: (
    {
        name = <Variable name>;
        value = <Variable value>;
    },
)

SWUpdate將在內部生成一個指令碼,該指令碼將傳遞給
引導載入程式處理程式,用於調整環境變數。

為了向後相容以前構建的 .swu 映象,"uboot" 組名仍然作為別名支援。
但是,它實際上已經被棄用了,不建議繼續使用它。

特定的板級設定

每個設定都可以放在與板名匹配的自定義標記下。
此機制可用於以板卡特有的方式覆蓋特定設定。

假設硬體資訊檔案 /etc/hwrevision 包含以下條目:

my-board 0.1.0

以及以下描述:

software =
{
        version = "0.1.0";

        my-board = {
                bootenv: (
                {
                        name = "bootpart";
                        value = "0:2";
                }
                );
        };

        bootenv: (
        {
                name = "bootpart";
                value = "0:1";
        }
        );
}

SWUpdate將在這個板子的引導載入程式環境中將 bootpart 設定為 0:2 。
對於所有其他板子, bootpart 將被設定為 0:1 。
特定於板子的設定優先於預設作用域的設定。

軟體集合和操作模式

軟體集合和操作模式擴充套件了描述檔案語法,
以提供對之前介紹的所有配置標記的疊加分組。 這種機制類似於
特定的板級設定_ ,可用於實現雙拷貝策略,
或者用單個更新檔案內同時交付穩定和不穩定版本的映象。

該機制使用放置在 software 標籤範圍內的自定義使用者定義標籤。
標籤不能使用以下名字: version, hardware-compatibility, uboot, bootenv,
files, scripts, partitions, images

示例描述檔案:

software =
{
        version = "0.1";

        hardware-compatibility = [ "revA" ];

        /* differentiate running image modes/sets */
        stable:
        {
                main:
                {
                        images: (
                        {
                                filename = "rootfs.ext3";
                                device = "/dev/mmcblk0p2";
                        }
                        );

                        bootenv: (
                        {
                                name = "bootpart";
                                value = "0:2";
                        }
                        );
                };
                alt:
                {
                        images: (
                        {
                                filename = "rootfs.ext3";
                                device = "/dev/mmcblk0p1";
                        }
                        );

                        bootenv: (
                        {
                                name = "bootpart";
                                value = "0:1";
                        }
                        );
                };

        };
}

這個配置描述了一個名為 stable 的軟體集合。
併為這個集合指定了兩個不同的映象安裝位置: /dev/mmcblk0p1 和
/dev/mmcblk0p2 分別用於 main 模式和 alt 模式。

該特性可以通過顯式指定集合和模式來實現雙拷貝策略。

檢查已安裝軟體的版本

SWUpdate支援可選地驗證子映象是否已經被安裝了,
如果要安裝的版本完全相同,則可以跳過它的安裝。
這在安裝某些高風險映象或需要加速升級過程的情況下是非常有用的。

一種情況是需要更新引導載入程式。在大多數情況下,
不需要升級引導載入程式,但是實踐表明,在某些情況下, 確實有必要升級 -
專案經理應該承擔這個風險。
經過如此,始終將引導載入程式映象作為.swu檔案的一部分是更好的,
這樣可以在單個檔案中獲得裝置的整個發行版,但是裝置應該僅在必要時安裝它。

SWUpdate搜尋包含已安裝映像的所有版本資訊的檔案(預設位置是/etc/sw-versions)。
這個檔案必須在執行SWUpdate之前生成。

檔案必須包含成對的資訊,即映象名稱和版本:

<name of component> <version>

版本是一個字串,可以有任何值。例如:

bootloader              2015.01-rc3-00456-gd4978d
kernel                  3.17.0-00215-g2e876af

在sw-description中,可選屬性 "name"、"version"
和"install-if-different"提供了連線。
name和version將用於與版本檔案中的資料進行比較。
install-if-different則是一個布林值,用於對此映象啟用版本檢查。
這樣就可以只對要安裝的映象們的一個子集進行版本檢查。

嵌入指令碼

可以將指令碼嵌入到sw-description中。這在許多情況下非常有用,
因為一些引數只有在目標上實際執行時知道。
指令碼是全域性的,面向所有部分,但是它可以包含幾個函式,
這些函式可以針對sw-description檔案中的每個條目。

這些屬性用於嵌入指令碼:

embedded-script = "<Lua code">

必須考慮到解析器已經在執行,雙引號的使用可能會干擾解析器。
因此,指令碼中的每個雙引號都必須轉義。

這意味著像這樣的一個簡單的Lua程式碼:

print ("Test")

修改改成這樣:

print (\"Test\")

不然解析器會認為指令碼已經關閉,併產生一個錯誤。
有關如何使用它的示例,請參見示例目錄。
檔案或映象中的任何條目都可以觸發指令碼中的一個函式。 "hook"
屬性告訴解析器載入指令碼並搜尋鉤子屬性指向的函式。例如:

files: (
    {
        filename = "examples.tar";
        type = "archive";
        path = "/tmp/test";
        hook = "set_version";
        preserve-attributes = true;
    }
);

在解析條目之後,解析器執行hook所指向的Lua函式。
如果Lua未被啟用,解析器將引發一個錯誤,
因為必須解析帶有嵌入指令碼的sw-description,但直譯器不可用。
每個Lua函式接收一個帶有當前條目設定的表作為引數。 Lua鉤子的格式是:

function lua_hook(image)

引數image是一個表,其關鍵字是有效屬性的列表。
如果一個屬性包含了"-",則會被替換為"_",因為Lua中不能使用 "-"。
這意味著,如下例子:

install-if-different ==> install_if_different
install-directly     ==> install_directly

可以在Lua指令碼中更改屬性,並在返回時接管值。 Lua函式必須返回2個值:

  • 一個布林值,指示解析是否正確
  • 映象表或nil以表示應該跳過該映象

例子:

function set_version(image)
    print (\"RECOVERY_STATUS.RUN: \".. swupdate.RECOVERY_STATUS.RUN)
        for k,l in pairs(image) do
                swupdate.trace(\"image[\" .. tostring(k) .. \"] = \" .. tostring(l))
        end
    image.version = \"1.0\"
    image.install_if_different = true
    return true, image
end

該示例為已安裝映象設定了一個版本。
通常,這是在執行時從目標讀取資料檢測到的。

屬性參考

在sw-description中有4個主要部分:

  • images: 條目是映象,SWUpdate對它們一無所知。
  • files: 條目是檔案,SWUpdate需要一個用於它們的檔案系統。
    這通常用於從tar-ball展開或更新單個檔案。
  • scripts:
    所有條目都被視為可執行檔案,它們將被執行兩次(作為安裝前和安裝後腳本)。
  • bootenv:條目是引導載入程式環境變數名及其值的鍵值對。
名字 型別 應用於 描述
filename string images files scripts 在cpio存檔中找到的檔名。
volume string images 僅在 type = “ubivol”時使用。 指明映象將安裝到哪個UBI卷。
ubipartition string images 僅在 type = “ubivol”時使用。 要建立或調整大小的UBI卷。
device string images files 在/dev下可找到的裝置節點,或者是到它的 符號連結。 可以指定為絕對路徑,或/dev 下的名字。例如,如果/dev/mtd-dev是一個 指向/dev/mtd3的連結,則 “mtd3”, “mtd-dtb”,”/dev/mtd3”和”/dev/mtd-dtb” 均是有效的名字。 用法取決於具體處理程式。 對於檔案,用於指明哪個裝置用於掛載 “filesystem”,如果未指定,則使用當前的 根檔案系統。
filesystem string files 指示檔案安裝位置的檔案系統型別。 僅在設定了”device”屬性時使用。
path string files 用於檔案:指示用於安裝檔案的路徑 (絕對路徑)。如果設定了”device” 和 “filesystem”, Swupdate將在以指定檔案 系統型別掛載裝置後再安裝檔案。 (路徑總是相對於掛載點而言的)
preserve-attributes bool files 標記,用於控制從歸檔檔案解壓檔案時 是否保留下列屬性 (當然,前提是目標檔案系統支援它們): timestamp, uid/gid (numeric), perms, file attributes, extended attributes
type string images files scripts 處理程式的字串識別符號, 它是由處理程式在註冊自身時設定的。 例如: “ubivol”, “raw”, “rawfile”
compressed bool images files 標記,用於指示”filename”是zlib壓縮的, 在安裝之前必須先解壓
installed-directly bool images 標誌,用於指示映象需流式更新到目標中, 不需要任何臨時副本。 並非所有處理程式都支援流式更新。
name string bootenv 要設定的載入程式環境變數的名字。
value string bootenv 要賦給引導載入程式環境變數的值。
name string images files 標識sw-component的名稱,它可以是任何 字串,將與sw-versions中的條目做比較
version string images files sw-component的版本,可以是任何字串, 將與sw-version中的條目做比較
description string swupdate歸檔檔案的使用者友好的描述 (可使用任意字串)
install-if-different bool images files 標誌 如果設定了,名字和版本會於版本檔案中 的條目做比較。
encrypted bool images files scripts 標誌 如果設定了, 檔案會被加密並必須先解密後 安裝。
data string images files scripts 用於將任意資料傳遞給處理程式。
sha256 string images files scripts 映象、檔案或指令碼的sha256雜湊值。 用於簽名映象的校驗。
embedded-script string 嵌入sw-description檔案中的Lua程式碼。
offset string images 可選的目的位置的偏移量。
hook string images files 解析條目時要呼叫的函式(Lua)的名稱。
mtdname string images 要更新的MTD的名稱。僅被flash處理程式 用來代替具體的裝置節點名,以識別要 更新的MTD。

本文地址 https://www.cnblogs.com/zqb-all/p/10166493.html

譯自 swupdate 文件 https://sbabic.github.io/swupdate/sw-description.html

有更新會在github上釋出 https://zqb-all.github.io/swupdate/sw-description.html