NCNU-OpenSource
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Help
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    --- tags: 1082, lsa --- - Book mode https://hackmd.io/@ncnu-opensource/book [TOC] # 備份 硬碟是有壽命的,無法永久使用,有讀寫的壽命,當意外情況發生避免資料消失就是備份最大的目的 :::info 俗話說:雞蛋不放在同一個籃子裡 -- 無論何種備份方式,通常會需要兩顆硬碟以上 ::: ## 資料與硬碟 ### 硬碟 #### 運作原理 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Cylinder_Head_Sector.svg/400px-Cylinder_Head_Sector.svg.png) ![](https://i.imgur.com/lYwKeBl.png) * 碟片(Platters) 每個磁片兩面皆可儲存資料,主要是透過磁力將碟片磁化留下資料。 * 磁頭(Heads) 用來讀取留在碟片上的資料,通常每一個碟片上下都會各有一個磁頭,碟片的轉速和磁頭的移動速度都是影響讀取速度的關鍵。 * 磁軌(Track) 當磁盤旋轉時,磁頭若保持在一個位置上,則每個磁頭都會在磁盤表面劃出一個圓形軌跡,這些圓形軌跡就叫做磁軌(Track)。 * 磁區(Sector) 磁盤上的每個磁軌被等分為若干個弧段,這些弧段便是硬碟的磁區(Sector)。硬碟的第一個磁區,叫做開機磁區。 * 磁柱/柱面(Cylinder) 在有多個碟片構成的盤組中,由不同碟片的面,但處於同一半徑圓的多個磁軌(Track)組成的一個圓柱面(Cylinder)。 ::: info 低階格式化(Low-Level formatting): 將磁碟分成磁軌與磁區,通常在硬碟出廠時就會設定好。 ::: [硬碟救援案例](https://www.ptt.cc/bbs/Storage_Zone/M.1434987477.A.C57.html) 參考:[參考資料](http://enews.open2u.com.tw/~noupd/book_up/5181/(395)069-075.pdf) ### 磁碟分割槽(Volume) :::info 一個磁碟分割槽是由多個磁柱所組成 ::: * 磁碟的分割會由分割表紀錄,目前主要的分割表有兩種 -- MBR和GPT * MBR(Master boot Record):又稱主引導磁區, 主開機紀錄,是電腦啟動後存取硬碟時所必須要讀取的首個磁區,主引導磁區記錄著硬碟本身的相關訊息以及硬碟各個分割的大小及位置訊息,是資料訊息的重要入口。如果它受到破壞,硬碟上的基本資料結構訊息將會遺失,需要用繁瑣的方式試探性的重建資料結構訊息後才可能重新存取原先的資料**最多只支援到2TB硬碟**(再傳統一個block上只有512byte) * GPT(GUID Partition Table):又稱全域唯一標識分割區表,在MBR硬碟中,分割區資訊直接儲存於主開機紀錄(MBR)中(主開機紀錄中還儲存著系統的啟動程式)。但在GPT硬碟中,分割區表的位置資訊儲存在GPT header中。但出於相容性考慮,硬碟的第一個磁區仍然用作MBR,之後才是GPT header。GPT分配64bits給邏輯塊位址,因而使得最大分割區大小在264-1個磁區成為了可能**支援目前所有容量的硬碟,最大18eB的單一分割區**。跟現代的MBR一樣,GPT也使用邏輯區塊位址(LBA)取代了早期的CHS尋址方式。17K ::: success 這兩個分割表都是由邏輯區塊位址(LBA)來從磁碟取得檔案,取代了CHS(cylinders-heads-sectors,磁柱-磁頭-磁區)定址模式,每家廠商出場的硬碟多少有些不同,由作業系統直面這些構造,可能造成多餘的麻煩,故先將CHS轉換成LBA,再由作業系統管理會更輕鬆簡便。 ::: 由分割表紀錄好磁區,**每個磁區可以使用不同的檔案系統**,磁區又分為主要磁碟分割與擴充磁碟分割。其中擴充磁碟分割無法直接使用,要在擴充磁碟分割之上增加邏輯磁碟分割。 * **MBR分割表**中**主要磁碟分割最多4個(只有主要分割可以安裝作業系統)**,擴充磁碟分割最多一個,在擴充磁碟分割之上的邏輯分割可以有無限多個。 * **GPT分割表**的**主要分割表在一般硬碟上可以多達128個**,所以不必考慮主要磁碟分割與擴充磁碟分割 :::info 傳統的磁碟與檔案系統之應用中,一個分割槽就是只能夠被格式化成為一個檔案系統,所以我們可以說一個 filesystem 就是一個 partition。但是由於新技術的利用,例如我們常聽到的LVM與軟體磁碟陣列(software raid), 這些技術可以將一個分割槽格式化為多個檔案系統(例如LVM),也能夠將多個分割槽合成一個檔案系統(LVM, RAID)! 所以說,目前我們在格式化時已經不再說成針對 partition 來格式化了, 通常我們可以稱呼**一個可被掛載的資料為一個檔案系統**而不是一個分割槽喔! ::: 參考資料: 維基:[硬碟](https://zh.wikipedia.org/wiki/%E7%A1%AC%E7%9B%98) ,[GUID分割表](https://zh.wikipedia.org/wiki/GUID%E7%A3%81%E7%A2%9F%E5%88%86%E5%89%B2%E8%A1%A8), [邏輯區塊位址](https://zh.wikipedia.org/wiki/%E9%82%8F%E8%BC%AF%E5%8D%80%E5%A1%8A%E4%BD%8D%E5%9D%80), [主開機紀錄](https://zh.wikipedia.org/wiki/%E4%B8%BB%E5%BC%95%E5%AF%BC%E8%AE%B0%E5%BD%95) [認識硬碟](https://dywang.csie.cyut.edu.tw/dywang/linuxSystem/node14.html) ### 檔案系統 電腦的檔案系統是一種儲存與組織電腦系統的方法,使用檔案和檔案樹的抽象邏輯概念代替硬碟和光碟等物理裝置使用資料塊的概念。 :::info * 分割表紀錄磁柱的分配,和分割的資訊 * 檔案系統則是配合OS儲存資料,跟據查找資料的方式不同,不同作業系統可能會無法支援,如何良好的使用被分配到的磁柱和後續如何最快的找到檔案存放的位置就是檔案系統最主要的作用。 * 而相對於低階格式化,就是部署檔案系統的一個過程。 ::: #### 檔案系統發展大約可分三個時期 1. 初期:堪用即可 -- FAT家族 2. 中期:有紀錄檔以應對斷電時的檔案毀損\檔案系統毀損的問題,有的使用指全縣的管理,用演算法改善資料的存取效能 -- NTFS, ext3, HFS+... 3. 現代的檔案系統:使用checksum避免[silent corruption](https://en.wikipedia.org/wiki/Data_corruption),有volume Manager以及RAID,由上到下整合一切,硬碟分割區不再局限於一個硬碟,使用snapshot達到差異式備份 -- ZFS, btrfs, ReFS... 參考:[現代檔案系統ZFS的簡介與應用](https://www.slideshare.net/zuan0312/zfs-91029212) #### 在此介紹比較主流的幾個檔案系統 * FAT -- 檔案配置表(File Allocation Table) * FAT12: 1. 軟碟的文件系統 2. 不支援分層性結構 3. 叢集定址12位元, 最多只支援32MB的檔案容量 * FAT16 1. 每個分割最多只能有65525個叢集 2. 讀取速度最快的檔案系統格式 3. 單一檔案大小上限2GB 4. 大容量支援性最差 5. 檔案數量限制為65517個 6. 200MB的容量限制, 理論上可以支援達4GB, 但磁區如果超過200M存取效率會明顯變差 * FAT32 1. 理論上支援達8TB,但目前微軟所使用的軟體最多只可支援達約124G,除非使用第三方軟體 2. 最大單一檔達4GB 3. 在USB等流動動式裝置上使用,速度較為理想 4. 不知援windows的檔案壓縮與安全權限等功能 5. 在沒快取的情況下,搜尋資料較麻煩 ::: info > FAT > 是一種由微軟發明並擁有部分專利的檔案系統, 供MS-DOS使用, 也是所有非NT核心的微軟windows所使用的檔案系統 讀取方式,為如同鏈結串列般尋找檔案。如果長期使用下資料會變得很分散,導致尋找 時會花費更多時間,所以需要磁碟重組。 ![](https://i.imgur.com/dncfxp9.jpg) ::: * NFS windowsNT之後的windows系列通常都使用這種檔案系統 * HFS apple mac電腦中macOS所使用的檔案系統,不過目前apple有研發一種新的檔案系統名為APFS來改善HFS+的問題 * **EXT(Linux主要使用的檔案系統)** EXT主要使用的檔案系統--索引式檔案系統 ![](https://i.imgur.com/JzwGPRZ.jpg) 有學過OS的應該都很清楚inode的運作方式,透過層層索引集合成一個檔案,基本上linux之下所有檔案背後都會有一個inode ::: info 回: `Jerry Wang` * 簡單的說inode就是ext系列檔案系統處理資料所使用的方式。實際上如上圖,檔案系統會將儲存區分成兩塊,一塊放inode,而inode則紀錄了檔案系統中所使用的各個元件的資料 * 通過檔名打開檔案,實際上是分成三步實現: * 首先,作業系統找到這個檔名對應的inode號碼(inode 本身不會有檔名,多使用號碼作為代表。 * 其次,通過inode號碼,取得inode資訊。 * 最後,根據inode資訊,找到檔案資料所在的block,讀出資料。 * inode紀錄了`權限`,`擁有者`,`存取時間`...等資訊 ::: 參考:[檔案系統wiki](https://zh.wikipedia.org/wiki/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F), [鳥哥--第七章、Linux 磁碟與檔案系統管理](http://linux.vbird.org/linux_basic/0230filesystem.php), [第二章、主機規劃與磁碟分割](http://linux.vbird.org/linux_basic/0130designlinux.php#), [第零章、計算機概論](http://linux.vbird.org/linux_basic/0105computers.php#pc_hd) ## 磁碟陣列(RAID - Redundant Array of Independent Disk) > 容錯式磁碟陣列(RAID, Redundant Array of Independent Disks),舊稱容錯式廉價磁碟陣列(Redundant Array of Inexpensive Disks),簡稱磁碟陣列。利用虛擬化儲存技術把多個硬碟組合起來,成為一個或多個硬碟陣列組,目的為提升效能或資料冗餘,或是兩者同時提升。 在運作中,取決於 RAID 層級不同,資料會以多種模式分散於各個硬碟,RAID 層級的命名會以 RAID 開頭並帶數字,例如:RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每種等級都有其理論上的優缺點,不同的等級在兩個目標間取得平衡,分別是增加資料可靠性以及增加記憶體(群)讀寫效能。 簡單來說,RAID把多個硬碟組合成為一個邏輯硬碟,因此,作業系統只會把它當作一個實體硬碟。RAID常被用在伺服器電腦上,並且常使用完全相同的硬碟作為組合。由於硬碟價格的不斷下降與RAID功能更加有效地與主機板整合,它也成為普通用戶的一個選擇,特別是需要大容量儲存空間的工作,如:視訊與音訊製作。 :::info ### 軟硬體組RAID的差異: 1. 軟體磁碟陣列(Software RAID) 主要由電腦主機板CPU處理陣列儲存作業,缺點為耗損較多CPU資源運算RAID,優點則是價格偏低。分類有二種: * 純軟體磁碟陣列(Pure Software RAID):只需要主機板支援即可,不需要任何磁碟陣列卡。若主機板損壞,可能難以購買同款主機板重建RAID。 * 硬體輔助磁碟陣列(Hardware-Assisted RAID):需要一張RAID卡,以及廠商所提供的驅動程式。這款RAID較易遷移到其他電腦。 2. 硬體磁碟陣列(Hardware RAID) RAID卡上內建處理器,不需要伺服器的CPU運算。優點是讀寫效能最快,不佔用伺服器資源,可用於任何作業系統,也能在系統斷電後,透過備份電池模組(BBU, Backup Battery Unit)以及非揮發性記憶體 (NVRAM)將硬碟讀寫日誌檔(Journal)包含的剩餘讀寫作業先紀錄在記憶體中,等待電力供應復原後,再由NVRAM取回日誌檔資料,接著再完成讀寫作業,將剩餘讀寫作業安全完成以確保讀寫完整性。備份電池模組通常會配合陣列卡的Write-Back快取模式,藉由此記憶體快取讀寫作業以得到更高的讀寫效能;但是沒有備份電池模組的硬體磁碟陣列卡,切勿使用Write-Back快取模式以免遭遇斷電情形導致讀寫資料流失。此外,因為硬體磁碟陣列卡搭載CPU處理器,所以可以與系統分離出來,對硬碟進行各種作業,還原作業的速度也比軟體磁碟陣列快。缺點是其售價很高,通常只用於RAID 5和RAID 6。 ::: 取自:[維基](https://zh.wikipedia.org/wiki/RAID#JBOD) * Raid可以將數個不同的磁碟組成同一個磁區,使用同一個檔案系統,在使用硬碟上也更有效率。 1. Raid0 追求高存取效能,但是可靠度不高,硬碟毀,資料毀 會將資料分割,同時寫入各顆硬碟,因為是同時寫入同時讀取,所以效能較高 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/RAID_0.svg/260px-RAID_0.svg.png) 2. Raid1 即mirror,效能跟一顆硬碟時一樣 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/RAID_1.svg/195px-RAID_1.svg.png) :::warning Raid2之後通常需要3顆以上的硬碟才能組成Raid ::: ::: success Raid2-5 可以應付同時壞一顆硬碟的情況, 若同時壞兩顆可能資料也會救不回來 ::: 3. Raid2 在資料中加入(ECC, Error Correction Code),故資料會比原本的還要占空間,因為成本並不顯著的比mirror少,此外可靠度與Raid3差不多,所以現實中較少實際應用 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/RAID2_arch.svg/1920px-RAID2_arch.svg.png) 4. Raid3 ::: success > 此例非實際運作方式,此例為取相同概念做解釋。 ``` DiskA: 00011010001 AND DiskB: 11100101111 PARITY PDisk: 00000000001 ``` ::: 採用bit-interleaving, parity-check技術,可用空間(N+1)部Disk,會將parity檢查碼儲存在其中一顆硬碟之中。 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/RAID_3.svg/1920px-RAID_3.svg.png) 5. Raid4 採用block-interleaving, parity-check技術,可用空間為(N+1)部Disk,會將parity檢查碼儲存在其中一顆硬碟之中。 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/RAID_4.svg/1920px-RAID_4.svg.png) 6. Raid5 技術與Raid3/4相似但是不同於Raid3/4將parity檢查碼分散於各個硬碟,避免集中於單一Disk中風險過高,也避免對於同一顆硬碟使用過度。 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/RAID_5.svg/1920px-RAID_5.svg.png) 7. Raid6 使用[reed-solomon](https://zh.wikipedia.org/wiki/%E9%87%8C%E5%BE%B7-%E6%89%80%E7%BD%97%E9%97%A8%E7%A0%81)相似的技術,產生兩個parity檢查碼,分散存於各硬碟,以保證在兩顆硬碟同時壞掉時夠找回資料。 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/RAID_6.svg/1920px-RAID_6.svg.png) :::info `Raid2`與`Raid6`因為成本比較高,所以實際上叫少實際應用 * Raid2是因為成本與mirror佔用的磁碟空間差不多,但是風險卻高了許多。 * Raid6則是因為運算成本高,且一樣需要占用較多的空間。 ::: 8. Raid的組合 * Raid10/01 * Raid0+1 先做Raid0再做Raid1 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/RAID_01.svg/440px-RAID_01.svg.png) * Raid1+0 先做Raid1再做Raid0 ![image alt](https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/RAID_10.svg/440px-RAID_10.svg.png) ::: info 回: `蔡佳軒` * 主要目的是為了達成,RAID1的效能,跟RAID0的安全性。 * 這兩種我推薦RAID0+1,由圖來說明: * RAID0+1,若DISK0損壞,右邊那組RAID0,要等修復完畢才能再繼續使用。且RAID0+1不是在整合好的情況下使用,檔案RAID1鏡像之後,再做RAID0分割檔案寫入時,可能會有兩組RAID0分割不相同的問題,此種情況下壞掉那組RAID0要整組重新寫入。 * RAID1+0,若DISK1損壞,右邊那組RAID1,還能繼續使用 ::: ## 異地備份 -- 雲端硬碟,外接硬碟 ### 雲端硬碟 * #### 自架NAS(Network Attached Storage) * 購買廠商訂製調校好的(synology...) * 舊電腦安中NAS系統(FreeNAS, OpenMediaVault, NAS4Free...) :::info 自家架設的NAS,對於網路的硬體(switch, router)與internet的上傳(下載速度與上傳速度不同)速度有關,在使用時應該要多加注意 ::: * #### 廠商託管(google雲端硬碟,onedrive,dropbox) ### 外接硬碟 * 需要注意,不同的作業系統會有不同的檔案系統 * windows -- NTFS * linux -- ext2, ext3, ext4 * MacOS -- HFS, HFS+, (NTFS唯讀,無法修改) * 以上三者皆有支援 -- exFat, FAT(FAT家族同常用於隨身碟,但是有容量上限度) ### 比較 | |NAS | 雲端硬碟 | 外接硬碟 | | -------- | -------- | -------- | -------- | | 硬碟保養與管理 | 自行負責 | 廠商管理 | 自行負責 | | 電費成本 | 大(需要長時間不間斷開啟) | 無(通常會算在費用中) | 小(使用時才有消耗)| | 資料的安全性 | 中 | 高 | 低 | | 資安風險 | 中 | 低 | 高 | ## 細說ZFS -- 結合檔案系統與RAID的現代化檔案系統 ### 甚麼是ZFS ZFS它不只是一個檔案系統,結合了以往被分開的磁碟區管理程式 (Volume Manager) 及檔案系統兩個角色,讓檔案系統也能夠察覺磁碟底層結構的變動。 ZFS 最大的優點是可以察覺實體磁碟配置的變動,當有額外的磁碟加入到儲存池時可以自動擴增現有的檔案系統,所有的檔案系統便可使用這個新的空間。 ZFS 也有數個不同的屬性可以套用到各別檔案系統上,比起單一檔案系統,對建立數個不同檔案系統與資料集 (Dataset) 時有許多的好處。 ### 資料架構 ![](https://i.imgur.com/gBhfujg.jpg) ### 基本概念 * **儲存池 (Pool)** : 儲存池 (Pool) 是建構 ZFS 最基礎的單位。一個儲存池可由一個或多個 vdev 所組成,是用來儲存資料的底層裝置。儲存池會被拿來建立一個或多個檔案系統 (資料集 Dataset) 或區塊裝置 (磁碟區 Volume),這些資料集與磁碟區會共用儲存池的剩餘可用空間。每一個儲存池可由名稱與 GUID 來辨識。可用的功能會依儲存池上的 ZFS 版本而有不同。 * **vdev** : * 儲存池是由一個或多個 vdev 所組成,vdev 可以是一個磁碟或是 RAID Transform 的磁碟群組。當使用多個 vdev,ZFS 可以分散資料到各個 vdev 來增加效能與最大的可用空間。 * 最基本的 vdev 型態便是一個標準的資料區塊裝置,這可以是一整個磁碟 (例如 /dev/ada0 或 /dev/da0) 或一個分割區 (/dev/ada0p3)。 * RAID方式: * stripe : 同RAID0 * mirror : 同RAID1 * RAID-Z : 同RAID5,性質相似但是部屬方式可能有些不同 * RAID-Z2 : 同RAID6 * RAID-Z3 : ZFS特有的RAID方式,沒有可相對照的RAID系統,配置 8 個 1 TB 的磁碟,磁碟區將會可以提供 5 TB 的可用空間且在 3 個磁碟故障的情況下仍可運作。 * snapshot: ZFS可以紀錄當下檔案系統的所有組成,新寫入的檔案會優先寫入新的磁區不會對snapshot做修改。如果要回復可以使用Rollback,也可以使用Hook來暫時回到快照當時的情況。 參考: [Z 檔案系統 (ZFS)](https://www.freebsd.org/doc/zh_TW/books/handbook/zfs.html) [zfs的特色與檔案系統](https://www.freebsd.org/doc/zh_TW/books/handbook/zfs-term.html) [FreeNAS系統安裝](https://www.youtube.com/watch?v=BJ0wuGj_XJE) ## 備份策略 ### 完整備份 直接將整份資料完整的複製一份,最簡單直接的備份方式。 優點:簡單暴力、資料最為完整。 缺點:備份時間要花很久、非常消耗資源。 ### 差異備份 做過一次完整備份後,針對與**上一次完整備份**有所差異的資料進行備份。 優點:每份差異備份彼此獨立,不用擔心舊的差異備份檔案被刪除(但要擔心完整備份被刪除) 缺點:會重複備份到檔案,日積月累之下還是會佔不少空間。 ![](https://techwiser.com/wp-content/uploads/2019/01/differential-backup.jpg) ### 增量備份 只根據**上一次備份**有所差異的資料進行備份。 優點:消耗資源少、備份時間短。 缺點:資料分散,進行還原時需要耗費更久的時間、並且缺少其中任一份檔案就無法還原。 ![](https://techwiser.com/wp-content/uploads/2019/01/incremental-backup.jpg) :::info 一般會建議三種策略混合搭配使用,例如每個月完整備份、每周差異備份、每天增量備份。 ::: ## Linux上備份的好工具 -- rsync ### 軟體介紹 > rsync是Unix下的一款套用軟體,它能同步更新兩處電腦的檔案與目錄,並適當利用差分編碼以減少資料傳輸量。rsync中的一項同類軟體不常見的重要特性是每個目標的鏡像只需傳送一次。rsync可以拷貝/顯示目錄內容,以及拷貝檔案,並可選壓縮以及遞迴拷貝。 在常駐模式(daemon mode)下,rsync預設監聽TCP埠873,以原生rsync傳輸協定或者透過遠端shell如RSH或者SSH提供檔案。SSH模式下,rsync用戶端執行程式必須同時在本機和遠端機器上安裝。 rsync是以GNU通用公眾授權條款發行的自由軟體。 取自[維基](https://zh.wikipedia.org/wiki/Rsync) ### 運作方式 假設有兩台電腦A, B,也兩個相似的檔案sync.txt,在A中的sync.txt(以下以a做區分)比較晚修改要與B中的sync.txt(以下以b做區分) 假設我們此時由A呼叫rsync與B做同步 1. 此時B會針對要同步的b分割成S一系列不重疊的固定大小的區塊(Block), 區塊大小(Block size)的為 S bytes. 2. B會將這些Block,生成兩個checksum --`rolling checksum`跟`MD5 chenksum`。 3. 接著B會將這些checksum送給A 4. A會跟據這些checksum做比對,根據rolling的特性`一個bit一個bit`的做比對尋找相似的與不同的區塊,並將其紀錄最後送給B 5. B會根據A送來的資訊修改,將b同部成a :::info 實際上在同步過程中會產生`File List`事先過濾掉一些檔案 File List中可能包含pathname, ownership, mode, permissions, size and modtime ::: {%youtube X3Stha8pxXc?t=735%} ### rsync's 雜湊涵式 #### MD5 > MD5訊息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位元(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。MD5由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,於1992年公開,用以取代MD4演算法。這套演算法的程式在 RFC 1321 中被加以規範。 將資料(如一段文字)運算變為另一固定長度值,是雜湊演算法的基礎原理。 1996年後被證實存在弱點,可以被加以破解,對於需要高度安全性的資料,專家一般建議改用其他演算法,如SHA-2。2004年,證實MD5演算法無法防止碰撞(collision),因此不適用於安全性認證,如SSL公開金鑰認證或是數位簽章等用途。 取自[維基](https://zh.wikipedia.org/wiki/MD5) [SHA家族](https://zh.wikipedia.org/wiki/SHA%E5%AE%B6%E6%97%8F) 使用MD5演算法的原因主要是為了核對資料的一致性和安全性,避免在資料的傳輸過程中被有心人士參雜一些病毒。 :::warning MD5在近10年已經被發現會產生`碰撞(collision)`問題,也就是可以透過特殊演算法算出完全相同的雜湊值,卻是兩個完全不同的資料,可能造成你下載某些資料載下來卻造成電腦中毒。 ::: :::success #### 既然不安全,rsync為何還要使用MD5 rsync備份時檔案的傳輸,仍是基於SSH或其他安全傳輸協定,如果駭客能夠破解這部分,這種情況下rsync使用SHA或其他雜湊函式也難防.... 使用MD5最主要的原因是要確認檔案是否有損,比起其他雜湊`MD5`使用較少運算效能 參考:[Why does rsync still use MD5?](https://www.quora.com/Why-does-rsync-still-use-MD5) ::: 因為只要有修改一個字就會產生完全不同的結果 [**DIY**](http://practicalcryptography.com/hashes/) 如下圖: ![](https://i.imgur.com/poOp0d5.png) --- ![](https://i.imgur.com/cgTwzj7.png) 所以就需要rolling hash 來做資料的比對,找出不同的block,針對不同的地方做修改 #### Rolling hash(Rabin Karp Algorithm) ![image alt](http://3.bp.blogspot.com/-dSs6_8s4FCo/UwNvy6vGxmI/AAAAAAAAAU0/ScGvmMX2D_o/s1600/Match+Block.PNG) ![](https://i.imgur.com/l7el7nT.png) 參考: [關於 rsync algorithm 演算法](http://ijecorp.blogspot.com/2014/02/rsync-algorithm.html) [How Rsync Works](https://rsync.samba.org/how-rsync-works.html) [The rsync algorithm](https://rsync.samba.org/tech_report/) ### 使用說明 1. rsync基本語法: ``` rsync 參數 來源(source) 目的(distination) ``` 2. 常見的參數 - `-v`:verbose 模式,輸出比較詳細的訊息。 - `-r`:遞迴(recursive)備份所有子目錄下的目錄與檔案。 - `-a`:封裝備份模式,相當於 -rlptgoD,遞迴備份所有子目錄下的目錄與檔案,保留連結檔、檔案的擁有者、群組、權限以及時間戳記。 - `-z`:啟用壓縮。 - `-h`:將數字以比較容易閱讀的格式輸出。 - `-i`:可以顯示個別檔案變動數據 ##### 實作 :::success 此處以`sutdent`,`firewall`這兩個伺服器做測試 ::: * 本地資料夾 ![](https://i.imgur.com/4qjtSRU.png) ![](https://i.imgur.com/m640334.png) 新增資料夾後同步 ![](https://i.imgur.com/Mei7wng.png) 3. 遠端同步 預設支援ssh ``` rsync -avh source account@ip:/directory/ ``` ![](https://i.imgur.com/hD7WaBU.png) ![](https://i.imgur.com/YEx1lyo.png) 4. 顯示傳輸進度 若要讓rsync在傳輸檔案時顯示進度可以加上`--progress`參數 ![](https://i.imgur.com/YkWodjq.png) 5. 同步刪除檔案,若是想讓source中被刪掉的檔案也在distination中被刪除,則需要加上`delete`參數 ![](https://i.imgur.com/8neTMP5.png) ![](https://i.imgur.com/B8sEynH.png) 6. 測試rsync參數 如果不確定自己輸入的參數是否正確,可以用`--dry-run`來測試,執行後會輸出資訊,但是不會更動檔案 ![](https://i.imgur.com/1UH7X6s.png) ![](https://i.imgur.com/Oiy937Q.png) 參考:[Linux 使用 rsync 遠端檔案同步與備份工具教學與範例](https://blog.gtwang.org/linux/rsync-local-remote-file-synchronization-commands/amp/) ## 針對各種雲端硬碟的好工具 -- rclone rclone是一種由GO語言所開發的同步軟體,主要針對透過網路所連接的雲端硬碟,支援google drive, one drive, dropbox甚至是ftp都有支援 ### 初期設置 ```shell= $ rclone config No remotes found - make a new one n) New remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config n/r/c/s/q> n name> remote ##這個遠端你要設置的名稱 Type of storage to configure. Choose a number from below, or type in your own value 1 / Amazon Drive \ "amazon cloud drive" 2 / Amazon S3 (also Dreamhost, Ceph, Minio) \ "s3" 3 / Backblaze B2 \ "b2" 4 / Dropbox \ "dropbox" 5 / Encrypt/Decrypt a remote \ "crypt" 6 / FTP Connection \ "ftp" 7 / Google Cloud Storage (this is not Google Drive) \ "google cloud storage" 8 / Google Drive \ "drive" 9 / Hubic \ "hubic" 10 / Local Disk \ "local" 11 / Microsoft OneDrive \ "onedrive" 12 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH) \ "swift" 13 / SSH/SFTP Connection \ "sftp" 14 / Yandex Disk \ "yandex" Storage> drive ## 按照上面的列表,選你要的服務 ** See help for drive backend at: https://rclone.org/drive/ ** Google Application Client Id Setting your own is recommended. See https://rclone.org/drive/#making-your-own-client-id for how to create your own. If you leave this blank, it will use an internal key which is low performance. Enter a string value. Press Enter for the default (""). client_id>  #一般不需要特別設置 Google Application Client Secret Setting your own is recommended. Enter a string value. Press Enter for the default (""). client_secret> #一般不需要特別設置 Scope that rclone should use when requesting access from drive. Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value 1 / Full access all files, excluding Application Data Folder. \ "drive" 2 / Read-only access to file metadata and file contents. \ "drive.readonly" / Access to files created by rclone only. 3 | These are visible in the drive website. | File authorization is revoked when the user deauthorizes the app. \ "drive.file" / Allows read and write access to the Application Data folder. 4 | This is not visible in the drive website. \ "drive.appfolder" / Allows read-only access to file metadata but 5 | does not allow any access to read or download file content. \ "drive.metadata.readonly" scope> 1 #選擇你想要的模式 ID of the root folder Leave blank normally. Fill in to access "Computers" folders (see docs), or for rclone to use a non root folder as its starting point. Note that if this is blank, the first time rclone runs it will fill it in with the ID of the root folder. Enter a string value. Press Enter for the default (""). root_folder_id> Service Account Credentials JSON file path Leave blank normally. Needed only if you want use SA instead of interactive login. Enter a string value. Press Enter for the default (""). service_account_file> Edit advanced config? (y/n) y) Yes n) No (default) y/n> n #進階設定 Remote config Use auto config? * Say Y if not sure * Say N if you are working on a remote or headless machine y) Yes (default) n) No y/n> n #自動設定 Please go to the following link: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=202264815644.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&state=Vgi_Npuz2oCI5ufeAN7T4Q Log in and authorize rclone for access Enter verification code> 4/0gGO4BviAawWJg4i4W9YxvlYyXjWyn******************** ##根據網址進去之後認證完會給你一串認證碼 Configure this as a team drive? y) Yes n) No (default) y/n> n #設置團隊硬碟 -------------------- [SchGoogle] type = drive scope = drive token = {"access_token":******************************************************} -------------------- y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y #確認最後的狀態 Current remotes: Name Type ==== ==== FreeNAS http FreeNas webdav SchGoogle drive google drive e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> ``` ### 常用指令 例子 ``` rclone sync /dictory/source/ MyGoogleDrive:/Directory/distination/ ``` * rclone config - 設置rclone的config檔 * rclone copy A B - 將檔案從A複製到B * rclone sync A B - 將A處檔案同步到B,只會更新B處的檔案 * rclone move A B - 將A處檔案 同步到B處 * rclone delete - 删除指定路徑下的檔案内容 * rclone purge - 清空指定路径下所有文件數據 * rclone mkdir - 創建一个新目录 * rclone rmdir - 删除空目录 * rclone check A B - 檢查A與B的檔案是否 * rclone ls - 列出指定路徑下所有的文件以及文件大小和路徑(與linux不同的地方是會列出整個檔案樹,所有檔案都被被列出,謹慎使用) * rclone lsd - 列出指定路徑下所有的目錄 * rclone lsl - 列出指定路徑下所有文件以及修改时間、文件大小和路徑 * rclone md5sum - 為指定路徑下的所有文件產生一個md5sum文件 * rclone sha1sum - 為指定路徑下的所有文件產生一個sha1sum文件 * rclone size - 獲取指定路徑下,文件内容的總大小 * rclone version - 查看版本 * rclone cleanup - 清空remote * rclone dedupe - 交互式查找重複文件,進行删除/重新命名操作 ### 比較特別的功能是,他可以直接將雲端硬碟掛載在檔案系統之下 操作方式: ``` rclone mount remote:dectory where/you/wanto/mount/ --allow-non-empty --allow-other ``` 後面較常用的flag * --allow-non-empty: 允許掛載非空的資料夾 * --allow-other: 給予其他使用者權限 * --daemon: 在背景執行 * --cache-dir C:\Temp : 設定暫存目錄 * --vfs-cache-max-age : 檔案在cache中存活的時間 (預設 1h0m0s) * --vfs-cache-max-size SizeSuffix : cache最多占用系統多少空間(預設 off) 參考:[Rclone manual](https://rclone.org/docs/) [Rclone 遠程掛載](https://blog.gofinall.com/post/rclone%E8%BF%9C%E7%A8%8B%E6%8C%82%E8%BD%BD/) [Ubuntu 18.04 手动安装 rclone 并自动挂载 Google Drive](https://www.timelate.com/archives/install-rclone-on-ubuntu.html) ## 例行工作排程工具 -- Crontab crontab是一款基於時間的任務管理系統。使用者們可以通過crontab在固定時間、日期、間隔下設定例行性的工作排程。這項服務是預設安裝且啟動的。 ### 一般使用者的設定 :::info [root@study ~]# crontab [-u username] [-l|-e|-r] 選項與參數: -u :只有 root 才能進行這個任務,亦即幫其他使用者建立/移除 crontab 工作排程; -e :編輯 crontab 的工作內容 -l :查閱 crontab 的工作內容 -r :移除所有的 crontab 的工作內容,若僅要移除一項,請用 -e 去編輯。 範例一:用 dmtsai 的身份在每天的 12:00 發信給自己 [dmtsai@study ~]$ crontab -e #此時會進入 vi 的編輯畫面讓您編輯工作!注意到,每項工作都是一行。 0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc #分 時 日 月 週 |<============== 指令串 ========================>| ::: ![](https://i.imgur.com/PBqCMLL.png) 透過crontab -e 修改的內容將被存在 **/var/spool/cron/** 之中,並且以使用者進行分類。 ### crontab的使用者權限管理 * ubuntu系統預設所有人都可以使用crontab進行工作排程。 * 若要限制使用者使用,則可以透過新增cron.deny或cron.allow的方式達成。 * 預設是沒有這兩個檔案的。 :::info * /etc/cron.deny: 被記錄在此檔案中的帳號無法使用crontab,此外的所有使用者都可以使用。 若此檔案存在但為空檔案,則變成只有root使用者及cron.allow中的使用者才可使用。 * /etc/cron.allow: 被記錄在此檔案中的帳號才可使用crontab,此外的所有使用者都無法使用。 ::: ### 系統的例行性任務設定 除了透過 **crontab -e** 進行設定,也可以透過修改/etc/crontab來設定例行性工作。 ![](https://i.imgur.com/Mz7Cl9k.png) :::info * 和 **crontab -e** 不同的是,寫在 **/etc/crontab** 中的指令在五個數字後多了user的項目,用以指定要以什麼樣的身分執行後面的工作。 ::: 可以看到在 **/etc/crontab** 中有四項預設執行的工作,即每小時、每日、每周、每月執行對應目錄中的所有檔案,因此偷懶一點的方式也可以直接將要例行運作的工作丟到對應的 **/etc/cron.hourly/**, **/etc/cron.daily/**, **/etc/cron.weekly/**, **/etc/cron.monthly/** 目錄內。 :::info 注意放進這四個目錄中的檔案必須是可以直接執行的執行檔(shell script),並且檔名中不能有 **"."** 符號,否則將無法正常運行。 ::: ### 自行開發軟體的排程設定 當自行開發的軟體需要使用crontab時,可以將相關的設定寫在一個新的設定檔中並放在 **/etc/cron.d/** 目錄中,如此也能正常的運行。這樣做的好處是能與其他的設定分離避免混亂,並且容易更新及維護。 :::info 設定檔的內容基本上和 **/etc/crontab** 長得差不多,依樣畫葫蘆照抄過來就好(? <br> >#描述這個檔案在做什麼 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root \*jobs to do\* ... ::: ## 自動執行關機時未運行的排程 -- Anacron 有時候當cron的排程時間到了但系統處於關機狀態,這時排程的工作不會進行並且會被略過。若我們希望下次開機後可以補做被略過的工作則可以使用anacron。 Anacron實際上是一個需要被執行的程式而非在後台持續運行服務,因此需要在開機時被運行,或是利用cron的方式每隔一段時間呼叫它。 Anacron運行時,會檢查時間紀錄檔(timestamp),若當前的時間與時間紀錄相差超過設定的天數則會準備開始執行。 :::info [root@study ~]# anacron [-sfn] [job].. [root@study ~]# anacron -u [job].. 選項與參數: -s :開始一連續的執行各項工作 (job),會依據時間記錄檔的資料判斷是否進行; -f :強制進行,而不去判斷時間記錄檔的時間戳記; -n :立刻進行未進行的任務,而不延遲 (delay) 等待時間; -u :僅更新時間記錄檔的時間戳記,不進行任何工作。 -d :使anacron在前景執行,並且將顯示執行的資訊。 job :由 /etc/anacrontab 定義的各項工作名稱。 ::: 和crontab不同,沒辦法用指令修改設定檔,必須手動修改。 ### 設定檔: **/etc/anacrontab** ![](https://i.imgur.com/auEpxEY.png) :::info anacrontab的設定檔格式為: **[天數(天)] [延遲時間(分鐘)] [工作名稱定義] [實際要進行的指令串]** <br> * 天數:執行anacron時與時間戳記 (位於/var/spool/anacron/) 相差的天數,超過則會執行後續的指令,沒超過則不執行。 * 延遲時間:若確定要執行排程工作,會延遲這一段時間再執行,以免多個工作同時進行造成資源不足。 * 工作名稱定義:執行anacron時的工作名稱。 ::: **/etc/anacrontab** 中預設有三項工作,分別就是對應前面crontab的 **/etc/cron.daily/**, **/etc/cron.weekly/**, **/etc/cron.monthly/** 三個目錄,也就是說其實將執行檔放進這三個目錄中就已經有anacron的功能。 ## 備份與復原工具 Dump/Restore Dump是Unix或類Unix作業系統中的備份工具,Restore則是其相對應的還原工具。Dump能對整個檔案系統進行備份,並且能根據對備份的分級進行增量備份。 dump 命令可以支持 0~9 共 10 個備份級別。其中,0 級別指的就是完全備份,1~9 級別都是增量備份級別。 也就是說,當我們備份一份數據時,第一次備份應該使用 0 級別,會把所有數據完全備份一次;第二次備份就可以使用 1 級別了,它會和 0 級別進行比較,把 0 級別備份之後變化的數據進行備份;第三次備份使用 2 級別,2 級別會和 1 級別進行比較,把 1 級別備份之後變化的數據進行備份;以此類推。 需要注意的是,只有在備份整個分區或整塊硬盤時,才能支持 1~9 的增量備份級別;如果只是備份某個文件或不是分區的目錄,則只能使用 0 級別進行完全備份。 :::info [root@www ~]# dump [-Suvj] [-level] [-f 備份檔] 待備份資料 [root@www ~]# dump -W 選項與參數: -S :僅列出後面的待備份資料需要多少磁碟空間才能夠備份完畢; -u :將這次 dump 的時間記錄到 /etc/dumpdates 檔案中; -v :將 dump 的檔案過程顯示出來; -j :加入 bzip2 的支援!將資料進行壓縮,預設 bzip2 壓縮等級為 2 -level:就是我們談到的等級,從 -0 ~ -9 共十個等級; -f :有點類似 tar 啦!後面接產生的檔案,亦可接例如 /dev/st0 裝置檔名等 -W :列出在 /etc/fstab 裡面的具有 dump 設定的 partition 是否有備份過? ::: ### Dump範例 1. 安裝dump(預設未安裝) ``` sudo apt install dump ``` 2. 查看硬碟的分割區 ``` df -h #查看硬碟使用狀況 ``` ![](https://i.imgur.com/2bNmM7p.png) 3. 選擇一個分區進行備份(level 0) >使用vm的狀況,通常會只有一個分割區(根目錄),在此為了demo方便可以新增一個硬碟: >3.1. vm新增一個硬碟 >3.2. 用fdick分割硬碟 ``` fdisk /dev/sdb n p (default) (default) (default) w ``` >3.3. mkfs格式化硬碟 ``` mkfs -t ext4 /dev/sdb ``` >3.4. 掛載硬碟 ``` mount /dev/sdb/ [掛載位置] ``` [替 Linux 新增硬碟(磁碟分割、格式化與掛載)](https://blog.gtwang.org/linux/linux-add-format-mount-harddisk/) ``` dump -Ouj -f [備份後的備份檔名稱] [要備份的目錄(掛載點)] ``` ![](https://i.imgur.com/kfZKeeg.png) 4. 在已備份的分割區新增檔案,然後進行增量備份(level 1) ``` dump -1uj -f [備份後的備份檔名稱] [要備份的目錄(掛載點)] ``` ![](https://i.imgur.com/KSKWctq.png) 5. 檢查產生的檔案 ![](https://i.imgur.com/lvU4Zm2.png) 可以看到第二次dump的大小(14K)大大少於第一次完整備份的大小(40K),由此可見第二次dump時僅對有所差異的部分進行增量備份。 ### Restore restore 命令常用的模式有4種,這4種模式不能混用: :::info **[root@www ~]# restore -t [-f dumpfile] [-h]** #用來察看 dump 檔 **[root@www ~]# restore -C [-f dumpfile] [-D 掛載點]** #比較dump與實際檔案 **[root@www ~]# restore -i [-f dumpfile]** #進入互動模式 **[root@www ~]# restore -r [-f dumpfile]** #還原整個檔案系統 選項與參數: * -t:查看模式,用於查看備份文件中擁有哪些數據,類似tar -t 功能; * -C:比較模式,列出dump檔案中有紀錄的,與目前檔案系統不同的檔案; * -i:互動模式,可以僅還原部分檔案,用在 dump 目錄時的還原; * -r:還原模式,用在從dump備份檔案中還原。 其他較常用到的選項功能: * -h:察看完整備份資料中的 inode 與檔案系統 label 等資訊; * -f:你指定的 dump 檔案; * -D:與 -C 進行搭配,可以查出後面接的掛載點與 dump 內有不同的檔案。 ::: ### Restore範例 1. 以查看模式查看備份文件中的資料 ``` restore -r -f [備份檔名稱] ``` ![](https://i.imgur.com/t7kVR8Y.png) 2. 修改已備份分割區的檔案,再以比較模式列出 ``` restore -C -f [備份檔名稱] ``` ![](https://i.imgur.com/u8tINdS.png) ![](https://i.imgur.com/P1tTe2x.png) 3. 以備份的檔案還原 ``` cd [要還原(解壓縮)的目錄] restore -r -f [備份檔名稱] ``` 有多個增量備份檔的話要從level 0 開始逐一進行還原。 ![](https://i.imgur.com/e2GoGsl.png) :::info 執行restore -r 還原之後系統會產生一個名為**restoresymtable** 的檔案,這是用來紀錄不同增量備份之間的連結關係,在完整完成還原後應刪除以免影響下一次的還原工作。 :::

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully