seq.rs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. use std::fs;
  2. use lazy_static::lazy_static;
  3. use crate::log::{logger};
  4. use std::sync::atomic::{AtomicBool, Ordering};
  5. use crate::op::{makesure, once};
  6. use crate::{cfg};
  7. use crate::mount::{convert_flag_from_string_vec, mount_custom};
  8. lazy_static!{
  9. static ref SEQ_OK_PREPARE: AtomicBool = AtomicBool::new(false);
  10. static ref SEQ_OK_FSMOUNT: AtomicBool = AtomicBool::new(false);
  11. static ref SEQ_OK_NEWENV: AtomicBool = AtomicBool::new(false);
  12. static ref SEQ_OK_MOVEMNT: AtomicBool = AtomicBool::new(false);
  13. }
  14. pub fn prepare() {
  15. if SEQ_OK_PREPARE.load(Ordering::Relaxed) {
  16. logger().warn("seq", "The sequence 'prepare' is already executed. Ignored.");
  17. return;
  18. }
  19. makesure::mkdir_p("/boot");
  20. once::mount_bootfs();
  21. cfg::load_phase2();
  22. makesure::export_initrd_env_from_cfg();
  23. once::mount_runfs_from_cfg();
  24. SEQ_OK_PREPARE.store(true, Ordering::Relaxed);
  25. }
  26. pub fn fstab_mount() {
  27. if SEQ_OK_FSMOUNT.load(Ordering::Relaxed) {
  28. logger().warn("seq", "The sequence 'fstab-mount' is already executed. Ignored.");
  29. return;
  30. }
  31. let cfg_inst = cfg::CFG.get();
  32. let fstab = cfg_inst.get_cfg().get_fstab();
  33. 'mount_fs:
  34. for item in fstab {
  35. let m_must_mount = match item.must_mount {
  36. None => false,
  37. Some(v) => v,
  38. };
  39. let m_src = match &item.src {
  40. None => None,
  41. Some(v) => Some(v.as_str())
  42. };
  43. let m_fstype = match &item.fstype {
  44. None => None,
  45. Some(v) => Some(v.as_str())
  46. };
  47. let m_opt = match &item.option {
  48. None => None,
  49. Some(v) => Some(v.as_str())
  50. };
  51. let m_target = (&item.target).as_str();
  52. let m_flg = convert_flag_from_string_vec(&item.flags, m_target);
  53. let d_src = match &item.src {
  54. None => "<none>",
  55. Some(v) => {v.as_str()}
  56. };
  57. let d_fstype = match &item.fstype {
  58. None => "<none>",
  59. Some(v) => {v.as_str()}
  60. };
  61. let d_opt = match &item.option {
  62. None => "<none>",
  63. Some(v) => {v.as_str()}
  64. };
  65. match &item.pre_mkdir {
  66. None => {}
  67. Some(v) => {
  68. for pmi in v.clone() {
  69. let mkr = fs::create_dir_all(pmi.as_str());
  70. match mkr {
  71. Ok(_) => {}
  72. Err(err) => {
  73. if m_must_mount{
  74. logger().fatal("fstab", format!(
  75. "failed mount '{}': failed in creating pre-mount dir '{}': {:?}",
  76. d_src,
  77. pmi.as_str(),
  78. err
  79. ).as_str())
  80. }else {
  81. logger().warn("fstab", format!(
  82. "failed mount '{}': failed in creating pre-mount dir '{}': {:?}",
  83. d_src,
  84. m_target,
  85. err
  86. ).as_str());
  87. continue 'mount_fs;
  88. }
  89. }
  90. }
  91. }
  92. }
  93. }
  94. let r = mount_custom(m_src, m_target, m_fstype, m_opt, m_flg);
  95. match r {
  96. Ok(_) => {
  97. logger().debug("fstab", format!(
  98. "mounted '{}' at '{}' with fstype='{}', option='{}', flags={:#x}.",
  99. d_src,
  100. m_target,
  101. d_fstype,
  102. d_opt,
  103. m_flg,
  104. ).as_str())
  105. }
  106. Err(err) => {
  107. if m_must_mount {
  108. logger().fatal("fstab", format!(
  109. "failed mount '{}' at '{}' with fstype='{}', option='{}', flags={:#x}: {:?}",
  110. d_src,
  111. m_target,
  112. d_fstype,
  113. d_opt,
  114. m_flg,
  115. err
  116. ).as_str());
  117. continue 'mount_fs;
  118. }else{
  119. logger().warn("fstab", format!(
  120. "failed mount '{}' at '{}' with fstype='{}', option='{}', flags={:#x}: {:?}",
  121. d_src,
  122. m_target,
  123. d_fstype,
  124. d_opt,
  125. m_flg,
  126. err
  127. ).as_str());
  128. continue 'mount_fs;
  129. }
  130. }
  131. }
  132. match &item.post_mkdir {
  133. None => {}
  134. Some(v) => {
  135. for pmi in v.clone() {
  136. let mkr = fs::create_dir_all(pmi.as_str());
  137. match mkr {
  138. Ok(_) => {}
  139. Err(err) => {
  140. if m_must_mount{
  141. logger().fatal("fstab", format!(
  142. "failed mount '{}': failed in creating post-mount dir '{}': {:?}",
  143. d_src,
  144. pmi.as_str(),
  145. err
  146. ).as_str())
  147. }else {
  148. logger().warn("fstab", format!(
  149. "failed mount '{}': failed in creating post-mount dir '{}': {:?}",
  150. d_src,
  151. m_target,
  152. err
  153. ).as_str());
  154. continue 'mount_fs;
  155. }
  156. }
  157. }
  158. }
  159. }
  160. }
  161. }
  162. SEQ_OK_FSMOUNT.store(true, Ordering::Relaxed);
  163. }
  164. pub fn new_env() {
  165. if SEQ_OK_NEWENV.load(Ordering::Relaxed) {
  166. logger().warn("seq", "The sequence 'new-env' is already executed. Ignored.");
  167. return;
  168. }
  169. makesure::export_env_from_cfg();
  170. SEQ_OK_NEWENV.store(true, Ordering::Relaxed)
  171. }
  172. pub fn move_prepare_mount() {
  173. if SEQ_OK_MOVEMNT.load(Ordering::Relaxed) {
  174. logger().warn("seq", "The sequence 'move-mnt' is already executed. Ignored.");
  175. return;
  176. }
  177. let new_root = cfg::CFG.get().get_cfg().get_new_root();
  178. once::move_sysfs(format!("{}/sys", new_root).as_str());
  179. once::move_proc(format!("{}/proc", new_root).as_str());
  180. once::move_bootfs(format!("{}/boot", new_root).as_str());
  181. once::move_run(format!("{}/run", new_root).as_str());
  182. once::move_temporary_devtmpfs(new_root.as_str());
  183. SEQ_OK_MOVEMNT.store(true, Ordering::Relaxed)
  184. }