mirror of
https://github.com/openwrt-xiaomi/xmir-patcher.git
synced 2026-09-22 22:57:55 +03:00
[read_info] Fix detection active rootfs partition
This commit is contained in:
+32
-30
@@ -52,6 +52,7 @@ class DevInfo():
|
||||
dmesg = None # text
|
||||
info = BaseInfo()
|
||||
partlist = [] # list of {addr, size, name}
|
||||
kcmdline_s = "" # original kernel command line
|
||||
kcmdline = {} # key=value
|
||||
nvram = {} # key=value
|
||||
rootfs = RootFS()
|
||||
@@ -80,12 +81,8 @@ class DevInfo():
|
||||
self.get_part_table()
|
||||
if not self.partlist or len(self.partlist) <= 1:
|
||||
die("Partition list is empty!")
|
||||
self.get_rootfs()
|
||||
self.get_kernel_cmdline()
|
||||
if self.rootfs.num is None:
|
||||
if 'firmware' in self.kcmdline:
|
||||
self.rootfs.num = int(self.kcmdline['firmware'])
|
||||
print(f'rootfs.num = {self.rootfs.num}\n')
|
||||
self.get_rootfs()
|
||||
self.get_baseinfo()
|
||||
if not self.info.cpu_arch:
|
||||
die("Can't detect CPU arch! Try to reboot device.")
|
||||
@@ -243,39 +240,42 @@ class DevInfo():
|
||||
def get_rootfs(self, verbose = None):
|
||||
verbose = verbose if verbose is not None else self.verbose
|
||||
self.rootfs = RootFS()
|
||||
if not self.dmesg:
|
||||
if not self.kcmdline_s and not self.dmesg:
|
||||
return self.rootfs
|
||||
# flag_boot_rootfs=0 mounting /dev/mtd10
|
||||
x = re.search(r'flag_boot_rootfs=([0-9]) mounting (\S+)', self.dmesg)
|
||||
if x:
|
||||
self.rootfs.num = int(x.group(1))
|
||||
self.rootfs.mtd_dev = x.group(2)
|
||||
# UBI: attached mtd10 (name "rootfs0", size 32 MiB) to ubi0
|
||||
x = re.search(r'attached mtd([0-9]+) \(name "(.*?)", size', self.dmesg)
|
||||
if x and x.group(2).lower().startswith('rootfs'):
|
||||
self.rootfs.mtd_num = int(x.group(1))
|
||||
self.rootfs.partition = x.group(2).strip()
|
||||
# mtd: device 11 (rootfs) set to be root filesystem
|
||||
x = re.search(r'mtd: device ([0-9]+) \(rootfs\) set to be root filesystem', self.dmesg)
|
||||
if x:
|
||||
self.rootfs.mtd_num = int(x.group(1))
|
||||
kcmdline = f'Kernel command line: {self.kcmdline_s} \n'
|
||||
if self.dmesg:
|
||||
# flag_boot_rootfs=0 mounting /dev/mtd10
|
||||
x = re.search(r'flag_boot_rootfs=([0-9]) mounting (\S+)', self.dmesg)
|
||||
if x:
|
||||
self.rootfs.num = int(x.group(1))
|
||||
self.rootfs.mtd_dev = x.group(2)
|
||||
# UBI: attached mtd10 (name "rootfs0", size 32 MiB) to ubi0
|
||||
x = re.search(r'attached mtd([0-9]+) \(name "(.*?)", size', self.dmesg)
|
||||
if x and x.group(2).lower().startswith('rootfs'):
|
||||
self.rootfs.mtd_num = int(x.group(1))
|
||||
self.rootfs.partition = x.group(2).strip()
|
||||
# mtd: device 11 (rootfs) set to be root filesystem
|
||||
x = re.search(r'mtd: device ([0-9]+) \(rootfs\) set to be root filesystem', self.dmesg)
|
||||
if x:
|
||||
self.rootfs.mtd_num = int(x.group(1))
|
||||
if self.rootfs.num is None:
|
||||
k = re.search(r'Kernel command line:(.*?) ubi\.mtd=(\S+)', self.dmesg) # ([^\s]+)
|
||||
k = re.search(r'Kernel command line:(.*?) ubi\.mtd=(\S+)', kcmdline) # ([^\s]+)
|
||||
if k:
|
||||
self.rootfs.partition = k.group(2)
|
||||
if self.rootfs.num is None:
|
||||
k = re.search(r'Kernel command line:(.*?) firmware=([0-9])', self.dmesg)
|
||||
k = re.search(r'Kernel command line:(.*?) firmware=([0-9])', kcmdline)
|
||||
if k:
|
||||
self.rootfs.num = int(k.group(2))
|
||||
if self.rootfs.num is None and self.rootfs.mtd_num is None:
|
||||
x = re.search(r'Kernel command line:(.*?) root=(\S+)', self.dmesg)
|
||||
x = re.search(r'Kernel command line:(.*?) root=(\S+)', kcmdline)
|
||||
if x and x.group(2).startswith('/dev/mtdblock'):
|
||||
self.rootfs.mtd_dev = x.group(2)
|
||||
self.rootfs.mtd_num = int(self.rootfs.mtd_dev.replace('/dev/mtdblock', ''))
|
||||
if self.rootfs.num is None and self.rootfs.partition:
|
||||
if self.rootfs.partition.lower().startswith('rootfs'):
|
||||
pname = self.rootfs.partition.lower()
|
||||
if pname.startswith('rootfs') or pname.startswith('firmware') or pname.startswith('ubi'):
|
||||
self.rootfs.num = 0
|
||||
if self.rootfs.partition.endswith('1'):
|
||||
if pname.endswith('1'):
|
||||
self.rootfs.num = 1
|
||||
if verbose:
|
||||
print('RootFS info:')
|
||||
@@ -379,6 +379,7 @@ class DevInfo():
|
||||
|
||||
def get_kernel_cmdline(self, verbose = None, retdict = True):
|
||||
verbose = verbose if verbose is not None else self.verbose
|
||||
self.kcmdline_s = ""
|
||||
self.kcmdline = {} if retdict else None
|
||||
fn_local = 'outdir/kcmdline.log'
|
||||
fn_remote = '/tmp/kcmdline.log'
|
||||
@@ -392,17 +393,18 @@ class DevInfo():
|
||||
return self.kcmdline
|
||||
if os.path.getsize(fn_local) <= 1:
|
||||
return self.kcmdline
|
||||
with open(fn_local, "r", encoding="latin_1") as file:
|
||||
with open(fn_local, "rb") as file:
|
||||
data = file.read()
|
||||
data = data.replace(b"\n", b' ')
|
||||
data = data.replace(b"\x00", b' ')
|
||||
data = data.decode('latin_1')
|
||||
data = data.strip()
|
||||
self.kcmdline_s = data
|
||||
if verbose:
|
||||
print("Kernel command line:")
|
||||
print(" ", data)
|
||||
if not retdict:
|
||||
return data
|
||||
data = data.strip()
|
||||
data = data.replace("\n", ' ')
|
||||
data = data.replace("\x00", ' ')
|
||||
data = data.strip()
|
||||
env = EnvBuffer(data, ' ', crc_prefix = False, encoding = 'latin_1')
|
||||
self.kcmdline = env.var
|
||||
#self.kcmdline = type("Names", [object], self.kcmdline)
|
||||
|
||||
Reference in New Issue
Block a user