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/23 20:10] – 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 53: | Regel 109: | ||
| Anders worden het losse sets. | Anders worden het losse sets. | ||
| + | |||
| + | ====Tape afsluiten==== | ||
| + | Je kunt aan het einde van de tape een EOF schrijven: | ||
| + | < | ||
| + | sudo mt -f /dev/nst0 weof 1 | ||
| + | </ | ||
| + | |||
| + | ====Tape terugspoelen==== | ||
| + | Terugspoelen kan handmatig door het volgende commando | ||
| + | < | ||
| + | sudo mt -f /dev/nst0 rewind | ||
| + | </ | ||
| ====Data teruglezen==== | ====Data teruglezen==== | ||
| Regel 62: | Regel 130: | ||
| ---- | ---- | ||
| + | |||
| + | =====LTFS===== | ||
| + | Een tape als LTFS gebruiken kan. Dan moet je wel een aantal dingen doen. Hiervoor heb je de volgende commando' | ||
| + | |||
| + | Dit kun je controleren met: | ||
| + | < | ||
| + | which ltfs mkltfs ltfsck | ||
| + | </ | ||
| + | |||
| + | ====LTFS Tape formatteren==== | ||
| + | De tape wordt geformatteerd met het volgende commando: | ||
| + | < | ||
| + | sudo mkltfs -d /dev/sg3 | ||
| + | </ | ||
| + | Zet er -f achter als je zeker weet dat je alles weg wilt gooien. | ||
| + | |||
| + | Vervolgens kun je een volumenaam aangeven: | ||
| + | < | ||
| + | sudo mkltfs -d /dev/sg3 -n " | ||
| + | </ | ||
| + | |||
| + | ====Tape mounten==== | ||
| + | Vervolgens kun je de tape mounten met het volgende commando: | ||
| + | < | ||
| + | ltfs -o devname=/ | ||
| + | </ | ||
| + | |||
| + | ====Tape unmounten==== | ||
| + | Aan het einde moet je altijd de tape unmounten. Dat gaat met het volgende commando: | ||
| + | < | ||
| + | sudo umount /mnt/ltfs | ||
| + | </ | ||
| + | |||
| + | 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 enzo===== | ||
| + | Als je wilt zien hoe het kopiëren gaat dan kun je pv gebruiken. Eerst installeren: | ||
| + | < | ||
| + | sudo dnf install pv | ||
| + | </ | ||
| + | |||
| + | Daarna kun je het volgende commando gebruiken om iets te kopiëren: | ||
| + | < | ||
| + | pv -s " | ||
| + | </ | ||
| + | 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 77: | Regel 216: | ||
| </ | </ | ||
| - | ===list_all_sets.sh=== | + | ====list_all_sets.sh==== |
| < | < | ||
| # | # | ||
| Regel 103: | Regel 242: | ||
| </ | </ | ||
| - | ===testdrive.sh=== | + | ====testdrive.sh==== |
| < | < | ||
| # | # | ||
| Regel 264: | Regel 403: | ||
| main " | main " | ||
| + | </ | ||
| + | |||
| + | ====tapeinfo.sh==== | ||
| + | < | ||
| + | # | ||
| + | set -euo pipefail | ||
| + | |||
| + | # Toon hoe vol een LTO-tape is via SCSI Tape Capacity page (0x31). | ||
| + | # Vereist: mt, sg_logs, awk (gawk), grep | ||
| + | # | ||
| + | # Gebruik: | ||
| + | # sudo ./ | ||
| + | # sudo ./ | ||
| + | # | ||
| + | # Devices kun je overrulen via env: | ||
| + | # sudo TAPE_DEV=/ | ||
| + | |||
| + | TAPE_DEV=" | ||
| + | SCSI_DEV=" | ||
| + | DO_EOD=1 | ||
| + | |||
| + | if [[ " | ||
| + | DO_EOD=0 | ||
| + | fi | ||
| + | |||
| + | log() { echo -e "\n== $* =="; } | ||
| + | |||
| + | need_root() { | ||
| + | if [[ $EUID -ne 0 ]]; then | ||
| + | echo "Run dit script met sudo/ | ||
| + | exit 1 | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | check_cmds() { | ||
| + | for c in mt sg_logs awk grep; do | ||
| + | if ! command -v " | ||
| + | echo "Mist commando: $c" | ||
| + | exit 1 | ||
| + | fi | ||
| + | done | ||
| + | } | ||
| + | |||
| + | show_status() { | ||
| + | mt -f " | ||
| + | } | ||
| + | |||
| + | to_eod() { | ||
| + | if [[ $DO_EOD -eq 1 ]]; then | ||
| + | log " | ||
| + | mt -f " | ||
| + | else | ||
| + | log "EOD overslaan (--no-eod)" | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | read_capacity() { | ||
| + | sg_logs --page=0x31 " | ||
| + | } | ||
| + | |||
| + | main() { | ||
| + | need_root | ||
| + | check_cmds | ||
| + | |||
| + | log " | ||
| + | show_status | ||
| + | |||
| + | to_eod | ||
| + | |||
| + | log "Tape Capacity log page (0x31)" | ||
| + | page=" | ||
| + | |||
| + | rem=$(echo " | ||
| + | max=$(echo " | ||
| + | |||
| + | if [[ -z " | ||
| + | echo "Kon geen geldige capaciteit uitlezen." | ||
| + | echo "Zorg dat er een tape ONLINE is en probeer opnieuw." | ||
| + | exit 2 | ||
| + | fi | ||
| + | |||
| + | used=$(( max - rem )) | ||
| + | |||
| + | pct_used=$(awk -v u=" | ||
| + | pct_free=$(awk -v r=" | ||
| + | |||
| + | used_gib=$(awk -v u=" | ||
| + | rem_gib=$(awk -v r=" | ||
| + | max_gib=$(awk -v m=" | ||
| + | |||
| + | log "Tape capaciteitsrapport" | ||
| + | echo "Tape device : $TAPE_DEV" | ||
| + | echo "SCSI device : $SCSI_DEV" | ||
| + | echo | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | } | ||
| + | |||
| + | 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.1763925017.txt.gz · Laatst gewijzigd: door admin
