From: Manuel R. <Man...@nu...> - 2014-02-24 18:53:06
|
Hello, I have a small embedded device which can be connected to a PC and is recognized as USB storage device, formatted with FAT16. This allows me to fetch files in a (proprietary) format. I have to convert the files to be able to work with. My idea now is to create some kind of "magic filesystem" that presents the converted files directly. I would still like to have the device "auto-mounted" via udisks and modern desktop file utilities. So my problem is, that I somehow need to "double-mount" the device. At first the FAT16 layer needs to be handled and at second the conversion part has to be done. Is it possible to use the existing kernel driver to handle the FAT16 part or is it the better way to implement simple (read only) FAT16 support directly in my FUSE driver? Thank you very much in advance. Greetings, Manuel Reimer |
From: Nikolaus R. <Nik...@ra...> - 2014-02-24 19:24:01
|
Manuel Reimer <Man...@pu...> writes: > Hello, > > I have a small embedded device which can be connected to a PC and is > recognized as USB storage device, formatted with FAT16. This allows me > to fetch files in a (proprietary) format. I have to convert the files to > be able to work with. > > My idea now is to create some kind of "magic filesystem" that presents > the converted files directly. I would still like to have the device > "auto-mounted" via udisks and modern desktop file utilities. > > So my problem is, that I somehow need to "double-mount" the device. At > first the FAT16 layer needs to be handled and at second the conversion > part has to be done. > > Is it possible to use the existing kernel driver to handle the FAT16 > part or is it the better way to implement simple (read only) FAT16 > support directly in my FUSE driver? You don't need to reimplement FAT16. You can implement the conversion as an overlay file system. See examples/fusexmp*.c. Best, -Nikolaus -- Encrypted emails preferred. PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6 02CF A9AD B7F8 AE4E 425C »Time flies like an arrow, fruit flies like a Banana.« |
From: Manuel R. <Man...@nu...> - 2014-02-25 16:38:59
|
On 02/24/2014 08:23 PM, Nikolaus Rath wrote: >> Is it possible to use the existing kernel driver to handle the FAT16 >> part or is it the better way to implement simple (read only) FAT16 >> support directly in my FUSE driver? > > You don't need to reimplement FAT16. You can implement the conversion as > an overlay file system. See examples/fusexmp*.c. I had a look at these examples and for me it seems like they just forward to the regular filesystem and are not meant to mount a block device directly. This would require me to mount twice. For example: mount -t vfat /dev/sdaX /tmp/temp_fat_mount mount -t myfuse_fs /tmp/temp_fat_mount /mnt/target_mount_point I don't think that it is possible to tell a modern automount system to do that for me and I don't want to mount manually. What I want to do (or what the system most probably will try to do) is: mount -t myfuse_fs /dev/sdaX /mnt/target_mount_point I think the "FAT16 stuff" has to be done somehow in the background to make this possible. The question is, if there is an easier way, compared to reimplementing FAT16 in my own FUSE filesystem. Yours Manuel |
From: Nikolaus R. <Nik...@ra...> - 2014-02-25 22:56:52
|
Manuel Reimer <Man...@pu...> writes: > On 02/24/2014 08:23 PM, Nikolaus Rath wrote: >>> Is it possible to use the existing kernel driver to handle the FAT16 >>> part or is it the better way to implement simple (read only) FAT16 >>> support directly in my FUSE driver? >> >> You don't need to reimplement FAT16. You can implement the conversion as >> an overlay file system. See examples/fusexmp*.c. > > I had a look at these examples and for me it seems like they just > forward to the regular filesystem and are not meant to mount a block > device directly. Yes. If you don't want that, then you need to write your own FAT16 code. The only way to use the kernel's fat16 implementation is to mount the file system. > This would require me to mount twice. For example: > > mount -t vfat /dev/sdaX /tmp/temp_fat_mount > mount -t myfuse_fs /tmp/temp_fat_mount /mnt/target_mount_point > > I don't think that it is possible to tell a modern automount system Unless you have some extra requirements that you haven't described yet, there is no problem at all setting up an automounter for the vfat part. Whether you can automount the fuse fs is unrelated to using an overlayfs or accessing the block device directly. > What I want to do (or what the system most probably will try to do) is: > > mount -t myfuse_fs /dev/sdaX /mnt/target_mount_point > > > I think the "FAT16 stuff" has to be done somehow in the background to > make this possible. The question is, if there is an easier way, compared > to reimplementing FAT16 in my own FUSE filesystem. Yes, mount the FAT16 system in /mnt/intermediate_mount_point and access that in your FUSE fs. You could set up an automounter for that, or you could just call the necessary mount command from your fuse daemon. Best, -Nikolaus -- Encrypted emails preferred. PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6 02CF A9AD B7F8 AE4E 425C »Time flies like an arrow, fruit flies like a Banana.« |
From: Goswin v. B. <gos...@we...> - 2014-03-25 09:49:24
|
On Tue, Feb 25, 2014 at 05:38:40PM +0100, Manuel Reimer wrote: > On 02/24/2014 08:23 PM, Nikolaus Rath wrote: > >> Is it possible to use the existing kernel driver to handle the FAT16 > >> part or is it the better way to implement simple (read only) FAT16 > >> support directly in my FUSE driver? > > > > You don't need to reimplement FAT16. You can implement the conversion as > > an overlay file system. See examples/fusexmp*.c. > > I had a look at these examples and for me it seems like they just > forward to the regular filesystem and are not meant to mount a block > device directly. > > This would require me to mount twice. For example: > > mount -t vfat /dev/sdaX /tmp/temp_fat_mount > mount -t myfuse_fs /tmp/temp_fat_mount /mnt/target_mount_point > > I don't think that it is possible to tell a modern automount system to > do that for me and I don't want to mount manually. > > What I want to do (or what the system most probably will try to do) is: > > mount -t myfuse_fs /dev/sdaX /mnt/target_mount_point > > I think the "FAT16 stuff" has to be done somehow in the background to > make this possible. The question is, if there is an easier way, compared > to reimplementing FAT16 in my own FUSE filesystem. > > Yours > > Manuel But you can statically mount /mnt/target_mount_point at all times and automount /tmp/temp_fat_mount. When the USB device is not present the /tmp/temp_fat_mount is just an empty dir and the fuse overlay will also be empty. But when you plug in the device it gets mounted and contents will appear in both directories. Alternatively you can write your overlay filesystem so that it first mounts the block device with FAT16 and then starts fuse. You can even just use a little shell script as mount.xxx helper for that. MfG Goswin |