You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

mount_linux.go 2.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. //go:build linux || (darwin && amd64)
  2. package mount
  3. import (
  4. fusefs "github.com/hanwen/go-fuse/v2/fs"
  5. "github.com/hanwen/go-fuse/v2/fuse"
  6. "gitlink.org.cn/cloudream/common/pkgs/async"
  7. db2 "gitlink.org.cn/cloudream/jcs-pub/client/internal/db"
  8. "gitlink.org.cn/cloudream/jcs-pub/client/internal/downloader"
  9. "gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/config"
  10. fuse2 "gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/fuse"
  11. "gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/vfs"
  12. "gitlink.org.cn/cloudream/jcs-pub/client/internal/uploader"
  13. clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
  14. )
  15. type Mount struct {
  16. cfg *config.Config
  17. vfs *vfs.Vfs
  18. fuse *fuse2.Fuse
  19. fuseServer *fuse.Server
  20. eventChan *MountEventChan
  21. }
  22. func NewMount(cfg *config.Config, db *db2.DB, uploader *uploader.Uploader, downloader *downloader.Downloader) *Mount {
  23. mnt := &Mount{
  24. cfg: cfg,
  25. eventChan: async.NewUnboundChannel[MountEvent](),
  26. }
  27. if cfg != nil {
  28. mnt.vfs = vfs.NewVfs(cfg, db, uploader, downloader)
  29. mnt.fuse = fuse2.NewFuse(cfg, mnt.vfs)
  30. }
  31. return mnt
  32. }
  33. func (m *Mount) Start() *MountEventChan {
  34. if m.cfg == nil {
  35. return m.eventChan
  36. }
  37. go func() {
  38. m.vfs.Start()
  39. defer m.vfs.Stop()
  40. nodeFsOpt := &fusefs.Options{
  41. MountOptions: fuse.MountOptions{
  42. FsName: "CDS",
  43. // Debug: true,
  44. },
  45. }
  46. rawFs := fusefs.NewNodeFS(m.fuse.Root(), nodeFsOpt)
  47. svr, err := fuse.NewServer(rawFs, m.cfg.MountPoint, &nodeFsOpt.MountOptions)
  48. if err != nil {
  49. m.eventChan.Send(ExitEvent{Err: err})
  50. return
  51. }
  52. m.fuseServer = svr
  53. svr.Serve()
  54. m.eventChan.Send(ExitEvent{})
  55. }()
  56. return m.eventChan
  57. }
  58. func (m *Mount) Stop() {
  59. if m.fuseServer == nil {
  60. m.eventChan.Send(ExitEvent{})
  61. return
  62. }
  63. m.fuseServer.Unmount()
  64. }
  65. func (m *Mount) MountPoint() string {
  66. if m.cfg == nil {
  67. return ""
  68. }
  69. return m.cfg.MountPoint
  70. }
  71. func (m *Mount) Dump() MountStatus {
  72. if m.vfs == nil {
  73. return MountStatus{}
  74. }
  75. cacheStatus := m.vfs.Dump()
  76. return MountStatus{
  77. Cache: cacheStatus,
  78. }
  79. }
  80. func (m *Mount) NotifyObjectInvalid(obj clitypes.Object) {
  81. }
  82. func (m *Mount) NotifyPackageInvalid(pkg clitypes.Package) {
  83. }
  84. func (m *Mount) NotifyBucketInvalid(bkt clitypes.Bucket) {
  85. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。