publiek:ltfs_en_tape
Verschillen
Dit geeft de verschillen weer tussen de geselecteerde revisie en de huidige revisie van de pagina.
| Beide kanten vorige revisieVorige revisieVolgende revisie | Vorige revisie | ||
| publiek:ltfs_en_tape [2025/11/24 20:45] – admin | publiek:ltfs_en_tape [2026/01/02 10:38] (huidige) – admin | ||
|---|---|---|---|
| Regel 1: | Regel 1: | ||
| ======LTFS en Tape====== | ======LTFS en Tape====== | ||
| + | |||
| + | =====Hardware===== | ||
| + | Als eerste kun je controleren of de PCI-kaart geïnstalleerd is. Dat doe je met het volgende commando: | ||
| + | < | ||
| + | lspci | ||
| + | </ | ||
| + | Daar kun je iets zien van bijv. Fibre Channel ... | ||
| + | |||
| + | Met het volgende commando kun je zien welke devices er zijn. Dit kunnen bijvoorbeeld harddisks, maar ook de tapestreamers zijn: | ||
| + | < | ||
| + | lsscsi -g | ||
| + | </ | ||
| + | |||
| + | Je ziet hier in de laatste twee kolommen zowel een stx en sgx. Dit zijn twee interfaces naar dezelfde hardware. | ||
| + | - STx = tape-interfacae : data/ | ||
| + | - SGx = direct SCSI : Status/ | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | Je kunt sgY niet simpelweg “omrekenen” naar stX op basis van nummers; die tellers lopen onafhankelijk. De koppeling maak je via hetzelfde SCSI-adres (zoals ik eerder liet zien met sysfs/ | ||
| + | |||
| =====Tapedrive====== | =====Tapedrive====== | ||
| Regel 18: | Regel 38: | ||
| Wanneer het lang geleden is dat een tape gereinigd is, kun je een cleaning-tape laden. Dan wordt de drive automatisch gereinigd. | Wanneer het lang geleden is dat een tape gereinigd is, kun je een cleaning-tape laden. Dan wordt de drive automatisch gereinigd. | ||
| + | |||
| + | Als je benieuwd bent hoe oud een tape is, dan kun je dat uitlezen met: | ||
| + | < | ||
| + | ./ | ||
| + | </ | ||
| + | |||
| + | Vrije ruimte kun je zien met: | ||
| + | < | ||
| + | df -h /mnt/ltfs | ||
| + | </ | ||
| ---- | ---- | ||
| Regel 39: | Regel 69: | ||
| < | < | ||
| ./ | ./ | ||
| + | </ | ||
| + | |||
| + | ====Doorlopen van de tape==== | ||
| + | ===Terugspoelen naar begin van de tape=== | ||
| + | < | ||
| + | mt -f /dev/nst0 rewind | ||
| + | </ | ||
| + | |||
| + | ===Tonen welke tar op die plek staat=== | ||
| + | < | ||
| + | tar -tvf /dev/nst0 | ||
| + | </ | ||
| + | |||
| + | ===Naar volgende en vorige set=== | ||
| + | < | ||
| + | mt -f /dev/nst0 fsf 1 | ||
| + | </ | ||
| + | < | ||
| + | mt -f /dev/nst0 bsfm 1 | ||
| + | </ | ||
| + | Daarna weer tonen. | ||
| + | |||
| + | ====Naar einde==== | ||
| + | Met dit commando kun je naar het einde van de tape schrijven: | ||
| + | < | ||
| + | mt -f /dev/nst0 eod | ||
| </ | </ | ||
| Regel 60: | Regel 116: | ||
| </ | </ | ||
| - | =====Tape terugspoelen===== | + | ====Tape terugspoelen==== |
| Terugspoelen kan handmatig door het volgende commando | Terugspoelen kan handmatig door het volgende commando | ||
| < | < | ||
| Regel 107: | Regel 163: | ||
| </ | </ | ||
| - | =====Handige kopieeropdrachten===== | + | Daarna moet je de tape offline halen: |
| + | < | ||
| + | sudo mt -f /dev/nst0 offline | ||
| + | </ | ||
| + | |||
| + | Dan kun je controleren of de tape ' | ||
| + | < | ||
| + | sudo mt -f /dev/nst0 status | ||
| + | </ | ||
| + | |||
| + | =====Handige kopieeropdrachten | ||
| Als je wilt zien hoe het kopiëren gaat dan kun je pv gebruiken. Eerst installeren: | Als je wilt zien hoe het kopiëren gaat dan kun je pv gebruiken. Eerst installeren: | ||
| < | < | ||
| Regel 119: | Regel 185: | ||
| Daarbij wordt de tool gestart met de grootte waardoor je kunt zien hoe lang het gaat duren. | Daarbij wordt de tool gestart met de grootte waardoor je kunt zien hoe lang het gaat duren. | ||
| + | Dit commando heb ik in een copy.sh gezet waarmee ik niet alle informatie hoef te kennen. De broncode staat beneden. | ||
| + | Je kunt met één commando ook van alle subfolders in een map een losse zip-file maken. Dat gaat als volgt: | ||
| + | < | ||
| + | mkdir -p zips && for d in */; do zip -rv " | ||
| + | mkdir -p zips && for d in */; do [[ " | ||
| + | </ | ||
| ---- | ---- | ||
| + | |||
| + | =====Tapeloader===== | ||
| + | Je kunt de tapeloader uitlezen met het volgende commando : | ||
| + | < | ||
| + | sudo mtx -f /dev/sch0 status | ||
| + | </ | ||
| + | |||
| =====Broncodes===== | =====Broncodes===== | ||
| - | ===list_size.sh=== | + | ====list_size.sh==== |
| < | < | ||
| sudo sg_logs -p 0x31 /dev/sg3 \ | sudo sg_logs -p 0x31 /dev/sg3 \ | ||
| Regel 137: | Regel 216: | ||
| </ | </ | ||
| - | ===list_all_sets.sh=== | + | ====list_all_sets.sh==== |
| < | < | ||
| # | # | ||
| Regel 163: | Regel 242: | ||
| </ | </ | ||
| - | ===testdrive.sh=== | + | ====testdrive.sh==== |
| < | < | ||
| # | # | ||
| Regel 326: | Regel 405: | ||
| </ | </ | ||
| - | ===tapeinfo.sh=== | + | ====tapeinfo.sh==== |
| < | < | ||
| # | # | ||
| Regel 424: | Regel 503: | ||
| main " | main " | ||
| + | </ | ||
| + | |||
| + | ====Copy.sh==== | ||
| + | < | ||
| + | # | ||
| + | set -euo pipefail | ||
| + | |||
| + | echo "=== PV copy tool (1 bestand) ===" | ||
| + | echo | ||
| + | |||
| + | have_cmd() { command -v " | ||
| + | |||
| + | # ---------------------------- | ||
| + | # Source file picker (fzf) | ||
| + | # ---------------------------- | ||
| + | select_src_file() { | ||
| + | local start_dir=" | ||
| + | |||
| + | if have_cmd fzf; then | ||
| + | # Alleen files, vanaf start_dir | ||
| + | find " | ||
| + | | fzf --prompt=" | ||
| + | else | ||
| + | local src | ||
| + | read -r -e -p " | ||
| + | printf " | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # ---------------------------- | ||
| + | # Destination directory picker (ONLY dirs, 1 level per keer) | ||
| + | # - browse level-by-level | ||
| + | # - choose parent | ||
| + | # - choose current dir | ||
| + | # ---------------------------- | ||
| + | pick_dir_level_by_level() { | ||
| + | local cur=" | ||
| + | |||
| + | # Normaliseer pad (resolve symlinks, etc.) | ||
| + | cur=" | ||
| + | |||
| + | while true; do | ||
| + | local parent choice | ||
| + | parent=" | ||
| + | |||
| + | if have_cmd fzf; then | ||
| + | choice=" | ||
| + | { | ||
| + | echo "[..] (parent: $parent)" | ||
| + | echo " | ||
| + | # Alleen subdirectories, | ||
| + | find " | ||
| + | } | fzf --prompt=" | ||
| + | )" || return 1 | ||
| + | else | ||
| + | local dst | ||
| + | read -r -e -p " | ||
| + | printf " | ||
| + | return 0 | ||
| + | fi | ||
| + | |||
| + | case " | ||
| + | " | ||
| + | cur=" | ||
| + | ;; | ||
| + | " | ||
| + | printf " | ||
| + | return 0 | ||
| + | ;; | ||
| + | */) | ||
| + | local sub=" | ||
| + | cur=" | ||
| + | ;; | ||
| + | *) | ||
| + | ;; | ||
| + | esac | ||
| + | done | ||
| + | } | ||
| + | |||
| + | # ---------------------------- | ||
| + | # Mount helpers | ||
| + | # ---------------------------- | ||
| + | mountpoint_for_path() { | ||
| + | # print het mountpoint (TARGET) voor een pad | ||
| + | findmnt -no TARGET --target " | ||
| + | } | ||
| + | |||
| + | mount_opts_for_mountpoint() { | ||
| + | # print mount options voor mountpoint | ||
| + | findmnt -no OPTIONS " | ||
| + | } | ||
| + | |||
| + | is_mount_ro() { | ||
| + | local mp=" | ||
| + | [[ -n " | ||
| + | mount_opts_for_mountpoint " | ||
| + | } | ||
| + | |||
| + | fstype_for_path() { | ||
| + | findmnt -no FSTYPE --target " | ||
| + | } | ||
| + | |||
| + | avail_bytes_on_mount() { | ||
| + | local path=" | ||
| + | df -B1 --output=avail " | ||
| + | } | ||
| + | |||
| + | human_bytes() { | ||
| + | # simpele humanizer (B, KiB, MiB, GiB, TiB) | ||
| + | local b=" | ||
| + | local -a units=(" | ||
| + | local u=0 | ||
| + | local v=" | ||
| + | while [[ " | ||
| + | v=$((v/ | ||
| + | u=$((u+1)) | ||
| + | done | ||
| + | printf "%s %s" " | ||
| + | } | ||
| + | |||
| + | is_ltfs_path() { | ||
| + | # Detecteer LTFS op basis van fstype of pad | ||
| + | local fstype | ||
| + | fstype=" | ||
| + | [[ " | ||
| + | [[ " | ||
| + | return 1 | ||
| + | } | ||
| + | |||
| + | # ---------------------------- | ||
| + | # 1) Bron selecteren | ||
| + | # ---------------------------- | ||
| + | SRC=" | ||
| + | |||
| + | if [[ -z " | ||
| + | echo "Geen bron opgegeven, exit." >&2 | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | if [[ ! -f " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # ---------------------------- | ||
| + | # 2) Doelfolder selecteren (1 level per keer) | ||
| + | # ---------------------------- | ||
| + | DST_DIR=" | ||
| + | |||
| + | if [[ -z " | ||
| + | echo "Geen doelfolder opgegeven, exit." >&2 | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | mkdir -p " | ||
| + | |||
| + | DST_MOUNT=" | ||
| + | DST_FSTYPE=" | ||
| + | |||
| + | # Safety 1: stop direct als het destination filesystem read-only is | ||
| + | if [[ -n " | ||
| + | echo | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo | ||
| + | echo "Dit gebeurt vaak bij LTFS als de data-partitie geen ruimte meer heeft om een nieuwe index te schrijven." | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # ---------------------------- | ||
| + | # 3) Doelbestandsnaam | ||
| + | # ---------------------------- | ||
| + | DEFAULT_NAME=" | ||
| + | read -r -e -p " | ||
| + | DST_NAME=" | ||
| + | |||
| + | DST=" | ||
| + | |||
| + | # ---------------------------- | ||
| + | # 4) Overschrijf-check | ||
| + | # ---------------------------- | ||
| + | if [[ -e " | ||
| + | echo | ||
| + | echo " | ||
| + | read -r -p " | ||
| + | case " | ||
| + | y|Y|yes|YES) echo "Oké, ik overschrijf het bestand." | ||
| + | *) echo " | ||
| + | esac | ||
| + | fi | ||
| + | |||
| + | # ---------------------------- | ||
| + | # 5) Space-check vooraf | ||
| + | # ---------------------------- | ||
| + | SRC_SIZE=" | ||
| + | AVAIL=" | ||
| + | |||
| + | # MARGES: | ||
| + | # - Op normale FS is 1GiB genoeg. | ||
| + | # - Op LTFS: neem liever groter, omdat index writes ruimte nodig hebben. | ||
| + | if is_ltfs_path " | ||
| + | SAFETY_MARGIN=$((10*1024*1024*1024)) | ||
| + | else | ||
| + | SAFETY_MARGIN=$((1*1024*1024*1024)) | ||
| + | fi | ||
| + | |||
| + | NEEDED=$((SRC_SIZE + SAFETY_MARGIN)) | ||
| + | |||
| + | if [[ " | ||
| + | echo | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo | ||
| + | if is_ltfs_path " | ||
| + | echo " | ||
| + | echo "Kies een nieuwe tape/volume of laat meer vrije ruimte over." | ||
| + | fi | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # ---------------------------- | ||
| + | # 6) Kopiëren met pv (veilig: eerst temp, dan mv) | ||
| + | # ---------------------------- | ||
| + | echo | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo | ||
| + | |||
| + | TMP_DST=" | ||
| + | |||
| + | cleanup() { | ||
| + | # Ruim partial op als we falen/ | ||
| + | # (Als destination read-only werd vlak voor mv, laten we hem soms bewust staan) | ||
| + | if [[ -e " | ||
| + | rm -f " | ||
| + | fi | ||
| + | } | ||
| + | trap cleanup EXIT INT TERM | ||
| + | |||
| + | # Copy | ||
| + | pv -s " | ||
| + | sync | ||
| + | |||
| + | # Safety 2: vlak vóór final mv opnieuw RO checken (LTFS kan intussen ro worden) | ||
| + | DST_MOUNT2=" | ||
| + | if [[ -n " | ||
| + | echo | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo | ||
| + | echo "Je kunt het partial bestand handmatig verwijderen of naar een andere locatie kopiëren." | ||
| + | trap - EXIT INT TERM | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Rename to final | ||
| + | mv -f " | ||
| + | trap - EXIT INT TERM | ||
| + | |||
| + | echo | ||
| + | echo " | ||
| + | ls -lh " | ||
| + | |||
| + | </ | ||
| + | |||
| + | ====tape-age.sh==== | ||
| + | < | ||
| + | for id in 0x0400 0x0401 0x0406 0x0806 0x0803 0x0003 0x0222 0x0223 0x0220 0x0221; do | ||
| + | sudo sg_read_attr -f $id /dev/sg4 | ||
| + | done | ||
| </ | </ | ||
publiek/ltfs_en_tape.1764013557.txt.gz · Laatst gewijzigd: door admin
