Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux备份Bash_Linux_Bash_Ubuntu_Backup - Fatal编程技术网

Linux备份Bash

Linux备份Bash,linux,bash,ubuntu,backup,Linux,Bash,Ubuntu,Backup,我试图创建一个bash脚本,将整个/dev/sda1备份到/mnt/backup /dev/sda1 457G 3.5G 431G 1% / /dev/sdb1 2.8T 3.0G 2.8T 1% /mnt/Backup 具有以下功能的脚本: START=$(date +%D) FOLDER_NAME=`echo $START | tr -s '/' | tr '/' '_'` SOURCE_PATH='/media /bin /boot /cdrom

我试图创建一个bash脚本,将整个/dev/sda1备份到/mnt/backup

/dev/sda1       457G  3.5G  431G   1% /
/dev/sdb1       2.8T  3.0G  2.8T   1% /mnt/Backup
具有以下功能的脚本:

START=$(date +%D)
FOLDER_NAME=`echo $START | tr -s '/' | tr '/' '_'`
SOURCE_PATH='/media /bin /boot /cdrom /dev /etc /home /lib /opt /proc /root /run /sbin /selinux /srv /sys /tmp /usr /var'
SOURCE_PATH='/'
FOLDER_PATH='/mnt/Backup'
BACKUP_PATH=$FOLDER_PATH/Bkp_$FOLDER_NAME
mkdir -p '$BACKUP_PATH'
cp -r $SOURCE_PATH $BACKUP_PATH
正如您在上面的源路径中所看到的,我已经尝试命名所有我想要备份的文件夹,但是当我使用该路径运行时,我得到一个错误:这不是一个目录

然后我尝试了下面的源路径/和复制开始,但被卡住了

cp: reading `/proc/sysrq-trigger': Input/output error
cp: failed to extend `/mnt/Backup/Bkp_09_14_13/proc/sysrq-trigger': Input/output error
问题是如何更改脚本以成功地将sda1备份到sdb1


提前感谢您的帮助

如果将/dev/sda1作为根文件系统装载,则在其上执行递归复制还将在其目录下包含装载的文件系统。您可以将其再次装载到另一个目录,例如/mnt/system,然后从中进行递归复制。我建议使用cp-a,而不仅仅是-r。

我不确定您的实际程序,但这里有一些小事情:

START=$(date +%D)
FOLDER_NAME=`echo $START | tr -s '/' | tr '/' '_'`
$和``的作用完全相同。为什么要在一个脚本中同时使用两者?与反勾号相比,更喜欢$,因为它们可以嵌套。还有,tr-s'/'的意义是什么?首先,它可以压缩为一个tr:

echo "$START" | tr -s '/' '_'
但考虑到date+%D永远不会返回重复的斜杠,您可以使用纯bash参数展开:

FOLDER_NAME=${START//\//_}
这是怎么工作的:mkdir-p“$BACKUP\u PATH”?单引号中的变量不展开。更改为mkdir-p$BACKUP\u路径

$SOURCE\u PATH在cp-r$SOURCE\u PATH$BACKUP\u PATH中不需要引号,因为您希望将其拆分为不同的参数。没错。但您必须使用$BACKUP\u PATH,因为您希望它是单个参数

下面是您的脚本,有一些小的改进:

START=$(date +%D)
FOLDER_NAME=${START//\//_}
SOURCE_PATH='/media /bin /boot /cdrom /dev /etc /home /lib /opt /proc /root /run /sbin /selinux /srv /sys /tmp /usr /var'
SOURCE_PATH='/'
FOLDER_PATH='/mnt/Backup'
BACKUP_PATH=$FOLDER_PATH/Bkp_$FOLDER_NAME
mkdir -p "$BACKUP_PATH"
cp -r $SOURCE_PATH "$BACKUP_PATH"

/proc是一个虚拟文件系统,你为什么要备份它?嗨,Barmar,我正在备份sda1中的所有内容,/proc正好是mkdir-p$BACKUP\u路径,带双引号可能会有点帮助…嗨,如果mkdir命令已经在我已经有的另一个脚本上工作了。这里的问题似乎只是如何将所有数据从sda1复制到sdb1/proc不在sda1上。感谢您的回复。你认为如果我只从cp-r改为cp-a,脚本就能完成复制而不会出错吗?我觉得它可以工作,但实际上我还没有尝试过。大多数情况下,我只是在备份之前将系统装载到另一个目录上。您还打算从其他文件系统复制其他文件吗?e、 g.tmpfs在/tmp中,udev在/dev中,sysfs在/sys上?我不认为它们对备份是必要的。你可以只做mkdir-p/mnt/system;mount/dev/sda1/mnt/system;cd/mnt/系统;cp-a*/Somewhere唯一需要备份的是sda1i上的“/”,我有一台linux测试机器正在工作,我将在周一上午尝试您的选择,然后将其应用到实时环境Hi Aleks我将在周一上午在测试环境中尝试运行此改进的脚本,并让您知道它是如何运行的。非常感谢您抽出时间。赞赏