Blacklisted Files

I suddenly have blacklisted files that I need to compile my gstreamer code with nvarguscamerasrc. Here are the blacklisted file:

jetson@ubuntu:~$ gst-inspect-1.0 -b

(gst-plugin-scanner:28167): GStreamer-WARNING **: 01:04:47.346: Failed to load plugin '/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvarguscamerasrc.so': libnvjpeg.so: cannot open shared object file: No such file or directory

(gst-plugin-scanner:28167): GStreamer-WARNING **: 01:04:47.639: Failed to load plugin '/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvjpeg.so': libnvjpeg.so: cannot open shared object file: No such file or directory
Blacklisted files:
  libgstnvjpeg.so
  libgstnvarguscamerasrc.so

Total count: 2 blacklisted files

The file “libnvjpeg.so” is seemingly existing within the system when I look it up in the file explorer. That file is within the Aarch-linux-gnu file but I normally use CMake to compile my code becuase GNU doesnt detect one of the available OpenCV files while CMake does and it has usually worked with CMake for a while until just a few days ago. What’s going on?

Be quick, I have a deadline upcoming.

Thanks.

Hi,
We don’t see the issue on default Jetpack release. Please check to ensure libnvjpeg.so is in your system, and remove gstreamer cache.

I did rm ~/.cache/gstreamer-1.0/registry*.bin. The errors from compiling my code would normally report:

WARN:0]global/home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (711) open OpenCV | GStreamer warning: Error opening bin: no element "nvarguscamerasrc"

But now it reports:

(gst-plugin-scanner:31186): GStreamer-WARNING **: 02:13:55.105: Failed to load plugin '/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvarguscamerasrc.so': libnvjpeg.so: cannot open shared object file: No such file or directory

(gst-plugin-scanner:31186): GStreamer-WARNING **: 02:13:55.770: Failed to load plugin '/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvjpeg.so': libnvjpeg.so: cannot open shared object file: No such file or directory
[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (711) open OpenCV | GStreamer warning: Error opening bin: no element "nvarguscamerasrc

Also excuse me for this but I am very, very new with using linux systems but I am getting there with that and working with Gstreamer/OpenCV, is there another way to actually clear cache? Or is there another solution that we have to resort to?

Also there is this info to take into account, I had no other means of capturing this other than taking a photo of the screen, excuse me.

Here is what I got from typing in that command given during shutdown:

nvargus-daemon.service - Argus daemon
   Loaded: loaded (/etc/systemd/system/nvargus-daemon.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2025-02-10 02:31:55 EST; 10min ago
  Process: 3956 ExecStart=/usr/sbin/nvargus-daemon (code=exited, status=127)
 Main PID: 3956 (code=exited, status=127)

Feb 10 02:31:55 ubuntu nvargus-daemon[3956]: /usr/sbin/nvargus-daemon: error while loading shared libraries: libnvjpeg.so: cannot open shared 
Feb 10 02:31:55 ubuntu systemd[1]: nvargus-daemon.service: Main process exited, code=exited, status=127/n/a
Feb 10 02:31:55 ubuntu systemd[1]: nvargus-daemon.service: Failed with result 'exit-code'.
Feb 10 02:31:55 ubuntu systemd[1]: nvargus-daemon.service: Service hold-off time over, scheduling restart.
Feb 10 02:31:55 ubuntu systemd[1]: nvargus-daemon.service: Scheduled restart job, restart counter is at 5.
Feb 10 02:31:55 ubuntu systemd[1]: Stopped Argus daemon.
Feb 10 02:31:55 ubuntu systemd[1]: nvargus-daemon.service: Start request repeated too quickly.
Feb 10 02:31:55 ubuntu systemd[1]: nvargus-daemon.service: Failed with result 'exit-code'.
Feb 10 02:31:55 ubuntu systemd[1]: Failed to start Argus daemon.

Hi,
Please try
Nvjpeg Cmake and OpenCV frames - #5 by Honey_Patouceul

If the issue persists, would suggest compare the custom environment with Jetson Nano developer kit(either Jetpack 4.6.x). To investigate why libnvjpeg.so cannot be linked in the custom environment.

For your link, how would this apply when I am linking a Cmakefile install to the Nvidia jpeg lib? I still need to use OpenCV for tracking specific objects. I mat try your suggested method but only for debugging purposes.

What specific methods do we have to do to set up a “custom environment” and with what comparison methods?

Hi,
The custom environment means your current environment. We are uncertain what the status is. Please try to replicate the environment on Jetson Nano developer kit, and share us the steps. So that we can set up developer kit and check.

If you are implying that we get another Jetson Nano and compare. I only have 1 Jetson and do not have the time to buy another Jetson considering the deadline that I am currently in. Are you meaning something else? Sorry about it.

I am curious, what do you see from:
ldconfig -p | grep -i 'nvjpeg'

Those are the default linker path libraries. You may find the library needed is somewhere under here:
/usr/local/cuda
(some CUDA release subdirectory lib/ location)

If you do this, then it might see libnvjpeg.so files not seen by the linker due to the linker default path not including that location:

cd /usr/local
sudo find . -iname 'libnvjpeg.so* 2>/dev/null

Do you have libnvjpeg.so instances somewhere in “/usr/local/” subdirectories which are not named in the ldconfig -p list of default linker path libraries? If this is the problem, then you could add a location to the default linker search path (I caution you though to only name valid locations as this could cause boot issues if you name a non-existent location).

An example of adding a new location to a default is:

sudo -s
cd /etc/ld.so.conf.d

# File name is just whatever is clear, and actual location
# is contrived to be similar to what might actually be used:
echo '/usr/local/cuda-11/targets/arm64/lib` custom-cuda11.conf

# Reboot or refresh the linker path:
ldconfig

exit

My assumption is that you have a valid library somewhere, but it just isn’t in the search path.

Here is what I got from searching those file paths with -iname:

||libnvjpeg.so.12 (libc6,AArch64) => /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so.12|
|---|---|
||libnvjpeg.so (libc6,AArch64) => /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so|
||libnvjpeg.so (libc6,AArch64) => /usr/lib/aarch64-linux-gnu/tegra/libnvjpeg.so|

These 3 files are present when looking up defaults with ldconfig -p command:

	libnvjpeg.so.12 (libc6,AArch64) => /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so.12
	libnvjpeg.so (libc6,AArch64) => /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so
	libnvjpeg.so (libc6,AArch64) => /usr/lib/aarch64-linux-gnu/tegra/libnvjpeg.so

So is the problem I am having is the fact that I have duplicate files?

These are not necessarily duplicates, and probably are not duplicates. Libraries are present for those versions, but versions are not truly determined in libraries via file name; file name should match version, but that’s for human and practical purposes. Consider also that some of those might be symbolic links.

First, use “ls -l <filename>” on those. It is likely that libnvjpeg.so points to libnvjpeg.so.12. There might be something libnvjpeg.so.12 points to in some cases. This makes it possible to search for a “default” version, or a “most recent within the major release 12” (for this case). There might be different patch levels, and I’m making this up for actual versions, but imagine there is a libnvjpeg.so.12.1 and a libnvjpeg.so.12.2. This would mean you could have two minor releases simultaneously. Why would you do that? Well, perhaps a bug fix broke something, but only for some applications. You could install both versions. The granularity might include:

  • “default” version, no numbering, pointing to a major release number, e.g., name.so -> name.so.12.
  • “major” version can point to a minor version, e.g., name.so.12 -> name.so.12.1.
  • “minor” version can point to patch level, e.g., name.so.12.1 -> name.so.12.1.5.
  • Versioning can go to many levels, e.g., in a developer’s testing, maybe there is name.so.12.1.5.4.5.6.

The above uses file names, which you might consider some “Jedi trickery” to use files and packages to manage what is there. Internally, libraries also have versions. Check this command (using one of your example files):

cd /usr/local/cuda/targets/aarch64-linux/lib/
objdump -p libnvjpeg.so | grep 'SONAME'

The SONAME is how the linker itself determines versions. Filenames are pretty much ignored internally. Note that if you have some finely grained release version, e.g., something like libsomething.so.1.2.3, that the application itself will care only about the major release in the SONAME. If the application just wants the most recent of a given major release, then this simplifies life for the application needing a library.

Your library files are not duplicates unless they are all the same patch version down to the tiniest level, and all have the same SONAME. It is true that it is unusual to have multiple patch releases among libraries which have the same major version since most of the time only the most recent patch is used, but it isn’t necessarily an error to have multiple versions if something requires those different patch releases.


Getting back to the original question or problem, any program which needs a library really needs one which the linker presents which has the correct SONAME. Those libraries with libnvjpeg presented via the ldconfig -p command are those which are found automatically. If there is no compatible SONAME, then you need to add the library with the correct SONAME. Normally this means the actual file with the version in it, but also pointed at via a symbolic link with a more generic name.

Let’s pretend though that you have this (which you do actually have, this is from your ldconfig -p):

||libnvjpeg.so.12 (libc6,AArch64) => /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so.12|
|---|---|
||libnvjpeg.so (libc6,AArch64) => /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so|
||libnvjpeg.so (libc6,AArch64) => /usr/lib/aarch64-linux-gnu/tegra/libnvjpeg.so|

You have a version in “/usr/local/cuda/targets/aarch64-linux/lib/”, and another version in “/usr/lib/”. Do they both have the same SONAME? If they differ, then you can use both versions. It would be up to the application. When compiling, if a different version is needed, then you might have to adjust your build spec to use the other one.

A question then becomes “how was the library installed?”. Files in “/usr/local” tend to be installed with a package. You won’t find a package for any symbolic link, so make sure when you do the following you name actual files, but look at this particular file and find the package it belongs to:

# Must name the full path to the hard linked file:
dpkg -S /usr/lib/aarch64-linux-gnu/tegra/libnvjpeg.so

You will find the /usr/local/ versions don’t have a package owning them (most of the time). Which version does your program want? You might be able to do either of:

  • Install the version required.
  • Change the link spec if the wrong one is found first, but the right one is present.

If you are interested in more details, check this out:

The terminal couldn’t detect those files with those commands with the exception of the libnvjpeg.so file within the usr/lib file-paths.

root@ubuntu:~# ls -l libnvjpeg.so.12
ls: cannot access 'libnvjpeg.so.12': No such file or directory
root@ubuntu:~# ls -l libnvjpeg.so
ls: cannot access 'libnvjpeg.so': No such file or directory

Strangely, it does detect the file path of one of the libnvjpeg.so files while the file paths of the 2 others could not be detected:

root@ubuntu:~# dpkg -S /usr/lib/aarch64-linux-gnu/tegra/libnvjpeg.so
nvidia-l4t-multimedia: /usr/lib/aarch64-linux-gnu/tegra/libnvjpeg.so
root@ubuntu:~# dpkg -S /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so
dpkg-query: no path found matching pattern /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so
root@ubuntu:~# dpkg -S /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so.12
dpkg-query: no path found matching pattern /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so.12

Here is what I got finding those SONAMEs:

jetson@ubuntu:~$ cd /usr/local/cuda/targets/aarch64-linux/lib
bash: cd: /usr/local/cuda/targets/aarch64-linux/lib: No such file or directory
jetson@ubuntu:~$ cd /usr/lib/aarch64-linux-gnu/tegra/
jetson@ubuntu:/usr/lib/aarch64-linux-gnu/tegra$ objdump -p libnvjpeg.so | grep 'SONAME'
  SONAME               libnvjpeg.so
jetson@ubuntu:/usr/lib/aarch64-linux-gnu/tegra$ cd
jetson@ubuntu:~$ cd /usr/local
jetson@ubuntu:/usr/local$ cd /usr/local/cuda
bash: cd: /usr/local/cuda: No such file or directory
jetson@ubuntu:/usr/local$ 

The SONAME on the /usr/local nvjpeg file doesnt even show a major version and the 2 other files in /usr/local/cuda are not even accessible nor is any file or directory accessible using /user/local/cuda.

Also from one of your previous messages, did you want me to add a new location to a default? Is there something I am missing?

You do of course have to first cd to the directory containing the libraries before the “ls -l <filename>” command works (or, alternatively, use the full path). If there is ever a library default linker search path naming a location which does not exist, then this is a problem (possibly serious in some cases). If you have a library file which exists, but is not known to dpkg, this is ok (but less convenient), the file just isn’t managed as a package.

In particular, this is quite interesting (but only if some other command listed the location):
bash: cd: /usr/local/cuda/targets/aarch64-linux/lib: No such file or directory

The above might be explained though with how “default” versions of CUDA are set (you can install multiple versions of CUDA, at least on a desktop PC; the mechanism is the same on a Jetson, although there might not be anything other than one version). Take a look at this location:
cd /usr/local/

Now run this command:
ls -ld *cuda*

You will find that each version of CUDA installed will have a subdirectory “cuda-<version>”. If the subdirectory “cuda” (exact name, no version in it) exists, then this is simply marking which one is the default when no version is named. Sometimes “cuda” will point to something like “cuda-10” or “cuda-11”. Sometimes subdirectory “cuda” will point to somewhere in “/etc/alternatives/”. When the subdirectory with the exact name “cuda” does not exist, then it implies no default version is set. When the exact subdirectory “cudadoes exist, then it is always a symbolic link and points at some other version.

If it turns out that you do not have “/usr/local/cuda/” (which points at something else as a symbolic link), then it only means no default is set. Compiling something which links against this, or which searches for this, might fail simply because it doesn’t know which version to use.

Of those libraries you found via the command “ldconfig -p | grep 'nvjpeg'” (or any particular library file), which ones, as listed from “ldconfig -p”, cannot be found by cd to the location, and then ls of the file name? Of those files you have failing compile, does “ldconfig -p” show them? Do the failing/missing files in the compile name a specific version of cuda, e.g., “/usr/local/cuda-11/” instead of “/usr/local/cuda/”?

There is a possibility that everything is there, but not found due to how versions are searched for.

Just got back from break; here is the info from the 1st command:

jetson@ubuntu:/usr/local$ ls -ld *cuda*
drwxr-xr-x 3 root root 4096 Feb 10 00:52 cuda-10.2

For your first question, it would be the following filepaths and yes, they are found in ldconifg -p:

libnvjpeg.so.12 (libc6,AArch64) => /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so.12
	libnvjpeg.so (libc6,AArch64) => /usr/local/cuda/targets/aarch64-linux/lib/libnvjpeg.so

It mainly compiles in Cuda-10.2 from that first command you told me to execute. But I installed some other version of CUDA a while back (12.8) to save space (by deleting all related files) after I went back on trying to get NVENC decoders. Maybe I should reinstall CUDA 10.2?

If you want cuda-10.2 to be the default, then you could do this:

cd /usr/local
sudo ln -s cuda-10.2 cuda

# This just tells the linker to look for changes. This does nothing if
# the new symbolic link does not in some direct or indirect way
# make libraries available which were not previously available.
sudo ldconfig

However, I would not do this if the “alternatives” in “/etc” is not already providing this. I think in this case that you can go ahead and add that symbolic link; the reason this becomes advisable is your output of this:

jetson@ubuntu:~$ cd /usr/local/cuda/targets/aarch64-linux/lib
bash: cd: /usr/local/cuda/targets/aarch64-linux/lib: No such file or directory

However, this won’t change anything related to the “libnvjpeg.so” unless this library depends on a CUDA library in the “/usr/local” area. Many libraries actually load yet more libraries, and so it is possible libnvjpeg.so would work after this, but fail if one of its dependencies is missing.

One tool you have to look at library dependencies is “ldd” (if you don’t have this, then “sudo apt-get install libc-bin”). You could for example do this:

cd /usr/lib/aarch64-linux-gnu/tegra/
ldd libnvjpeg.so

The result would be to see every library libnvjpeg.so requires, and where it is found (if the library is found more than once, then normally the first one found is the one linked).

See if the symbolic link addition above helps. Check to see if libnvjpeg.so is missing any dependencies before you add the link, and again after the link. See if it changes. There is a possibility that something missing is now found.

A bit of good news: setting the CUDA 10.2 version as a default helps me work in creating directories within CUDA, but those files shown in the beginning of this thread are still blacklisted. Here is the output from ls -ld *cuda*:

 jetson@ubuntu:~$ cd /usr/local
jetson@ubuntu:/usr/local$ ls -ld *cuda*
lrwxrwxrwx 1 root root    9 Feb 18 14:53 cuda -> cuda-10.2
drwxr-xr-x 3 root root 4096 Feb 10 00:52 cuda-10.2

Here is the output when I use the ls -l command after creating directories:

jetson@ubuntu:/usr/local/cuda/targets/aarch64-linux/lib$ ls -l libnvjpeg.so
ls: cannot access 'libnvjpeg.so': No such file or directory
jetson@ubuntu:/usr/local/cuda/targets/aarch64-linux/lib$ ls -l libnvjpeg.so.12
ls: cannot access 'libnvjpeg.so.12': No such file or directory
jetson@ubuntu:/usr/local/cuda/targets/aarch64-linux/lib$ 

Here is what happens when I try to find those SONAMEs for those libnvjpeg files in usr/local/cuda, creating the directory would be successful but it still did not find the file.

jetson@ubuntu:/usr/local/cuda/targets/aarch64-linux/lib$ objdump -p libnvjpeg.so | grep 'SONAME'
objdump: 'libnvjpeg.so': No such file
jetson@ubuntu:/usr/local/cuda/targets/aarch64-linux/lib$ objdump -p libnvjpeg.so.12 | grep 'SONAME'
objdump: 'libnvjpeg.so.12': No such file

For finding library dependencies for each file, I have already done sudo ldconfig , so changes would be marked already.

jetson@ubuntu:/usr/lib/aarch64-linux-gnu/tegra$ ldd libnvjpeg.so
	linux-vdso.so.1 (0x0000007fb5540000)
	libgtk3-nocsd.so.0 => /usr/lib/aarch64-linux-gnu/libgtk3-nocsd.so.0 (0x0000007fb5481000)
	libnvddk_2d_v2.so => /usr/lib/aarch64-linux-gnu/tegra/libnvddk_2d_v2.so (0x0000007fb545c000)
	libnvrm.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm.so (0x0000007fb5427000)
	libnvbuf_utils.so.1.0.0 => /usr/lib/aarch64-linux-gnu/tegra/libnvbuf_utils.so.1.0.0 (0x0000007fb540a000)
	libnvbufsurface.so.1.0.0 => /usr/lib/aarch64-linux-gnu/tegra/libnvbufsurface.so.1.0.0 (0x0000007fb538c000)
	libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000007fb5377000)
	libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007fb521e000)
	/lib/ld-linux-aarch64.so.1 (0x0000007fb5514000)
	libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000007fb51f2000)
	libnvrm_graphics.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm_graphics.so (0x0000007fb51d2000)
	libnvos.so => /usr/lib/aarch64-linux-gnu/tegra/libnvos.so (0x0000007fb51b3000)
	libnvddk_vic.so => /usr/lib/aarch64-linux-gnu/tegra/libnvddk_vic.so (0x0000007fb5195000)
	libEGL.so.1 => /usr/lib/aarch64-linux-gnu/libEGL.so.1 (0x0000007fb5174000)
	libnvbuf_fdmap.so.1.0.0 => /usr/lib/aarch64-linux-gnu/tegra/libnvbuf_fdmap.so.1.0.0 (0x0000007fb5161000)
	librt.so.1 => /lib/aarch64-linux-gnu/librt.so.1 (0x0000007fb514a000)
	libGLdispatch.so.0 => /usr/lib/aarch64-linux-gnu/libGLdispatch.so.0 (0x0000007fb501e000)
	libstdc++.so.6 => /usr/lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000007fb4e8a000)
	libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000007fb4dd1000)
	libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000007fb4dad000)

The libnvjpeg.so file in the usr/lib/aarch64-linux-gnu/tegra directory works alright. But not the same for the libnvjpeg filed in 'usr/local/cuda` directories.

jetson@ubuntu:/usr/local/cuda/targets/aarch64-linux/lib$ ldd libnvjpeg.so
ldd: ./libnvjpeg.so: No such file or directory
jetson@ubuntu:/usr/local/cuda/targets/aarch64-linux/lib$ ldd libnvjpeg.so.12
ldd: ./libnvjpeg.so.12: No such file or directory

Based on what I am seeing here and with finding the SONAMEs, the 2 libnvjpeg files could not be found with the given terminal commands. I feel like I may either set specific defaults for those files or reinstall CUDA 10.2 as a whole.

Is this truly a Jetson Nano, and not a Jetson Orin (or other) Nano? The plain “Nano” is different than a “Xavier” Nano or “Orin” Nano. I think I see the issue where you stated:

To answer, older Nano is not capable of using CUDA 12.x. Only 10.x would work, and in that case, only the versions installed via JetPack/SDK Manager. To elaborate, Jetsons have a GPU which is integrated directly to the memory controller (an iGPU), whereas most computers have a discrete GPU over the PCI bus (a dGPU). The software which works with the iGPU is quite different than the dGPU version. The software available in JetPack/SDK Manager is the version which works with a Jetson’s iGPU. Installing the dGPU software is expected to break things. You might need to reinstall.

Do note that you can run JetPack/SDK Manager of the same version you’ve installed with again, but not put the Jetson in recovery mode, and uncheck the “flash” part (it isn’t always obvious that you can uncheck flash). During a normal flash the Jetson will self-reboot once flash is done, and all of the optional software management then occurs over ssh to a normally booted Jetson. So just leave the Jetson fully booted and uncheck the flash, and see if you can add or remove components with JetPack. Do make sure (via any mechanism available) that all CUDA-12 content is gone (if this is an older Nano; if this is newer, e.g., Orin, then CUDA-12 is available via JetPack/SDK Manager). Then try again.

The rest is just information if the above doesn’t help.

About gst-inspect

You already know abut gst-inspect, but let’s add something to it. You can run it by itself to see what it sees, or you can run it on a specific library file to get information about it. Some libraries are used to directly plug in to GStreamer, and some are linked in the standard way through the linker. gst-inspect is specific to finding information about GStreamer plugins. So far as I know all GStreamer plugins are libraries, but not all libraries are GStreamer plugins.

For more detailed information about GStreamer failures (meaning to get a GStreamer app to show more information when it fails for some reason) you could first do this, and then either start your application (I’m going to pretend the app is named “app” and that you are in a GUI environment starting this on a text command line):

export GST_DEBUG=4
app

# Or:
export GST_DEBUG=4
gst-inspect -b

Remember that ldconfig -p shows libraries in the linker path, but gst-inspect shows details only about libraries which a GStreamer app uses as a plugin. They are both dynamically loadable libraries.

It’s an old Jetson Nano B01 model. And I think I actually might have misworded that, I meant to say that I installed CUDA 12.8 for nvdec gstreamer commands but uninstalled it by deleting all related files. I might have misunderstood the situation and broke the current CUDA 10.2 available version that I didn’t think was there. I think I should flash the jetpack at this point.

Yes, that is probably the easiest way to go. If there is anything you need to save you could clone the system before flashing. Or just rsync a home directory if that is your more valuable content.