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文件中的條目:
- 嘗試 <boardname>.<selection>.<mode>.<entry>
- 嘗試 <selection>.<mode>.<entry>
- 嘗試 <boardname>.<entry>
- 嘗試 <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卷中。 volume 和 device 不能同時使用。
如果設置了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