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.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. AllowOther: true,
  43. FsName: "CDS",
  44. // Debug: true,
  45. },
  46. GID: m.cfg.GID,
  47. UID: m.cfg.UID,
  48. }
  49. rawFs := fusefs.NewNodeFS(m.fuse.Root(), nodeFsOpt)
  50. svr, err := fuse.NewServer(rawFs, m.cfg.MountPoint, &nodeFsOpt.MountOptions)
  51. if err != nil {
  52. m.eventChan.Send(ExitEvent{Err: err})
  53. return
  54. }
  55. m.fuseServer = svr
  56. svr.Serve()
  57. m.eventChan.Send(ExitEvent{})
  58. }()
  59. return m.eventChan
  60. }
  61. func (m *Mount) Stop() {
  62. if m.fuseServer == nil {
  63. m.eventChan.Send(ExitEvent{})
  64. return
  65. }
  66. m.fuseServer.Unmount()
  67. }
  68. func (m *Mount) MountPoint() string {
  69. if m.cfg == nil {
  70. return ""
  71. }
  72. return m.cfg.MountPoint
  73. }
  74. func (m *Mount) Dump() MountStatus {
  75. if m.vfs == nil {
  76. return MountStatus{}
  77. }
  78. cacheStatus := m.vfs.Dump()
  79. return MountStatus{
  80. Cache: cacheStatus,
  81. }
  82. }
  83. func (m *Mount) ReclaimSpace() {
  84. if m.vfs == nil {
  85. return
  86. }
  87. m.vfs.ReclaimSpace()
  88. }
  89. func (m *Mount) NotifyObjectInvalid(obj clitypes.Object) {
  90. }
  91. func (m *Mount) NotifyPackageInvalid(pkg clitypes.Package) {
  92. }
  93. func (m *Mount) NotifyBucketInvalid(bkt clitypes.Bucket) {
  94. }

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