balena-image-fs 7.4.0-build-get-filesystem-label-46ac614aac7c4af0d32138df0280881bcc9b10bf-1 → 7.4.0-build-get-filesystem-label-7529f28d616619575443d6336a68be0a8fa9558c-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/build/fsLabel.js +41 -16
- package/build/fsLabel.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file
|
|
|
4
4
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
6
6
|
|
|
7
|
-
## 7.4.0 - 2025-01-
|
|
7
|
+
## 7.4.0 - 2025-01-18
|
|
8
8
|
|
|
9
9
|
* Add getLabel() to retrieve filesystem label [Ken Bannister]
|
|
10
10
|
|
package/build/fsLabel.js
CHANGED
|
@@ -7,6 +7,31 @@ const typed_error_1 = require("typed-error");
|
|
|
7
7
|
const GUID_EFI_SYSTEM = 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B';
|
|
8
8
|
const GUID_MS_BASIC_DATA = 'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7';
|
|
9
9
|
const GUID_LINUX_NATIVE = '0FC63DAF-8483-4772-8E79-3D69D8477DE4';
|
|
10
|
+
// Maximum length to read among various filesystem metadata. Change as needed
|
|
11
|
+
// to support additional filesystems.
|
|
12
|
+
const FS_METADATA_MAXLEN = 0x100;
|
|
13
|
+
// MBR partition type IDs
|
|
14
|
+
// https://en.wikipedia.org/wiki/Partition_type
|
|
15
|
+
const PARTID_FAT32_CHS = 0xB;
|
|
16
|
+
const PARTID_FAT32_LBA = 0xC;
|
|
17
|
+
const PARTID_FAT16_LBA = 0xE;
|
|
18
|
+
const PARTID_LINUX_NATIVE = 0x83;
|
|
19
|
+
// FAT constants
|
|
20
|
+
// https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system#Extended_BIOS_Parameter_Block
|
|
21
|
+
// https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system#FAT32_Extended_BIOS_Parameter_Block
|
|
22
|
+
const FAT_LABEL_MAXLEN = 11;
|
|
23
|
+
const FAT_MAGIC_VALUE = 0x29;
|
|
24
|
+
const FAT16_MAGIC_OFFSET = 0x26;
|
|
25
|
+
const FAT16_LABEL_OFFSET = 0x2B;
|
|
26
|
+
const FAT32_MAGIC_OFFSET = 0x42;
|
|
27
|
+
const FAT32_LABEL_OFFSET = 0x47;
|
|
28
|
+
// EXT4 constants
|
|
29
|
+
// https://www.kernel.org/doc/html/latest/filesystems/ext4/index.html
|
|
30
|
+
const EXT4_SUPERBLOCK_OFFSET = 0x400;
|
|
31
|
+
const EXT4_MAGIC_OFFSET = 0x38;
|
|
32
|
+
const EXT4_MAGIC_VALUE_LE = 0xEF53;
|
|
33
|
+
const EXT4_LABEL_OFFSET = 0x78;
|
|
34
|
+
const EXT4_LABEL_MAXLEN = 16;
|
|
10
35
|
/**
|
|
11
36
|
* @summary An error to describe why getFsLabel() failed to find a filesystem label.
|
|
12
37
|
*/
|
|
@@ -37,9 +62,9 @@ exports.LabelNotFound = LabelNotFound;
|
|
|
37
62
|
async function getFsLabel(disk, partition) {
|
|
38
63
|
const isGpt = 'guid' in partition;
|
|
39
64
|
const isMbr = !isGpt;
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
65
|
+
// Use a buffer capable of reading any filesystem metadata. Defer actual
|
|
66
|
+
// read until select filesystem.
|
|
67
|
+
let buf = Buffer.alloc(FS_METADATA_MAXLEN);
|
|
43
68
|
let labelOffset = 0;
|
|
44
69
|
let maxLength = 0;
|
|
45
70
|
// A filesystem places the label in a certain position in its metadata. So
|
|
@@ -47,37 +72,37 @@ async function getFsLabel(disk, partition) {
|
|
|
47
72
|
// by checking the partition type (MBR) or GUID (GPT) for the containing partition.
|
|
48
73
|
// There are two broad categories -- FAT types and Linux native types. Finally
|
|
49
74
|
// we confirm the presence of signature bytes within the filesystem metadata.
|
|
50
|
-
|
|
51
|
-
const mbrFatTypes = [0xB, 0xC, 0xE];
|
|
75
|
+
const mbrFatTypes = [PARTID_FAT32_CHS, PARTID_FAT32_LBA, PARTID_FAT16_LBA];
|
|
52
76
|
const gptFatTypes = [GUID_EFI_SYSTEM, GUID_MS_BASIC_DATA];
|
|
53
77
|
let foundPartType = false;
|
|
54
78
|
let foundLabel = false;
|
|
55
79
|
if (isMbr && mbrFatTypes.some(ptype => partition.type === ptype)
|
|
56
80
|
|| isGpt && gptFatTypes.some(ptype => partition.type === ptype)) {
|
|
57
81
|
foundPartType = true;
|
|
58
|
-
maxLength =
|
|
82
|
+
maxLength = FAT_LABEL_MAXLEN;
|
|
83
|
+
await disk.read(buf, 0, buf.length, partition.offset);
|
|
59
84
|
// FAT16
|
|
60
|
-
if (buf.readUInt8(
|
|
61
|
-
labelOffset =
|
|
85
|
+
if (buf.readUInt8(FAT16_MAGIC_OFFSET) === FAT_MAGIC_VALUE) {
|
|
86
|
+
labelOffset = FAT16_LABEL_OFFSET;
|
|
62
87
|
foundLabel = true;
|
|
63
88
|
// FAT32
|
|
64
89
|
}
|
|
65
|
-
else if (buf.readUInt8(
|
|
66
|
-
labelOffset =
|
|
90
|
+
else if (buf.readUInt8(FAT32_MAGIC_OFFSET) === FAT_MAGIC_VALUE) {
|
|
91
|
+
labelOffset = FAT32_LABEL_OFFSET;
|
|
67
92
|
foundLabel = true;
|
|
68
93
|
}
|
|
69
94
|
}
|
|
70
|
-
// Linux filesytem of some kind
|
|
95
|
+
// Linux filesytem of some kind; execting ext2+
|
|
71
96
|
const gptLinuxTypes = [GUID_LINUX_NATIVE, GUID_MS_BASIC_DATA];
|
|
72
97
|
if (!foundLabel
|
|
73
|
-
&& ((isMbr && partition.type ===
|
|
98
|
+
&& ((isMbr && partition.type === PARTID_LINUX_NATIVE)
|
|
74
99
|
|| (isGpt && gptLinuxTypes.some(ptype => partition.type === ptype)))) {
|
|
75
100
|
foundPartType = true;
|
|
76
|
-
maxLength =
|
|
101
|
+
maxLength = EXT4_LABEL_MAXLEN;
|
|
77
102
|
// ext2+; reload buffer within superblock
|
|
78
|
-
await disk.read(buf, 0, buf.length, partition.offset +
|
|
79
|
-
if (buf.readUInt16LE(
|
|
80
|
-
labelOffset =
|
|
103
|
+
await disk.read(buf, 0, buf.length, partition.offset + EXT4_SUPERBLOCK_OFFSET);
|
|
104
|
+
if (buf.readUInt16LE(EXT4_MAGIC_OFFSET) === EXT4_MAGIC_VALUE_LE) {
|
|
105
|
+
labelOffset = EXT4_LABEL_OFFSET;
|
|
81
106
|
foundLabel = true;
|
|
82
107
|
}
|
|
83
108
|
}
|
package/build/fsLabel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsLabel.js","sourceRoot":"","sources":["../lib/fsLabel.ts"],"names":[],"mappings":";;;AAEA,6CAAyC;AAEzC,sBAAsB;AACtB,0EAA0E;AAC1E,MAAM,eAAe,GAAG,sCAAsC,CAAC;AAC/D,MAAM,kBAAkB,GAAG,sCAAsC,CAAC;AAClE,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;AAEjE;;GAEG;AACH,MAAa,aAAc,SAAQ,wBAAU;IAC5C,YAAY,cAAsB,EAAE,WAAmB;QACtD,KAAK,CAAC,oBAAoB,cAAc,KAAK,WAAW,EAAE,CAAC,CAAC;IAC7D,CAAC;CACD;AAJD,sCAIC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,UAAU,UAAU,CAC/B,IAAU,EACV,SAAsC;IAEtC,MAAM,KAAK,GAAG,MAAM,IAAI,SAAS,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAA;IAEpB,
|
|
1
|
+
{"version":3,"file":"fsLabel.js","sourceRoot":"","sources":["../lib/fsLabel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "balena-image-fs",
|
|
3
|
-
"version": "7.4.0-build-get-filesystem-label-
|
|
3
|
+
"version": "7.4.0-build-get-filesystem-label-7529f28d616619575443d6336a68be0a8fa9558c-1",
|
|
4
4
|
"description": "Image filesystem manipulation utilities",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"homepage": "https://github.com/balena-io-modules/balena-image-fs",
|
|
@@ -59,6 +59,6 @@
|
|
|
59
59
|
"node": ">=16"
|
|
60
60
|
},
|
|
61
61
|
"versionist": {
|
|
62
|
-
"publishedAt": "2025-01-
|
|
62
|
+
"publishedAt": "2025-01-18T18:31:06.794Z"
|
|
63
63
|
}
|
|
64
64
|
}
|