3 个版本 (破坏性更新)

0.3.0 2023 年 6 月 17 日
0.2.0 2023 年 2 月 24 日
0.1.0 2023 年 2 月 14 日

#615 in 文件系统

Download history 81/week @ 2024-03-11 44/week @ 2024-03-18 34/week @ 2024-03-25 69/week @ 2024-04-01 24/week @ 2024-04-08 41/week @ 2024-04-15 50/week @ 2024-04-22 5/week @ 2024-05-06 3/week @ 2024-05-13 28/week @ 2024-05-20 20/week @ 2024-05-27 100/week @ 2024-06-03 93/week @ 2024-06-10 43/week @ 2024-06-17 15/week @ 2024-06-24

每月 251 次下载
用于 nydus-rs

Apache-2.0

1.5MB
37K SLoC

nydus-service

nydus-service 库帮助您复用 nydus 的核心服务,使您能够优雅且简单地集成 nydus 服务到您的项目中。它提供了

  • fuse 服务
  • virtio-fs 服务
  • fscache 服务
  • blobcache 服务

它还提供了 nydus 守护进程和守护进程控制器,以帮助管理这些服务。

为什么你需要

您应该知道 nydusd 作为守护进程运行,以暴露一个 FUSE 挂载点,一个 Virtio-FS 挂载点,或一个 EROFS 挂载点,以便容器在虚拟机内部访问,并提供了以下关键特性:

  • 容器镜像按需下载
  • 块级别数据去重
  • 平坦图像元数据和数据以移除所有中间层
  • 在构建容器镜像时仅保存可用的图像数据
  • 在运行容器时仅下载可用的图像数据
  • 端到端图像数据完整性
  • 兼容 OCI 艺术品规范和分发规范
  • 集成现有 CNCF 项目 Dragonfly,以支持在大集群中的图像分发
  • 支持不同的容器镜像存储后端

如果您想在项目中以原生方式使用这些功能,而不需要专门准备和调用 nydusd,那么 nydus-service 正是为此而生的。

如何使用

例如,使用 nydus-service 在三个步骤中重用 fuse 服务。

准备配置:

{
  "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
  }
}

创建守护进程:

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);

启动守护进程控制器:

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();
});

然后,您可以在您的项目中充分利用 nydus 服务。

支持

平台:

  • x86_64
  • aarch64

操作系统:

  • Linux

许可证

此代码根据 Apache-2.0BSD-3-Clause 许可。

依赖项

~16–36MB
~595K SLoC