LINUX.ORG.RU

Восстановление системы

 


0

1

Всем доброго времени суток, дело вот в чем: Решил расширить корень системы смонтированный на /dev/sdb3, свободное пространство находилось «выше» нужного диска и с помощью gparted добавить его не получалось Загрузился с загрузочной флешки, используя утилиту fdisk удалил раздел, создал новый, место действительно увеличилось, но после проделанных махинаций система перестала загружаться, Биос ее просто не видит (только Винду) Загрузился с флешки снова, попробовал примонтировать раздел, получил ошибку:

mount /dev/sdb fsconfig system call failed can`t find a SQUASHFS

Почитал в интернете что с этим делать, нашел команду fsck -f -p /dev/sdb4 (Да, диск теперь почему то sdb4, а не sdb3, в fdisk вводил цифру 3, не знаю как это получилось) Вот её результат:

[code] if she device is valid and it really contains an ext2/ext3/ext4 filesystem (and not swap or ufs or something else), then the superblock is corrupt and you might try running e2fcsck with an alternate superblock: e2fsck -b 8193 or e2fsck -b 32768 [/code]

Погуглил это, в инете пишут что такое бывает когда не создана файловая система, но cfdisk отображает для этого диска ФС linux file system Насколько я понимаю команда mkfs затрет все данные, возможно ли этого не делать (если данные в корне ещё сохранились конечно)? Данных ещё не так много накопилось и большая часть в /home, который наверняка абсолютно цел, но все же

ОС linux arch



Последнее исправление: watain732 (всего исправлений: 2)

используя утилиту fdisk удалил раздел, создал новый, место действительно увеличилось, но после проделанных махинаций система перестала загружаться

Так и должно быть.

Данных ещё не так много накопилось

Проще будет переустановить систему на новый раздел, инсталлятор с диском сам все сделает как надо.

foxy_ant ★★
()
Последнее исправление: foxy_ant (всего исправлений: 1)

возможно ли этого не делать (если данные в корне ещё сохранились конечно)?

Предупреждение: Если Вам важны хранимые на накопителе данные, то перед проведением всех манипуляций снимите резервную копию со всего накопителя, так как в противном случае Вы можете по незнанию, или невнимательности окончательно затереть данные.

Если Вы помните адреса логических секторов, по которым начинался и заканчивался раздел, то, с помощью fdisk, удалите тот раздел, который создали, а затем создайте новый раздел, по логическим адресам изначального. В процессе создания раздела, fdisk может предложить Вам удалить сигнатуру обнаруженной файловой системы - откажитесь от этого. За исключением того случая, когда пользователь принимает предложение о затирании сигнатуры файловой системы, операции, проводимые fdisk, не затрагивают данные на самих разделах, а манипулируют лишь таблицей разделов. Поэтому, если Вы своими действиями ещё не повредили фс, Ваши данные должны быть в порядке.

QsUPt7S ★★
()
Последнее исправление: QsUPt7S (всего исправлений: 3)
Ответ на: комментарий от QsUPt7S

насколько я понимаю логические сектора это LVM (поправьте если ошибаюсь) и у меня их нет, поэтому добавление свободного пространства и происходит с такими траблами, в любом случае я не помню где начинался раздел и где он заканчивался

watain732
() автор топика
Ответ на: комментарий от foxy_ant

почему так и должно быть? должны же быть нормальные способы добавления свободного места к диску Я в будущем возможно захочу опять отрезать «кусочек» от винды и пришить его к линуксу, а может и полностью уйти на линукс, мне же не переустанавливать систему каждый раз с нуля?

watain732
() автор топика
Ответ на: комментарий от watain732

насколько я понимаю логические сектора это LVM (поправьте если ошибаюсь)

LVM - Logical Volume Manager: система создания и управления «логическими томами». В вашем случае, к разговору не относится.

Я же говорил о LBA - Logical Block Address: адреса логических секторов на накопителе. Всё пространство накопителя делится на сектора. Физический сектор - минимальный участок данных, который может прочитать, или записать железо накопителя (на самом деле всё намного сложнее, но к текущей теме это не относится). Логический сектор - минимальный участок данных, который прошивка накопителя позволяет прочитать, или записать подсистеме блочных устройств. У большинства современных накопителей размер «физического» сектора, равен 4096 байт, а размер логического сектора - 512 байт. Конкретно для Вашего накопителя, Вы можете узнать эти размеры выполнив команду fdisk --list <путь_к_накопителю>. Например fdisk --list /dev/sdb.

в любом случае я не помню где начинался раздел и где он заканчивался

Вы можете попытаться вычислить это, если помните размер «присоединённой» части. Если Вы «присоединили» к изначальному разделу лишь пространство располагавшееся до его начала, а конец раздела не перемещали, то конец нового раздела, вероятно, совпадает с концом изначального. А где находилось начало старого раздела, можно выяснить, если к адресу начала нового раздела, прибавить размер присоединённой области, выраженный в логических секторах.

QsUPt7S ★★
()
Последнее исправление: QsUPt7S (всего исправлений: 1)
Ответ на: комментарий от watain732

Надо было переместить раздел, после чего свободное место будет уже в конце, а не в начале. А потом уже расширять. Вот, читай: https://gparted.org/display-doc.php%3Fname%3Dmoving-space-between-partitions

rupert ★★★★★
()
Ответ на: комментарий от watain732

Попробуй его отыскать на диске:

import os
import struct
import argparse

# Размер сектора в байтах (обычно 512 байт)
SECTOR_SIZE = 512

# Сигнатура EXT4 файловой системы
EXT4_SIGNATURE = b'\x53\xEF'

def find_ext4(device_path):
    try:
        # Открываем устройство для чтения
        with open(device_path, 'rb') as device:
            sector_offset = 0
            while sector_data := device.read(SECTOR_SIZE):
                if sector_data.startswith(EXT4_SIGNATURE):
                    print(f"Найдено что-то похожее на EXT4 раздел на смещении {sector_offset} секторов.")

                # Переходим к следующему сектору
                sector_offset += 1
    except Exception as e:
        print(f"Ошибка: {e}")

if __name__ == "__main__":
    # Создаем парсер аргументов
    parser = argparse.ArgumentParser(description="Поиск всех вхождений сигнатуры EXT4 на устройстве.")
    parser.add_argument('device', type=str, help="Путь к устройству (например, /dev/sda)")
    args = parser.parse_args()

    find_ext4(args.device)

Обзови как-нибудь скрипт и запусти от рута

rtxtxtrx ★★
()
Ответ на: комментарий от rtxtxtrx

https://gist.github.com/bmaupin/a9d29f5fdc831d1d0164

Можно и башем, но питон универсальнее. После сигнатуры должно следовать что-то еще чтобы отделить всякий мусор которого будет очень много…

Это универсальнее:

#!/usr/bin/env python
import argparse
import itertools
import sys

# Sector size in bytes (usually 512 bytes)
SECTOR_SIZE = 512

# File system signatures
FILE_SYSTEM_SIGNATURES = {
    b"\x53\xef": "EXT 2/3/4",
    b"\x58\x46\x53\x42": "Btrfs",
    b"\xfd\x37\x7a\x58\x5a\x00": "ZFS",
    b"\xeb\x3c\x90\x28": "FAT",
    b"\xeb\x52\x90\x4e": "NTFS",
}


def find_partitions(device_path):
    try:
        # Open the device for reading
        with open(device_path, "rb") as device:
            for sector_offset in itertools.count():
                # Read one sector
                sector_data = device.read(SECTOR_SIZE)
                if not sector_data:
                    break

                # Check if the sector starts with any file system signature
                for signature, fs_name in FILE_SYSTEM_SIGNATURES.items():
                    if sector_data.startswith(signature):
                        print(
                            f"Found {fs_name} partition at sector offset {sector_offset}."
                        )

    except Exception as e:
        print(f"Error: {e}")


if __name__ == "__main__":
    # Create argument parser
    parser = argparse.ArgumentParser(
        description="Search for all occurrences of file system signatures on a device."
    )
    parser.add_argument(
        "device", type=str, help="Path to the device (e.g., /dev/sda)"
    )
    args = parser.parse_args()

    find_partitions(args.device)

Но все равно мусора много:

~/workspace/hacking   
(.venv) ❯ sudo ./find_partitions.py /dev/nvme0n1 
[sudo] password for sergey: 
Found EXT 2/3/4 partition at sector offset 236473.
Found EXT 2/3/4 partition at sector offset 239202.
Found EXT 2/3/4 partition at sector offset 279914.
Found EXT 2/3/4 partition at sector offset 418210.
Found EXT 2/3/4 partition at sector offset 643127.
Found EXT 2/3/4 partition at sector offset 667738.
Found EXT 2/3/4 partition at sector offset 741463.
Found EXT 2/3/4 partition at sector offset 873696.
Found EXT 2/3/4 partition at sector offset 890699.
Found EXT 2/3/4 partition at sector offset 918743.
Found EXT 2/3/4 partition at sector offset 984277.
Found EXT 2/3/4 partition at sector offset 988258.
Found EXT 2/3/4 partition at sector offset 1077737.

Так сложно что-то найти, нужно еще структуру учитывать…

FILE_SYSTEM_SIGNATURES = {
    # b"\x53\xef": "EXT 2/3/4",
    b"\x58\x46\x53\x42": "Btrfs",
    b"\xfd\x37\x7a\x58\x5a\x00": "ZFS",
    b"\xeb\x3c\x90\x28": "FAT",
    b"\xeb\x52\x90\x4e": "NTFS",
    b"LUKS": "LUKS",
}

С LUKS уже ложных срабатываний нет… Нужно хотя бы 4 байта сигнатура чтобы мусор отсеять

sudo ./find_partitions.py /dev/nvme0n1
Found LUKS partition at sector offset 2048.
rtxtxtrx ★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 2)

Почему-то растоманская версия ненамного быстрее питона…

// rustc findfs.rs -o findfs
// sudo ./findfs /dev/nvme0n1

use std::env;
use std::fs::File;
use std::io::{self, Write, Read};

// Размер сектора в байтах (обычно 512 байт)
const DEFAULT_SECTOR_SIZE: usize = 512;

// Сигнатуры файловых систем
const FILE_SYSTEM_SIGNATURES: [(&[u8], &str); 6] = [
    (b"\x53\xEF", "EXT 2/3/4"),
    (b"\x58\x46\x53\x42", "Btrfs"),
    (b"\xfd\x37\x7a\x58\x5a\x00", "ZFS"),
    (b"\xeb\x3c\x90\x28", "FAT"),
    (b"\xeb\x52\x90\x4e", "NTFS"),
    (b"LUKS", "LUKS"),  // LUKS signature
];

fn find_filesystems(device_path: &str, sector_size: usize) -> io::Result<()> {
    let mut file = File::open(device_path)?;
    let mut buffer = vec![0; sector_size];
    let mut sector_offset = 0;

    loop {
        let bytes_read = file.read(&mut buffer)?;
        if bytes_read == 0 {
            break;
        }

        for (signature, fs_name) in FILE_SYSTEM_SIGNATURES.iter() {
            if buffer.starts_with(signature) {
                println!("Found {} filesystem at sector offset {}.", fs_name, sector_offset);
                io::stdout().flush()?;
            }
        }

        sector_offset += 1;
    }

    Ok(())
}

fn main() -> io::Result<()> {
    let args: Vec<String> = env::args().collect();

    if args.len() < 2 {
        eprintln!("Usage: {} <device_path> [--sector-size <size>]", args[0]);
        return Ok(());
    }

    let device_path = &args[1];
    let sector_size = if args.len() > 3 && args[2] == "--sector-size" {
        args[3].parse::<usize>().unwrap_or(DEFAULT_SECTOR_SIZE)
    } else {
        DEFAULT_SECTOR_SIZE
    };

    find_filesystems(device_path, sector_size)?;

    Ok(())
}
$ sudo ./findfs /dev/nvme0n1
Found LUKS filesystem at sector offset 2048.
Found NTFS filesystem at sector offset 943720448.
Found NTFS filesystem at sector offset 948023712.
Found NTFS filesystem at sector offset 948029904.
Found NTFS filesystem at sector offset 948036104.
Found NTFS filesystem at sector offset 948042304.
Found NTFS filesystem at sector offset 978215088.
Found NTFS filesystem at sector offset 1015698472.
Found ZFS filesystem at sector offset 1040022745.
Found ZFS filesystem at sector offset 1040203195.
Found ZFS filesystem at sector offset 1040234634.
Found ZFS filesystem at sector offset 1040300985.
Found ZFS filesystem at sector offset 1040346482.
Found ZFS filesystem at sector offset 1040442619.
Found ZFS filesystem at sector offset 1040500302.
...

Выводы: Rust говно и нужно каким-то более продвинутым способом все искать. Анализируя байтики после сигнатур. Там какая-то же структура, которая позволит все точно найти

rtxtxtrx ★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 4)
Ответ на: комментарий от rupert

Если бы все было так просто… в интерфейсе gparted разделы не перемещаются, читал что надо для этого делать отдельную загрузочную флешку с parted и уже с нее все менять, но почему то там просто черный экран и ничего не грузится

watain732
() автор топика
Ответ на: комментарий от QsUPt7S

Если я восстановлю таким образом корень системы как потом добавить к нему то свободное пространство? должен же быть способ и пространство добавить и корень системы сохранить

watain732
() автор топика
Ответ на: комментарий от watain732

На винде скомпилируй, поставив rust и rustc. Но там скорее всего ничего не выйдет, так как диск на котором стоит винда не доступен для низкоуровневых операций (борьба с вирусами-шифровальщиками). Ток с загрузочной флешки питоновский скрипт запускать если. Или искать готовые утилиты/проги, которые найдут тебе разделы все. https://www.cgsecurity.org/wiki/TestDisk_Download

rtxtxtrx ★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от watain732

как потом добавить к нему то свободное пространство?

Вам уже выше отвечали. Надо сначала переместить раздел так, чтобы добавляемое пространство оказалось после его окончания. Если Вам сложно самому подготовить загрузочную флешку, то скачайте live-образ любого дистрибутива, в котором есть необходимые Вам утилиты.

Второй способ - поместить в архив на другом носителе всё содержимое раздела, удалить переносимый раздел, создать и отформатировать новый, развернуть архив на нём. Но этот способ Вам может не подойти, так как будет необходимо либо при форматировании указать UUID файловой системы старого раздела, либо переустанавливать загрузчик и вручную править fstab.

QsUPt7S ★★
()
Последнее исправление: QsUPt7S (всего исправлений: 1)

Перед выполнением любых действий и команд убедись, что ты понимаешь то, что делаешь.

fdisk - редактор таблицы разделов. И если ты пишешь, что свободное место было перед разделом, который ты хотел расширить, то с помощью fdisk ты этого сделать не мог, в случае, если ты хотел сохранить свои данные.

В общем, читай arch wiki, переустанавливай систему.

kostik87 ★★★★★
()
Ответ на: комментарий от rtxtxtrx

Плохому танцору и Rust мешает. Питонячий скрипт выше тоже чушь выводит. Потому что волшебные байты могут располагаться по ненулевому смещению от начала сектора, суперблок может лежать не в начале раздела. Вывод про «какую-то структуру» верен.

undef ★★
()
Ответ на: комментарий от watain732

почему так и должно быть?

Ну ты же дал команду удалить раздел. Почему удивляешься что он был удалён?

Ну да, физически 99,99...9% данных не пострадали при этой операции (требует прояснения вопрос trim по ssd), но вытаскивать то их придётся жопой об косяк, и то если повезёт (точнее если ты больше ничего не делал, если ФС восстанавливаемая (читай ехт2/3/4, ntfs, vfat), если, если...)

должны же быть нормальные способы добавления свободного места к диску

А они есть. Но это низкий уровень работы с ОС, он требует знаний... Ну всё таки повыше идеального понимания школьного курса информации. Надо ЗНАТЬ что такое файл, ФС, блочное (и неблочное) устройство и общие принципы как ОС со всем этим работает.

А вообще научись делать бэкапы и разворачивать их. Всегда что то может пойти не так, например опечатка в команду закрадётся и не тот диск затрёшь. Иногда просто тупо забэкапить и развернуться на новой разметке быстрее/проще чем что то кроить и двигать.

З.Ы. Возможно я отстал от цен на железо, но мне кажется диски для бэкапов это не дорого. Мне казалось что то порядка 0,025 айфона.

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 2)
Ответ на: комментарий от futurama

Никак не упрощает последовательность урезать ФС -перекроить разделы - увеличить другую ФС. Ну разве что всегда можно перекрошить диски и потом пересобрать из лоскутов нужные объёмы в логический раздел, но это будет потенциальное поле граблей потому что разделы LVM подхватываются ядром позже и не так как физические разделы.

kirill_rrr ★★★★★
()