Linux

找不到 Blob:使用 linux 腳本將 tar.gz 上傳到 Azure 儲存容器時出錯

  • November 20, 2015

錯誤

門戶顯示此Blob not found.錯誤

在此處輸入圖像描述

這是我按下download按鈕時遇到的 XML 錯誤

<Error>
   <Code>ResourceNotFound</Code>
   <Message>
       The specified resource does not exist. RequestId:bea21dfd-0001-004f-26e0-220af6000000 Time:2015-11-19T15:38:55.9836819Z
   </Message>
</Error>

背景

我一直在嘗試實施一種解決方法來在 Azure 中備份我的 IaaS v2 Ubuntu VM。多虧了我最近在 Server Fault 上收到的一個很好的答案,我決定最好的方法就是使用 tar 和 cronjob 定期備份我的伺服器。

因此,我在 google 上搜尋了“linux azure VM 上的 tar 備份”——這讓我看到了這篇文章,即:如何在不關閉 VM 的情況下在 Azure 上進行 Linux 備份

本教程概述了執行 tar 命令的過程,然後使用列出的憑據將 tar 上傳到 azure 儲存容器。這是有問題的腳本:

#!/bin/bash
# full system backup

# Backup destination
backdest=/opt/backup

# Labels for backup name
pc=${HOSTNAME}
distro=`uname -a | awk '{print $4}'` 
type=full
date=$(date "+%F")
backupfile="$backdest/$distro-$type-$date.tar.gz"
username=`whoami`

#blob storage variables
storageAccountName=storageaccountname
storageAccountKey=mylongassstoragekey
storageContainer=backupcontainername


# Exclude file location
prog=${0##*/} # Program name from filename
excdir=`pwd`
exclude_file="$excdir/$prog-exc.txt"


#check backup destination is there
if [ ! -d "$backdest" ]; then
       mkdir -p $backdest
fi

# Check if exclude file exists
if [ ! -f $exclude_file ]; then
 echo "checking exclude $exclude_file"
 echo -n "No exclude file exists, continue? (y/n): "
 read continue
 if [ $continue == "n" ]; then exit; fi
fi


#don't use nohup we want to make this blocking
tar --exclude-from=$exclude_file -czpvf $backupfile /

#after tar is finished move to blob storage
azure storage blob upload -a $storageAccountName --container $storageContainer -k $storageAccountKey $backupfile

echo "all done!"

一切似乎都很順利,腳本執行備份,然後將 tar.gz 作為塊 blob 上傳。但是,正如您從上面的錯誤中看到的那樣,沒有找到 Blob。儲存容器設置為“Container”(相對於“Private”)。

我什至不知道如何開始對此進行故障排除。我該怎麼辦?任何幫助將不勝感激。非常感謝!

解決了這個問題。這裡有幾個問題:

  1. 該腳本使用以 開頭的文件名創建 blob,而文件名$distro恰好以URI 字元開頭#,這是一個保留的 URI 字元。我更改了腳本,使其看起來更相似$type_$date
  2. 儲存 blob 命令失敗(靜默),因為腳本沒有以sudo特權執行它們。我所要做的就是添加sudo和呼叫,一切正常tarazure storage

Blob 名稱要求您轉義保留的 URL 字元。您的 blob 名稱以 a 開頭,#這是一個保留的 URL 字元。我懷疑當您刪除該字元(或轉義它)時問題會自行解決。注意:我還沒有通過獨立測試證實這一點,但這是我第一次看到帶有#字元的 blob 名稱……

有關 blob 命名的更多資訊在這裡

引用自:https://serverfault.com/questions/737573