qemu: boot from mtd using mtd2block
doesn't make much difference for squashfs but this will make it much simpler to test jffs2/ubifs
This commit is contained in:
parent
07e7d63ade
commit
342c87b256
3 changed files with 35 additions and 16 deletions
|
@ -25,6 +25,11 @@
|
||||||
CPU_BIG_ENDIAN= "y";
|
CPU_BIG_ENDIAN= "y";
|
||||||
CPU_MIPS32_R2= "y";
|
CPU_MIPS32_R2= "y";
|
||||||
|
|
||||||
|
MTD = "y";
|
||||||
|
MTD_BLOCK2MTD = "y";
|
||||||
|
MTD_BLKDEVS = "y";
|
||||||
|
MTD_BLOCK = "y";
|
||||||
|
|
||||||
SQUASHFS = "y";
|
SQUASHFS = "y";
|
||||||
SQUASHFS_XZ = "y";
|
SQUASHFS_XZ = "y";
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ echo $QEMU_OPTIONS
|
||||||
qemu-system-mips \
|
qemu-system-mips \
|
||||||
-M malta -m 256 \
|
-M malta -m 256 \
|
||||||
-echr 16 \
|
-echr 16 \
|
||||||
-append "liminix default console=ttyS0,38400n8 panic=10 oops=panic init=$INIT loglevel=8 root=/dev/vda" \
|
-append "liminix default console=ttyS0,38400n8 panic=10 oops=panic init=$INIT loglevel=8 root=/dev/mtdblock0 block2mtd.block2mtd=/dev/vda,4096" \
|
||||||
-drive file=$2,format=raw,readonly=on,if=virtio \
|
-drive file=$2,format=raw,readonly=on,if=virtio \
|
||||||
-netdev socket,id=access,mcast=230.0.0.1:1234,localaddr=127.0.0.1 \
|
-netdev socket,id=access,mcast=230.0.0.1:1234,localaddr=127.0.0.1 \
|
||||||
-device virtio-net-pci,disable-legacy=on,disable-modern=off,netdev=access,mac=ba:ad:1d:ea:21:02 \
|
-device virtio-net-pci,disable-legacy=on,disable-modern=off,netdev=access,mac=ba:ad:1d:ea:21:02 \
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
From 21c84f244520f3656ffff3cc9b213d70480dc36d Mon Sep 17 00:00:00 2001
|
From 65cefb4cffadbd3b7adb9ff4a80db2914b0da4fd Mon Sep 17 00:00:00 2001
|
||||||
From: Daniel Barlow <dan@telent.net>
|
From: Daniel Barlow <dan@telent.net>
|
||||||
Date: Fri, 31 Mar 2023 23:33:04 +0100
|
Date: Fri, 31 Mar 2023 23:33:04 +0100
|
||||||
Subject: [PATCH] mkfs.jffs2: add --graft option
|
Subject: [PATCH] mkfs.jffs2: add --graft option
|
||||||
|
@ -12,14 +12,14 @@ mkfs.jffs2 -r ./rootfs --graft $HOME/Pictures:/pictures
|
||||||
to add your photo collection into the filesystem at /pictures
|
to add your photo collection into the filesystem at /pictures
|
||||||
without first copying it to rootfs
|
without first copying it to rootfs
|
||||||
---
|
---
|
||||||
jffsX-utils/mkfs.jffs2.c | 63 ++++++++++++++++++++++++++++++++++++++--
|
jffsX-utils/mkfs.jffs2.c | 76 +++++++++++++++++++++++++++++++++++++++-
|
||||||
1 file changed, 61 insertions(+), 2 deletions(-)
|
1 file changed, 75 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/jffsX-utils/mkfs.jffs2.c b/jffsX-utils/mkfs.jffs2.c
|
diff --git a/jffsX-utils/mkfs.jffs2.c b/jffsX-utils/mkfs.jffs2.c
|
||||||
index bd67634..ebf2d98 100644
|
index bd67634..a33f4b4 100644
|
||||||
--- a/jffsX-utils/mkfs.jffs2.c
|
--- a/jffsX-utils/mkfs.jffs2.c
|
||||||
+++ b/jffsX-utils/mkfs.jffs2.c
|
+++ b/jffsX-utils/mkfs.jffs2.c
|
||||||
@@ -112,6 +112,13 @@ static int squash_perms = 0;
|
@@ -112,6 +112,14 @@ static int squash_perms = 0;
|
||||||
static int fake_times = 0;
|
static int fake_times = 0;
|
||||||
int target_endian = __BYTE_ORDER;
|
int target_endian = __BYTE_ORDER;
|
||||||
|
|
||||||
|
@ -27,13 +27,14 @@ index bd67634..ebf2d98 100644
|
||||||
+ struct graft *next;
|
+ struct graft *next;
|
||||||
+ const char * source;
|
+ const char * source;
|
||||||
+ const char * dest;
|
+ const char * dest;
|
||||||
|
+ struct stat st;
|
||||||
+} * grafts = 0;
|
+} * grafts = 0;
|
||||||
+
|
+
|
||||||
+
|
+
|
||||||
static uint32_t find_hardlink(struct filesystem_entry *e)
|
static uint32_t find_hardlink(struct filesystem_entry *e)
|
||||||
{
|
{
|
||||||
struct filesystem_entry *f;
|
struct filesystem_entry *f;
|
||||||
@@ -597,6 +604,16 @@ static void cleanup(struct filesystem_entry *dir)
|
@@ -597,6 +605,16 @@ static void cleanup(struct filesystem_entry *dir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +51,7 @@ index bd67634..ebf2d98 100644
|
||||||
/* Here is where we do the actual creation of the file system */
|
/* Here is where we do the actual creation of the file system */
|
||||||
#include "mtd/jffs2-user.h"
|
#include "mtd/jffs2-user.h"
|
||||||
|
|
||||||
@@ -1359,6 +1376,7 @@ static void create_target_filesystem(struct filesystem_entry *root)
|
@@ -1359,6 +1377,7 @@ static void create_target_filesystem(struct filesystem_entry *root)
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
{"pad", 2, NULL, 'p'},
|
{"pad", 2, NULL, 'p'},
|
||||||
{"root", 1, NULL, 'r'},
|
{"root", 1, NULL, 'r'},
|
||||||
|
@ -58,7 +59,7 @@ index bd67634..ebf2d98 100644
|
||||||
{"pagesize", 1, NULL, 's'},
|
{"pagesize", 1, NULL, 's'},
|
||||||
{"eraseblock", 1, NULL, 'e'},
|
{"eraseblock", 1, NULL, 'e'},
|
||||||
{"output", 1, NULL, 'o'},
|
{"output", 1, NULL, 'o'},
|
||||||
@@ -1396,6 +1414,9 @@ static const char helptext[] =
|
@@ -1396,6 +1415,9 @@ static const char helptext[] =
|
||||||
" not specified, the output is padded to the end of\n"
|
" not specified, the output is padded to the end of\n"
|
||||||
" the final erase block\n"
|
" the final erase block\n"
|
||||||
" -r, -d, --root=DIR Build file system from directory DIR (default: cwd)\n"
|
" -r, -d, --root=DIR Build file system from directory DIR (default: cwd)\n"
|
||||||
|
@ -68,7 +69,7 @@ index bd67634..ebf2d98 100644
|
||||||
" -s, --pagesize=SIZE Use page size (max data node size) SIZE.\n"
|
" -s, --pagesize=SIZE Use page size (max data node size) SIZE.\n"
|
||||||
" Set according to target system's memory management\n"
|
" Set according to target system's memory management\n"
|
||||||
" page size (default: 4KiB)\n"
|
" page size (default: 4KiB)\n"
|
||||||
@@ -1430,6 +1451,24 @@ static const char helptext[] =
|
@@ -1430,6 +1452,25 @@ static const char helptext[] =
|
||||||
" -V, --version Display version information\n"
|
" -V, --version Display version information\n"
|
||||||
" -i, --incremental=FILE Parse FILE and generate appendage output for it\n\n";
|
" -i, --incremental=FILE Parse FILE and generate appendage output for it\n\n";
|
||||||
|
|
||||||
|
@ -86,6 +87,7 @@ index bd67634..ebf2d98 100644
|
||||||
+ ;
|
+ ;
|
||||||
+ graft->source = source;
|
+ graft->source = source;
|
||||||
+ graft->dest = dest;
|
+ graft->dest = dest;
|
||||||
|
+ memcpy((void *) &(graft->st), (void *) &st, sizeof st);
|
||||||
+ graft->next = calloc(sizeof (struct graft), 1);
|
+ graft->next = calloc(sizeof (struct graft), 1);
|
||||||
+ return 0;
|
+ return 0;
|
||||||
+}
|
+}
|
||||||
|
@ -93,7 +95,7 @@ index bd67634..ebf2d98 100644
|
||||||
static int load_next_block(void) {
|
static int load_next_block(void) {
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
@@ -1579,7 +1618,7 @@ int main(int argc, char **argv)
|
@@ -1579,7 +1620,7 @@ int main(int argc, char **argv)
|
||||||
jffs2_compressors_init();
|
jffs2_compressors_init();
|
||||||
|
|
||||||
while ((opt = getopt_long(argc, argv,
|
while ((opt = getopt_long(argc, argv,
|
||||||
|
@ -102,7 +104,7 @@ index bd67634..ebf2d98 100644
|
||||||
{
|
{
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'D':
|
case 'D':
|
||||||
@@ -1598,6 +1637,18 @@ int main(int argc, char **argv)
|
@@ -1598,6 +1639,18 @@ int main(int argc, char **argv)
|
||||||
rootdir = xstrdup(optarg);
|
rootdir = xstrdup(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -121,18 +123,30 @@ index bd67634..ebf2d98 100644
|
||||||
case 's':
|
case 's':
|
||||||
page_size = strtol(optarg, NULL, 0);
|
page_size = strtol(optarg, NULL, 0);
|
||||||
warn_page_size = 0; /* set by user, so don't need to warn */
|
warn_page_size = 0; /* set by user, so don't need to warn */
|
||||||
@@ -1784,13 +1835,21 @@ int main(int argc, char **argv)
|
@@ -1784,13 +1837,34 @@ int main(int argc, char **argv)
|
||||||
parse_image();
|
parse_image();
|
||||||
|
|
||||||
root = recursive_add_host_directory(NULL, "/", cwd);
|
root = recursive_add_host_directory(NULL, "/", cwd);
|
||||||
-
|
|
||||||
+ for(struct graft *g = grafts; g && g->source; g=g->next) {
|
+ for(struct graft *g = grafts; g && g->source; g=g->next) {
|
||||||
|
+ char *tmp = xstrdup(g->dest);
|
||||||
+ struct filesystem_entry * entry =
|
+ struct filesystem_entry * entry =
|
||||||
+ find_filesystem_entry(root, (char *) g->dest, S_IFDIR);
|
+ find_filesystem_entry(root, dirname(tmp), S_IFDIR);
|
||||||
|
+ free(tmp);
|
||||||
+ if(!entry)
|
+ if(!entry)
|
||||||
+ errmsg_die("missing directory %s for graft point %s",
|
+ errmsg_die("missing directory %s for graft point %s",
|
||||||
+ g->dest, g->source);
|
+ g->dest, g->source);
|
||||||
+ recursive_add_host_directory(entry, g->dest, g->source);
|
|
||||||
|
+ if (S_ISDIR(g->st.st_mode)) {
|
||||||
|
+ recursive_add_host_directory(entry, g->dest, g->source);
|
||||||
|
+ } else {
|
||||||
|
+ add_host_filesystem_entry(g->dest,
|
||||||
|
+ g->source,
|
||||||
|
+ g->st.st_uid,
|
||||||
|
+ g->st.st_gid,
|
||||||
|
+ g->st.st_mode,
|
||||||
|
+ g->st.st_rdev,
|
||||||
|
+ entry);
|
||||||
|
+ }
|
||||||
+ }
|
+ }
|
||||||
if (devtable)
|
if (devtable)
|
||||||
parse_device_table(root, devtable);
|
parse_device_table(root, devtable);
|
||||||
|
|
Loading…
Reference in a new issue