]> git.proxmox.com Git - proxmox-backup.git/blob - src/tape/mod.rs
5248d21b4676fbb5c03c017e07ce6c21d03f5532
[proxmox-backup.git] / src / tape / mod.rs
1 //! Magnetic tape backup
2
3 use anyhow::{format_err, Error};
4
5 use proxmox::tools::fs::{
6 create_path,
7 CreateOptions,
8 };
9
10 use pbs_buildcfg::PROXMOX_BACKUP_RUN_DIR_M;
11
12 #[cfg(test)]
13 mod test;
14
15 pub mod file_formats;
16
17 mod tape_write;
18 pub use tape_write::*;
19
20 mod tape_read;
21 pub use tape_read::*;
22
23 mod helpers;
24 pub use helpers::*;
25
26 mod media_set;
27 pub use media_set::*;
28
29 mod inventory;
30 pub use inventory::*;
31
32 mod linux_list_drives;
33 pub use linux_list_drives::*;
34
35 pub mod changer;
36
37 pub mod drive;
38
39 mod media_pool;
40 pub use media_pool::*;
41
42 mod media_catalog;
43 pub use media_catalog::*;
44
45 mod pool_writer;
46 pub use pool_writer::*;
47
48 /// Directory path where we store all tape status information
49 pub const TAPE_STATUS_DIR: &str = "/var/lib/proxmox-backup/tape";
50
51 /// Directory path where we store temporary drive state
52 pub const DRIVE_STATE_DIR: &str = concat!(PROXMOX_BACKUP_RUN_DIR_M!(), "/drive-state");
53
54 /// Directory path where we store cached changer state
55 pub const CHANGER_STATE_DIR: &str = concat!(PROXMOX_BACKUP_RUN_DIR_M!(), "/changer-state");
56
57 /// We limit chunk archive size, so that we can faster restore a
58 /// specific chunk (The catalog only store file numbers, so we
59 /// need to read the whole archive to restore a single chunk)
60 pub const MAX_CHUNK_ARCHIVE_SIZE: usize = 4*1024*1024*1024; // 4GB for now
61
62 /// To improve performance, we need to avoid tape drive buffer flush.
63 pub const COMMIT_BLOCK_SIZE: usize = 128*1024*1024*1024; // 128 GiB
64
65
66 /// Create tape status dir with correct permission
67 pub fn create_tape_status_dir() -> Result<(), Error> {
68 let backup_user = crate::backup::backup_user()?;
69 let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750);
70 let options = CreateOptions::new()
71 .perm(mode)
72 .owner(backup_user.uid)
73 .group(backup_user.gid);
74
75 create_path(TAPE_STATUS_DIR, None, Some(options))
76 .map_err(|err: Error| format_err!("unable to create tape status dir - {}", err))?;
77
78 Ok(())
79 }
80
81 /// Create drive state dir with correct permission
82 pub fn create_drive_state_dir() -> Result<(), Error> {
83 let backup_user = crate::backup::backup_user()?;
84 let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750);
85 let options = CreateOptions::new()
86 .perm(mode)
87 .owner(backup_user.uid)
88 .group(backup_user.gid);
89
90 create_path(DRIVE_STATE_DIR, None, Some(options))
91 .map_err(|err: Error| format_err!("unable to create drive state dir - {}", err))?;
92
93 Ok(())
94 }
95
96 /// Create changer state cache dir with correct permission
97 pub fn create_changer_state_dir() -> Result<(), Error> {
98 let backup_user = crate::backup::backup_user()?;
99 let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750);
100 let options = CreateOptions::new()
101 .perm(mode)
102 .owner(backup_user.uid)
103 .group(backup_user.gid);
104
105 create_path(CHANGER_STATE_DIR, None, Some(options))
106 .map_err(|err: Error| format_err!("unable to create changer state dir - {}", err))?;
107
108 Ok(())
109 }