mount.rs 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. use std::fmt::Display;
  2. use nix::mount::{mount, MsFlags};
  3. use crate::log::logger;
  4. pub fn mount_sysfs() -> nix::Result<()>{
  5. let flag = MsFlags::MS_NODEV
  6. .union(MsFlags::MS_NOEXEC)
  7. .union(MsFlags::MS_NOSUID);
  8. mount(Some("sysfs"),"/sys",Some("sysfs"),flag, Some("nodev,noexec,nosuid"))
  9. }
  10. pub fn mount_proc() -> nix::Result<()>{
  11. let flag = MsFlags::MS_NODEV
  12. .union(MsFlags::MS_NOEXEC)
  13. .union(MsFlags::MS_NOSUID);
  14. mount(Some("proc"),"/proc",Some("proc"),flag, Some("nodev,noexec,nosuid"))
  15. }
  16. pub fn mount_devtmpfs<T1, T2>(target: &str, size: T1, mode: T2) -> nix::Result<()>
  17. where T1: Display, T2: Display
  18. {
  19. let flag = MsFlags::empty();
  20. let option = format!("size={}, mode={}", size, mode);
  21. mount(Some("udev"),target,Some("devtmpfs"),flag, Some(option.as_str()))
  22. }
  23. pub fn mount_runfs(opt: &str) -> nix::Result<()>
  24. {
  25. let flag = MsFlags::MS_NOSUID;
  26. //let flag = MsFlags::empty();
  27. let option = if opt.is_empty(){
  28. "".to_string()
  29. }else{
  30. format!("{}", opt)
  31. };
  32. mount(Some("tmpfs"),"/run",Some("tmpfs"),flag, Some(option.as_str()))
  33. }
  34. pub fn mount_custom(src: Option<&str>, target: &str, fstype: Option<&str>, opt: Option<&str>, flag: MsFlags) -> nix::Result<()>
  35. {
  36. mount(src, target,fstype,flag, opt)
  37. }
  38. pub fn move_mount(src: &str, target: &str) -> nix::Result<()>{
  39. let flag = MsFlags::MS_MOVE;
  40. mount(Some(src),target,None as Option<&str>,flag, Some("move"))
  41. }
  42. pub fn convert_flag_from_string_vec(flags: &Option<Vec<String>>, fsname: &str) -> MsFlags {
  43. let mut flag_val = MsFlags::empty();
  44. match flags {
  45. None => {
  46. flag_val
  47. }
  48. Some(flag_list) => {
  49. for fstr in flag_list {
  50. match fstr.as_str() {
  51. "bind" => { flag_val = flag_val.union(MsFlags::MS_REC) }
  52. "rbind" => {}
  53. "ro" => { flag_val = flag_val.union(MsFlags::MS_RDONLY) }
  54. "rw" => {}
  55. "nosuid" => { flag_val = flag_val.union(MsFlags::MS_NOSUID) }
  56. "suid" => {}
  57. "nodev" => { flag_val = flag_val.union(MsFlags::MS_NODEV) }
  58. "dev" => {}
  59. "noexec" => { flag_val = flag_val.union(MsFlags::MS_NOEXEC) }
  60. "exec" => {}
  61. "sync" => { flag_val = flag_val.union(MsFlags::MS_SYNCHRONOUS) }
  62. "async" => {}
  63. "noatime" => { flag_val = flag_val.union(MsFlags::MS_NOATIME) }
  64. "atime" => {}
  65. "realtime" => { flag_val = flag_val.union(MsFlags::MS_RELATIME) }
  66. "norealtime" => {}
  67. "nodiratime" => { flag_val = flag_val.union(MsFlags::MS_NODIRATIME) }
  68. "diratime" => {}
  69. "silent" => { flag_val = flag_val.union(MsFlags::MS_SILENT) }
  70. "loud" => {}
  71. "shared" => { flag_val = flag_val.union(MsFlags::MS_SHARED) }
  72. "rshared" => { flag_val = flag_val.union(MsFlags::MS_SHARED).union(MsFlags::MS_REC) }
  73. "slave" => { flag_val = flag_val.union(MsFlags::MS_SLAVE) }
  74. "rslave" => { flag_val = flag_val.union(MsFlags::MS_SLAVE).union(MsFlags::MS_REC) }
  75. "private" => { flag_val = flag_val.union(MsFlags::MS_PRIVATE) }
  76. "rprivate" => { flag_val = flag_val.union(MsFlags::MS_PRIVATE).union(MsFlags::MS_REC) }
  77. "unbindable" => { flag_val = flag_val.union(MsFlags::MS_UNBINDABLE) }
  78. "runbindable" => { flag_val = flag_val.union(MsFlags::MS_UNBINDABLE).union(MsFlags::MS_REC) }
  79. "remount" => { flag_val = flag_val.union(MsFlags::MS_REMOUNT) }
  80. "move" => { flag_val = flag_val.union(MsFlags::MS_MOVE) }
  81. _ => {
  82. logger().warn("mount", format!("unknown flag name '{}' for mounting '{}'", fstr, fsname).as_str());
  83. }
  84. }
  85. }
  86. flag_val
  87. }
  88. }
  89. }