我目前所了解的快照有兩種,第一種是cofw 寫時拷貝,在修改資料塊時將原來資料原封不動的拷貝到快照資源儲存空間,已達到保護的目的,第二種,就是我將要說的寫時重定向row,他跟cofw不同的時在保護資料的時候不會發生資料拷貝,只需要在原儲存空間申請新的資料塊,使用者讀資料時會重定向到新的資料塊,不需要做拷貝。
這種重定向的快照基於一種特殊的lun,精簡lun,簡單介紹下這種lun。有兩個儲存區,物理區和私有區,私有區用來儲存管理資訊,位址對映,而物理區真正的儲存資料。
當使用者首次寫原lun的時候,假設從0位置起始開始寫資料,大小為乙個資料塊8k,原理圖如下:
首先,根據使用者所寫的範圍大小,產生乙個邏輯位址,這裡也叫lba,標誌使用者寫資料的位置。物理區也會產生乙個標誌哪個資料塊的實體地址pba,這個pba與lba通過私有區一一對映,也即,乙個資料塊有lba和pba且一一對應。二元組是用來記錄所保護的資料,有兩個值乙個lba,乙個pba,表示lba資料塊的資料修改前的資料存放在pba的位置。
使用者剛開始寫的時候,發現原lun 是沒有資料的,此時要給第乙個資料塊寫a。它會先去根據寫的位置lba=0讀位址對映,查改lba對應的pba,發現未對映過,pba為全ff,此時要去保護寫a之前的資料,寫a之前沒資料,所以lba=0,pba = ff;再把a寫到lba=0,pba=0的位置。
同理有數的lun也是如此:
使用者給a位置寫a',查位址對映發現a的位址對映存在且為0,即pba = 0;這時,會在物理區新分配乙個資料塊,並把a'寫進去,同時把之前對映a的位址修改為對映a',二元組中存放的是lba =0,pba= 0;使用者下次來讀lba=0的位置會讀到a',而a被保護在二元組中,要想回到a,需要會滾到該時間點之前。
檔案輸入輸出(一) 重定向
函式名 freopen 宣告 file freopen const char path,const char mode,file stream 所在檔案 stdio.h 引數說明 path 檔名,用於儲存輸入輸出的自定義檔名。mode 檔案開啟的模式。和fopen中的模式 如r 唯讀,w 寫 相同。...
基礎知識 三 重定向dup和dup2
include int dup int oldfd int dup2 int oldfd,int newfd 當呼叫dup時,核心在程序中建立乙個新的檔案描述符,這個檔案描述符是現有可用檔案描述符中最小的,而且它指向的是oldfd所指向的檔案。而dup2不同的是,如果newfd已經開啟,則將其關閉,...
linux基礎知識之 IO重定向和管道
1.io重定向 有兩種基本的方法可以用來重定向標準輸入 stdin 標準輸出 stdout 和標準錯誤 stderr 可以利用管道把這些資料流之一輸送給另外一條命令 也可以利用i o重定向把這些資料流之一重定向到乙個檔案。管道及i o重新定向是linux系統中特有的概念。所謂管道是指將某個命令的輸出...