3 releases (breaking)

0.3.0 Jun 17, 2023
0.2.0 Feb 24, 2023
0.1.0 Feb 14, 2023

#928 in Filesystem

Download history 85/week @ 2024-02-01 26/week @ 2024-02-08 174/week @ 2024-02-15 61/week @ 2024-02-22 38/week @ 2024-02-29 57/week @ 2024-03-07 58/week @ 2024-03-14 40/week @ 2024-03-21 29/week @ 2024-03-28

189 downloads per month
Used in nydus-rs

Apache-2.0

1.5MB
37K SLoC

nydus-service

The nydus-service crate helps to reuse the core services of nydus, allowing you to integrate nydus services into your project elegantly and easily. It provides:

  • fuse service
  • virtio-fs service
  • fscache service
  • blobcache service

It also supplies the nydus daemon and the daemon controller to help manage these services.

Why you need

You're supposed to know that nydusd running as daemon to expose a FUSE mountpoint, a Virtio-FS mountpoint or an EROFS mountpoint inside guest for containers to access, and it provides key features include:

  • Container images are downloaded on demand
  • Chunk level data deduplication
  • Flatten image metadata and data to remove all intermediate layers
  • Only usable image data is saved when building a container image
  • Only usable image data is downloaded when running a container
  • End-to-end image data integrity
  • Compatible with the OCI artifacts spec and distribution spec
  • Integrated with existing CNCF project Dragonfly to support image distribution in large clusters
  • Different container image storage backends are supported

If you want to use these features as native in your project without preparing and invoking nydusd deliberately, nydus-service is just born for this.

How to use

For example, reuse the fuse service with nydus-service in three steps.

prepare the config:

{
  "device": {
    "backend": {
      "type": "registry",
      "config": {
        "scheme": "",
        "skip_verify": true,
        "timeout": 5,
        "connect_timeout": 5,
        "retry_limit": 4,
        "auth": "YOUR_LOGIN_AUTH="
      }
    },
    "cache": {
      "type": "blobcache",
      "config": {
        "work_dir": "cache"
      }
    }
  },
  "mode": "direct",
  "digest_validate": false,
  "iostats_files": false,
  "enable_xattr": true,
  "fs_prefetch": {
    "enable": true,
    "threads_count": 4
  }
}

create a daemon:

static ref DAEMON_CONTROLLER: DaemonController = DaemonController::default()

let cmd = FsBackendMountCmd {
    fs_type: FsBackendType::Rafs,
    // Bootstrap path
    source: bootstrap,
    // Backend config
    config,
    // Virutal mountpoint
    mountpoint: "/".to_string(),
    // Prefetch files
    prefetch_files: None,
};

let daemon = {
    create_fuse_daemon(
        // Mountpoint for the FUSE filesystem, target for `mount.fuse`
        mountpoint,
        // Vfs associated with the filesystem service object
        vfs,
        // Supervisor
        None,
      	// Service instance identifier
        id,
        // Number of working threads to serve fuse requests
        fuse_threads,
      	// daemon controller's waker
        waker,
      	// Path to the Nydus daemon administration API socket
        Some("api_sock"),
      	// Start Nydus daemon in upgrade mode
        upgrade,
      	// Mounts FUSE filesystem in rw mode
        !writable,
        // FUSE server failover policy
        failvoer-policy,
        // Request structure to mount a backend filesystem instance
        Some(cmd),
        BTI.to_owned(),
    )
    .map(|d| {
    		info!("Fuse daemon started!");
    		d
    })
    .map_err(|e| {
       	error!("Failed in starting daemon: {}", e);
       	e
    })?
};

DAEMON_CONTROLLER.set_daemon(daemon);

start daemon controller:

thread::spawn(move || {
 	 let daemon = DAEMON_CONTROLLER.get_daemon();
 	 if let Some(fs) = daemon.get_default_fs_service() {
 	   	DAEMON_CONTROLLER.set_fs_service(fs);
 	 }

 	 // Run the main event loop
 	 if DAEMON_CONTROLLER.is_active() {
 	   	DAEMON_CONTROLLER.run_loop();
	 }

 	 // Gracefully shutdown system.
 	 info!("nydusd quits");
 	 DAEMON_CONTROLLER.shutdown();
});

Then, you can make the most of nydus services in your project.

Support

Platforms:

  • x86_64
  • aarch64

Operating Systems:

  • Linux

License

This code is licensed under Apache-2.0 or BSD-3-Clause.

Dependencies

~16–35MB
~598K SLoC