-
Notifications
You must be signed in to change notification settings - Fork 242
bootchooser: add Raspberry Pi firmware initial support #1599
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
bootchooser: add Raspberry Pi firmware initial support #1599
Conversation
This comment was marked as resolved.
This comment was marked as resolved.
|
Very interesting! I just took a quick look:
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #1599 +/- ##
==========================================
- Coverage 84.47% 84.37% -0.11%
==========================================
Files 76 77 +1
Lines 22542 22941 +399
==========================================
+ Hits 19043 19357 +314
- Misses 3499 3584 +85
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
src/bootchooser.c
Outdated
| return FALSE; | ||
| } | ||
|
|
||
| if (g_rename(filename_tmp, filename) == -1) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it's fair to expect that by the time rauc status mark-good returns, the change is actually persistent on disk, so you need at least a call to fsync after this as we can't be sure the FAT is sync mounted. g_file_set_contents_full with G_FILE_SET_CONTENTS_DURABLE does fsync internally, but that's Glib >= 2.66, which is higher than RAUC's current minimum version (2.56).
I have been thinking about this a bit in relation to power-fail safety. The tryboot mechanism looks ok, it's apparently either either a warm-reboot-surviving memory-mapped register or persisted to EEPROM and cleared on next early boot (Generic DT abstractions for that is syscon-reboot-mode and nvmem-reboot-mode respectively).
The mark-good here is more difficult, FAT has no journal and even if it had, bootloaders tend to not implement journal playback anyway, so what happens here if the fsync is interrupted by a power cut?
-
Can the autoboot.txt file disappear? Apparently, yes.
-
Can the FAT filesystem itself become corrupt? I am not sure
Now what are the implications of a lost autoboot.txt? Could we deal with this gracefully? Should RAUC recreate this file to recover?
Anyhow, it may make sense to reduce the operations that we expect to be atomic to the bare minimum. Instead of rewriting autoboot.txt and moving it, we could expect an oldboot.txt with the other set of values and use Linux v6.0's support for renameat2(2) RENAME_EXCHANGE on FAT to exchange these files.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it's fair to expect that by the time rauc status mark-good returns, the change is actually persistent on disk, so you need at least a call to fsync after this as we can't be sure the FAT is sync mounted. g_file_set_contents_full with G_FILE_SET_CONTENTS_DURABLE does fsync internally, but that's Glib >= 2.66, which is higher than RAUC's current minimum version (2.56).
I have tried to address this in 035eb31.
Anyhow, it may make sense to reduce the operations that we expect to be atomic to the bare minimum. Instead of rewriting autoboot.txt and moving it, we could expect an oldboot.txt with the other set of values and use Linux v6.0's support for renameat2(2) RENAME_EXCHANGE on FAT to exchange these files.
Hum, I understand the idea. That file could be generated using autoboot.txt if it does not exist.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now what are the implications of a lost autoboot.txt? Could we deal with this gracefully? Should RAUC recreate this file to recover?
With my observations... the firmware iterates over the FAT filesystems, looking for the file autoboot.txt or config.txt.
- If the file
autoboot.txtis found, it mounts the nth filesystem given byboot_partitionto read the fileconfig.txt(ortryboot.txt) and continue booting. - If the file
config.txtis found, it reads it and continue booting.
My 2 cents... if the file autoboot.txt vanishes on 1st fat filesystem, the firmware mounts the 2nd fat filesystem and reads the config.txt (if it has not vanished as well, or it mounts the 3rd fat filesystem and reads the config.txt... or it continues the romcode boot sequence, maybe it ends in netboot).
So in short, it should boot the system A.
In order to make the system more resilient to autoboot.txt disappearance, a services should regenerate it from the system.conf. I leave this duty to the system, something on top of RAUC, but not an inner thing from the raspberrypi backend.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@a3f Do we really benefit from using RENAME_EXCHANGE here? We don't need the old file anymore, so a normale rename should be enough.
jluebbe
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Couldn't you generate the autoboot.txt file from scratch when writing, as RAUC should have all the required information in memory already?
It's still unclear to me how you generate the root= entry in the command line differently for A/B (see #1599 (comment)).
As far as I can see, you're not reading from /chosen/bootloader/partition in the context setup. How does RAUC detect the boot slot?
Do you handle multiple installations without rebooting correctly?
Well, yes, the backend is able to generate the file from its own since I have all the I take the current I have implemented the backend to just do the bare minimal to handle the raspberrypi
Oh, I jumped your comment. I am sorry. I do not deal the command line at all. It adds some complications to modify the Do you think it's worth it?
So, I guess I have probably missed something. How does RAUC sets up? I guess I have missed it by the mark-good systemd service at startup. Or at least, it is guessed from the kernel command-line. EDIT; Hum, I think I have understood the point. I will post something today.
It depends on the behavior we agree to be correct :) |
This comment was marked as outdated.
This comment was marked as outdated.
a8dc573 to
c437c62
Compare
|
Hello Gaël, thank you for your work on this! I was myself looking at supporting the same use-case. One particular issue I noticed that I think is not addressed in your PR is maintaining the parental relationship between the Indeed, unless I am mistaken and you have a way to instruct/script the RPi firmware at runtime (in which case disregard this), I think that most likely, that relationship is enforced by the kernel command line, that is specified in
My point is what happens when you deploy a This would lead to the system booting with an updated kernel from All of this to say that I think |
src/bootchooser.c
Outdated
|
|
||
| static RaucSlot *raspberrypi_find_config_slot_by_boot_partition(RaucConfig *config, gint boot_partition) | ||
| { | ||
| g_autofree gchar *name = g_strdup_printf("%u", boot_partition); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This makes it mandatory for the name of the slot to be the partition number.
I might have missed it, but I don't think I saw that explicitly documented in docs/integration.rst, and this requirement for other setups.
It might also be useful as a comment in the example configuration files.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See that comment.
The documentation says:
If the slot is bootable, then you also need
- the bootname which is the name the bootloader uses to refer to this slot device.
That could be interpreted the bootname is how the names/references it.
In a sense, for the raspberrypi firmware, it is the boot_partition index. For barebox, it is the bootchooser/bootstate. For other backend, it is free.
It might also be useful as a comment in the example configuration files.
This should be that point.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It uses the slot's bootname, which is how RAUC knows how the slot is "called" by the bootloader (or firmware in this case).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My apologies, it looks like I should just read more thoroughly.
|
Hello @oli-ben
My pleasure. I am learning more about the RAUC internal in doing this.
I have mentioned this in the integration documentation, maybe it is not clear enough: And it is part of the example. So I strongly guess I have to insist on that part. Or...
Indeed you assumed it correctly :)
... okay, I get the point: I dedicate this to a slot hook. My first intention is to address the rootfs only in a first instance. The update of the
I am not yet convinced to hard-code this to the backend, mostly for this reasons:
I have not yet explore all these possibilities 😭 I cannot tell what is the best solution, and I have preferred to limit the backend to the bare minimum and use the bundle hooks as an exit for now. I am not saying you are wrong, all of you raise good points, and maybe this should be part of the backend after all... |
I think that using a (post-install) hook is fine. Compared to the alternatives, it's very simple and easy to implement. More complex cases (e.g. secure boot) wouldn't allow customizing the cmdline from unsigned config files, so you'd need a signed kernel+initramfs. In that case, I'd probably look at reading |
Do you think it worth to create that function r_boot_get_bootname() and calls it at setup? So I can get the root device from the device-tree on the raspberrypi backend. @jluebbe It is somehow what you expected? |
|
Hello again, thanks for you super quick response
Very fair. I hope my feedback did not come across as criticism.
Also fair = )
Jan appears to be with you on this one.
Well, if you're using
I wouldn't see a problem with this: this is all assuming that we are doing a A/B setup, which is what this option was intended for.
I also would not particularly see a problem with this: imho it's fair for RAUC to impose some configuration, especially when it seems to be the "usual" way of using the RPi firmware
I'm also not saying you are wrong, just raising a point I thought was potentially interesting. |
That is true, as it seems that secure boot on RPi necessiates a signed ramdisk containing at least the kernel and config.txt
I think that'd be great, and this is what I did when using UBoot, but when using the RPi firmware directly to load the kernel, the only options we'd have to do this are:
This seems like a large amount of effort, and while this might solve the secure boot usecase, might be a tad too complicated for the normal one.
Although it is true that |
No worries. I liked your feedback and I had to take the time for reflection. I did that months ago, and I do not recall all the pieces that led me to that implementation.
I really do understand you opinion; I am still perplex about having an all-in-one backend solution or having some hooks :/ If I am right, the issue lies in the fact that :
I wonder if the the newly introduced artifact feature may help (with some changes, thinking about porting the new Also, I do not think the other backends deal with the kernel command line, mostly because they do not need to, the bootloader and kernel files are somehow decorelated, or tools exists to update the pieces separately, am I still correct? OOS: I guess I will throw an eye to the artifacts once I have free time. I have plan to test it to update the
Indeed it is fair to impose few things in RAUC. I am trying to find a flexible solution first.
It's great to share our own solutions. And it is not I am not interested, in my head, the wind blows in the direction of not rewriting the kernel cmdline in the backend. And I do not mind if you do it course ;) |
Good to hear! = D
Fair. My main argument is, that I think a user having a RAUC configuration specifying:
is more likely to expect RAUC to maintain the parent/child relationship between the boot and root FS automatically than actively wanting RAUC to leave the cmdline.txt completely unchanged, down to the That second usecase should probably be supported, but I think we might not want it to be the default.
From what I can tell, that is correct. And definitely regrettable. ><
I haven't used that feature, but it might be the right way to handle this. Especially if the overall decision is, that having the backend rewrite cmdline.txt is not ok.
Yes. The core issue here, in my opinion, is that the RPi bootloader can only load the kernel from the same partition as cmdline.txt. UBoot could work around this, because it has scripting capabilities, and could therefore dynamically determine the partition it was started from by parsing the DTB, and adjust the command line accordingly.
sounds like it to me
Yes, it sound like we mostly have a different image of what the "default"/"normal"/"common" (or whatever we want to call it) usecase looks like.
Yes, I agree that it should definitely be optional. I think I'd just default to it being |
|
@gportay and I talked about this at FOSDEM. Some points from our discussion:
|
Yeah, I came to that conclusion myself, and opened a case to help support non-initramfs A/B tryboot integrations over at raspberrypi/firmware#1940. I don't expect them to care about the use-case of A/B updates without an initramfs, though. |
@bradfa, thanks, this is origin of the problem. There is an issue about detecting the current primary slot. Let me investigate this. If I understand correctly, this happens if you install a bundle from the primary slot, reboot to other slot and install a bundle again from the other slot without rebooting (i.e. still tryboot), am I right? What happen if you install a second bundle, do you have: or or something else? |
src/bootloaders/raspberrypi.c
Outdated
| return FALSE; | ||
| } | ||
|
|
||
| if ((slot != primary && good) || (slot == primary && !good)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bradfa, the issue comes from that line.
- if ((slot != primary && good) || (slot == primary && !good)) {
+ if (slot != primary && good) {This change should fix your issue.
I need more investigation about why I added the bugged condition || (slot == primary && !good).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This one section change seems to improve things, as now I don't end up with both boot_partition= having the same value. But a rauc install, reboot, rauc install, reboot sequence now doesn't seem to be setting tryboot on the 2nd reboot.
Thanks, I was not aware about that PARTITION_WALK=1, and I figured out that the bootloader is actually walking through the vFAT partition to search for either
With your solution, do you suggest to switch the The tryboot is a "volatile" flag, that is cleared after a poweroff, as said in the documentation, it is likely a boot counter of 1. I think I missed something. How would you recover if your installation is booting but the system is in bad state? For example the kernel panics. The bootloader would reboot on the same system? And thus it would reboot in loop, am I right?
May I ask more details?
This feature is interesting indeed, and it could be used to implement a recovery in the situation of the terrible happen ( I would prefer to run a recovery as it is impossible to know which was the last correct system (i.e. A or B). Actually, the bootloader already walks through the vFAT filesystem and I think the recovery should be the second partition (an initramfs that would rewrite the A partitions). But I do not think it needs to set the |
Yes, I think so, but this is just my opinion. If the direction is to use tryboot then I would like if On other RAUC targets, if you do a |
OK, I can understand that concept. My desire is just for 2 slots, an A and a B, without any recovery. This setup with RAUC has worked well for me in other non-Raspi projects.
Yes.
This is a good point which I had not fully considered. Yes, there would be no direct fallback with this method of operation as by default there is no watchdog or boot counter to catch this kind of problem. RAUC with u-boot having boot counters solves this problem, but I'm not sure something similar to that is possible with the Raspi firmware. There is mention in the docs about a watchdog mechanism and being able to specify fallbacks, although I have not tried to understand how to use it, yet: https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#PARTITION
I just mean in regards to my previous critique of
I will think about the concept of using a recovery option. That may end up being required given the limitations of the Raspi firmware. |
src/bootloaders/raspberrypi.c
Outdated
| if (!raspberrypi_bootloader_get_tryboot(&tryboot, &ierror)) { | ||
| g_propagate_prefixed_error( | ||
| error, | ||
| ierror, | ||
| "Failed to get bootloader tryboot property: "); | ||
| return NULL; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is obtaining information about if the current boot is a tryboot boot. I think what we really want to know here is if tryboot is set for the next boot based on the logic later in this function where tryboot==TRUE causes a look up to find the "other" slot.
On every boot, regardless of if tryboot is in effect, the rauc-mark-good.service should be causing autoboot.txt to be updated such that the currently booted slot goes in the [all] section's boot_partition=.
If tryboot is not set for the next boot, then autoboot.txt is correct and the sysfs partition value will match autoboot.txt's [all] section value, and this slot is the primary. But if tryboot is set for the next boot, then we need to go find the "other" slot info as that's what is configured to be booted next as the primary.
The state of the current boot's tryboot indicator doesn't seem to matter for this function. Only the value of the next boot's tryboot flag.
We should be able to read via vcmailbox if tryboot is set for the next boot by reading from address 0x00030064 as per https://github.com/raspberrypi/linux/blob/rpi-6.12.y/include/soc/bcm2835/raspberrypi-firmware.h#L98
src/bootloaders/raspberrypi.c
Outdated
| /* Set slot as primary boot slot, i.e. either persistently in the static file | ||
| * autoboot.txt if it is the boot'ed slot or temporarily via the tryboot reboot | ||
| * flag otherwise. */ | ||
| gboolean r_raspberrypi_set_primary(RaucSlot *slot, GError **error) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think that if my change mentioned https://github.com/rauc/rauc/pull/1599/files/fdc22a44866b59eaee8fe830655c16a557b63f79#r2245601881 is implemented, then this this function needs to be also modified.
This function would need to change to have logic like:
- If the desired slot is NOT the booted slot, then set tryboot for the next boot.
- If the desired slot IS the booted slot AND we are currently in a tryboot, then update autoboot.txt.
- If the desired slot IS the booted slot and we are NOT currently in a tryboot, then do nothing. This will be the typical path.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rauc status mark-good will only use choices 2 or 3 above because it should only be called to say that this booted slot is good and so autoboot.txt needs to reflect this in the [all] section's boot_partition= value. 2 happens during the reboot after a rauc install was performed. 3 happens on normal boots.
rauc install will only use choice 1 above, as it will always be installing to the non-booted slot, regardless of if we're currently in a tryboot or not.
This presumes that the rauc-mark-good.service is running during startup to mark the current booted slot as good.
You can still propose and develop a PoC not using tryboot, but I guess it will be tricky. I agree, my implementation remains incomplete since it needs a reboot after validating the new slot (i.e. one reboot after
I think it is not necessarily true to every bootloader backends. I have never used the EFI backend myself, but if you use the set |
After more thought, I think using tryboot is the right direction and I think using PARTITION_WALK is not necessarily a good idea.
That's true about EFI. And I'm very confident that different EFI implementations will treat the boot-next value as volatile in dramatically different ways. EFI is generally a mess :) |
|
I have a wip branch based off this PR which I believe fixes the issues that I've found. My changes almost certainly need some cleanup, but things do seem to work as I expect them to. My implementation of reading if tryboot is set for the next boot makes me cringe as it's just string comparisons on the But for now, it seems to work in my tests: https://github.com/bradfa/rauc/commits/wip-raspberrpi5/ |
This adds an initial backend support for the Raspberry Pi firmware. Signed-off-by: Gaël PORTAY <gael.portay@rtone.fr>
fdc22a4 to
f6b5f54
Compare
|
I have reworked the |
|
Some quick testing with with @gportay latest changes seems to be working well for me on Raspi 5 booting from NVMe! I have not tried my previous failure mode where PARTITION_WALK is enabled as I've decided it's not a good solution to any problem that I have, but the other issues which I had hit previously all do seem to be resolved. Thanks! :) |
|
Hello, I am actually trying this out. I came upon this here while searching for support in rauc for the Raspberry Pi 5. I have a Raspberry Pi Compute Module 5 with 32GB eMMC embedded into it. I tested and Both working the same way so far. /dev/mmcblk0p1: vfat with autoboot.txt (mounted at /autoboot) and /etc/rauc/system.conf: What me wonders now is that "rauc status mark-good other" does show no effect: I am on rootfs.1: and want to mark the other one as good: But it is not shown: Did I understand correctly that the only way for rauc to instruct the bootloader is via autoboot.txt in the first partition? Is this expected behaviour or did I do something wrong? |
|
@2K-ZONE I would recommend using the latest revision of this pull request and not using my fork. This pull request has been updated by gportay to include the functional changes in my fork, but their implementation is likely much more robust than mine was. I don't think it's reasonable to try to mark the non-running firmware/rootfs combo as good on Raspi 5. Raspi 5 will only automatically "fall back" to the other firmware/rootfs slot combo during a tryboot. This is a limitation of the Raspi bootloader operation. So it's really only good to mark the current running firmware/rootfs combo as good once it has actually booted within a tryboot boot, otherwise you risk getting into a situation where the Raspi firmware consistently picks a not-really-bootable choice. The way Raspi 5 RAUC works is after installing to the not-booted slots, then tryboot is set (tryboot is a transient flag which will cause the [tryboot] choice in autoboot.txt to be used) only for a single boot. If the boot succeeds, then RAUC mark good will mark the currently booted slot as good. If the boot fails, then the next reset will cause the Raspi 5 firmware to boot from teh [all] section of autoboot.txt, effectively the previously running slot. There are potential ways to change how this works, such as using the PARTITION_WALK mechanism or enabling the watchdog (on newer Raspi 5 firmware releases) early enough and setting up your config.txt files in such as way as to enable a fallback to occur. But each of these come with additional complexity and caveats. This is all a bit different from using RAUC with u-boot, where scripting can perform boot counting and automated fallbacks, and where with u-boot marking the other slot as good is totally reasonable to try. |
|
Thank you for the information. I admit I have not yet understand everything and I am still playing around with my setup. Regarding the version: I should use this: https://github.com/rauc/rauc/tree/f6b5f54bb717cf8d38a6c4ff82159e7b1e655d61 My "rauc --version" says "rauc f6b5f54" So this should be this especially commit version (still trying also to understand how to get the latest version of this commit). On my system this happens:
Shouldn't after this reboot the booted system have changed? Can I check if I booted via tryboot? Can I force it? What I also learned is I can change the system by giving reboot command a parameter (while being on system 2):
I was no aware of that, how does the "3" reach which part of the bootloader while rebooting, is this the supposed way to change the system? But this is not tryboot mechanism, right? |
|
@2K-ZONE in the rauc bundle that you installed, did it just have a rootfs? Or did it also have something to put into the "firmware" partition as well? During a tryboot, the firmware output on the serial port should emit a line like this indicating that it is in a tryboot boot: and then later in the boot sequence: The timestamps aren't going to be consistent, but the text indicating You can also verify if the current boot is a tryboot by reading You can force tryboot for the next reboot with a vcmailbox command, like: You can check if the next reboot will use a tryboot (this is a different setting than if the CURRENT boot is a tryboot) with another vcmailbox command: The 6th 32 bit value returned will indicate 0 or 1, if tryboot is set for the next reboot. |
|
Currently my bundle only has a rootfs. It should also contain files for the firmware partition (since kernel modules are in rootfs, kernel comes to firmware!) but since I did no changes to firmware contents I omitted that (also do not know how to do this, yet). Need to implement later... Thanks for the information about the expected serial output, I have have nothing hooked up to a serial since I do not know where I can access serial interface(s), this device has only an external RS-485 one, may be I need to disassemble and look inside to get access to one another... But the information about tryboot flag in devicetree and vcmailbox is quite useful, thank you! After reboot I read 0 (vcmailbox and tryboot flag in devicetree). According to mount and Also: If I do a Is forcing tryboot via |
If you're not installing anything new to the firmware partition, then I think RAUC won't automatically understand that you would want to boot into the other slot so it won't set tryboot for you automatically. It's not really an advisable configuration to try to end up with potentially mismatched kernel and kernel modules. I suggest that you don't wait till later to figure this part out.
You should not need to manually force tryboot after a rauc bundle install, rauc should automatically enable tryboot for you. |
|
Yes, that seems indeed to be the case. I went onto system 0. After that I manually adapt cmdline and fstab (that goes into post install hooks later...). After I rebooted I find myself on system 1! And Heureka, nice Job guys, thank you! |
Hi @2K-ZONE, |
If you don't have secure boot enabled, then you can easily modify the cmdline in a post-install step. But if you have secure boot enabled, then you will need to bake into your secure boot setup a way to automatically determine which rootfs is going to be the actual rootfs. This can be done within the config.txt file that's inside your secure boot signed boot.img file and by also having 2 different text files which each dictate a different kernel command line to use, based on which boot partition the Raspi 5 firmware is using. Something like this would go in your boot.img's config.txt: Then you have two other files |
|
Hi @bradfa, I´ll give it a try and report back how it works out for my setup. Also rpi-image-gen adds some support for OTA-stuff in the last commits, I think this can become a very streamlined overall approach. |
|
Well I used to put the information about the rootfs into the cmdline.txt file. And yes I was not aware of the config.txt/cmdline-2.txt+cmdline-3.txt mechanism, yet. Which may explain the questions I got. I am just trying this out. I also mount dev/mmcblk0p1 as autoboot in the rootfs' fstab (each time the same) and the boot partition for each rootfs Then both rootfs including firmware can be identical... |
Correct, you do not need to keep the boot partition that holds the kernel, config.txt, and cmdline files mounted within Linux. RAUC will mount the correct boot partition when it needs to update it. If you find that the existing documentation written within this pull request's changes is not answering these questions clearly, please suggest documentation changes so that we can help future users to avoid having the same kinds of questions. |
|
Hi @2K-ZONE , |
This adds an initial backend support for the Raspberry Pi firmware.