Pygrub is not part of grub project. On Sun, 21 Jul 2019, 12:58 Kevin Buckley, <kevin.m.buck...@gmail.com> wrote:
> Hi there, > > this may well fall into a "Grub2 should not be run under Python3" > basket, hence not submitting a bug at savannah, however the fact > that my Grub appears to allow me to boot my Dom0 system, but not > boot my Xen DomU-s, has me thinking there's more to it than that. > > > OK, so I am trying to build an LFS (Linux From Scratch) system that > will serve as a basic Xen Dom0. > > You can see the way things have been compiled, including my UEFI-aware > Grub, here (Very much a WIP) > > http://youvegotbuckleys.org.nz/LFS/LFS-BOOK.html > > > Suffice it to say that the LFS Grub boots either of the two > UEFI enties (non-Xen and Dom0) I have so as to bring up the > system. > > > I also have a couple of VBD-backed DomU-s that I can bring up, > using the pygrub from either an Ubuntu 1404, or a Centos 6.10 > with Xen4Centos, Dom0. > > When I come to try and have my LFS Xen's pygrub boot the VBD-backed > DomU, I get errors of the form > > > # cat /mnt/var/log/xen/bootloader.4.log > Using <class 'grub.GrubConf.Grub2ConfigFile'> to parse /boot/grub/grub.cfg > Traceback (most recent call last): > File "/usr/lib/xen/bin/pygrub", line 928, in <module> > raise RuntimeError("Unable to find partition containing kernel") > RuntimeError: Unable to find partition containing kernel > > I originally thought that this might be down to my using a Xen > source from the Xen Git repo that was in beyond 4.12 (which I > needed so to get a Xen that was happy with just Python3. See > > https://lists.xenproject.org/archives/html/xen-devel/2019-04/msg00996.html > ) and had prhaps had tripped over a regression, as that error used > to be a problem with Xen (if you go back far enough). > > > However I have since tracked down my problem to the pygrub, in > that if I point pygrub to the start of the partition in the VBD > that has the grub.cfg in it, I see the following failure to parse > the config file: > > > bash-5.0# /usr/lib/xen/bin/pygrub --debug --offset=1048576 > --list-entries /dev/vg_xen_vbds/lv_4g_02 > Using <class 'grub.GrubConf.Grub2ConfigFile'> to parse /boot/grub/grub.cfg > Traceback (most recent call last): > File "/usr/lib/xen/bin/pygrub", line 907, in <module> > chosencfg = run_grub(file, entry, fs, incfg["args"]) > File "/usr/lib/xen/bin/pygrub", line 625, in run_grub > g = Grub(file, fs) > File "/usr/lib/xen/bin/pygrub", line 249, in __init__ > self.read_config(file, fs) > File "/usr/lib/xen/bin/pygrub", line 460, in read_config > self.cf.parse(buf) > File "/usr/lib/python3.7/site-packages/grub/GrubConf.py", line 376, in > parse > lines = buf.split("\n") > TypeError: a bytes-like object is required, not 'str' > > > whereas if I do the same with the pygrub from the CentOs6.10/Xen4Centos > environment, I see > > > /usr/bin/pygrub --debug --offset=1048576 --list-entries > /dev/vg_xen_vbds/lv_4g_02 > title: Ubuntu > root: None > kernel: /boot/vmlinuz-4.4.0-31-generic > args: root=/dev/xvda1 ro quiet splash $vt_handoff > initrd: /boot/initrd.img-4.4.0-31-generic > title: Ubuntu, with Linux 4.4.0-31-generic > root: None > kernel: /boot/vmlinuz-4.4.0-31-generic > args: root=UUID=5556a819-ced8-4864-9e7f-73792570703e ro quiet > splash $vt_handoff > initrd: /boot/initrd.img-4.4.0-31-generic > title: Ubuntu, with Linux 4.4.0-31-generic (recovery mode) > root: None > kernel: /boot/vmlinuz-4.4.0-31-generic > args: root=UUID=5556a819-ced8-4864-9e7f-73792570703e ro recovery > nomodeset > initrd: /boot/initrd.img-4.4.0-31-generic > Using <class 'grub.GrubConf.Grub2ConfigFile'> to parse /boot/grub/grub.cfg > INFO:root:Ignored directive if > INFO:root:Ignored directive load_env > INFO:root:Ignored directive fi > INFO:root:Ignored directive if > WARNING:root:grub2's saved_entry/next_entry not supported > INFO:root:Ignored directive save_env > ... > > > and it goes on and suceeds. > > Ok, so then I went hunting around for the cause of the error > I was seeing on the LFS system and got pointed towards the > cause being a Pythin2->3 issue, with the way 3 now differentiates > between strings and bytes. > > > FWIW, I tried making some changes to the GrubConf.py file but only > seemed to see more worms coming out of each can that I opened. The > first of my attempted changes was to try and decode the buffer but > that seems to have moved me off onto another error again, whilst the > second line of attack, where I tried to leave the buffer as "bytes" > whilst altering the operations on it to be "byte-aware" only > compilacted things further. > > The odd things for me is that the same pygrub that can boot my > LFS system doesn't appear to be failing. > > I present the chnages that I made and the resulting errors from > my attempts to point pygrub at the partition with the grub.cfg > file on here: > > bash-5.0# /usr/lib/xen/bin/pygrub --debug --offset=1048576 > --list-entries /dev/vg_xen_vbds/lv_4g_02 > Using <class 'grub.GrubConf.Grub2ConfigFile'> to parse /boot/grub/grub.cfg > Traceback (most recent call last): > File "/usr/lib/xen/bin/pygrub", line 907, in <module> > chosencfg = run_grub(file, entry, fs, incfg["args"]) > File "/usr/lib/xen/bin/pygrub", line 625, in run_grub > g = Grub(file, fs) > File "/usr/lib/xen/bin/pygrub", line 249, in __init__ > self.read_config(file, fs) > File "/usr/lib/xen/bin/pygrub", line 460, in read_config > self.cf.parse(buf) > File "/usr/lib/python3.7/site-packages/grub/GrubConf.py", line 376, in > parse > lines = buf.split("\n") > TypeError: a bytes-like object is required, not 'str' > > bash-5.0# vim /usr/lib/python3.7/site-packages/grub/GrubConf.py +376 > > bash-5.0# diff GrubConf.py > /usr/lib/python3.7/site-packages/grub/GrubConf.py > 376c376 > < lines = buf.split("\n") > --- > > lines = buf.decode().split("\n") > > > bash-5.0# /usr/lib/xen/bin/pygrub --debug --offset=1048576 > --list-entries /dev/vg_xen_vbds/lv_4g_02 > Using <class 'grub.GrubConf.Grub2ConfigFile'> to parse /boot/grub/grub.cfg > INFO:root:Ignored directive if > INFO:root:Ignored directive load_env > INFO:root:Ignored directive fi > INFO:root:Ignored directive if > WARNING:root:grub2's saved_entry/next_entry not supported > Traceback (most recent call last): > File "/usr/lib/xen/bin/pygrub", line 907, in <module> > chosencfg = run_grub(file, entry, fs, incfg["args"]) > File "/usr/lib/xen/bin/pygrub", line 625, in run_grub > g = Grub(file, fs) > File "/usr/lib/xen/bin/pygrub", line 249, in __init__ > self.read_config(file, fs) > File "/usr/lib/xen/bin/pygrub", line 460, in read_config > self.cf.parse(buf) > File "/usr/lib/python3.7/site-packages/grub/GrubConf.py", line 440, in > parse > setattr(self, self.commands[com], arg_strip) > File "/usr/lib/python3.7/site-packages/grub/GrubConf.py", line 238, > in _set_default > if self._default < 0: > TypeError: '<' not supported between instances of 'str' and 'int' > > > Hmmm? > > So now try going back and try keeping things as "bytes" > for as long as possible > > > bash-5.0# vim /usr/lib/python3.7/site-packages/grub/GrubConf.py +376 > > bash-5.0# diff GrubConf.py > /usr/lib/python3.7/site-packages/grub/GrubConf.py > 376c376 > < lines = buf.split("\n") > --- > > lines = buf.split(b"\n") > > bash-5.0# /usr/lib/xen/bin/pygrub --debug --offset=1048576 > --list-entries /dev/vg_xen_vbds/lv_4g_02 > Using <class 'grub.GrubConf.Grub2ConfigFile'> to parse /boot/grub/grub.cfg > Traceback (most recent call last): > File "/usr/lib/xen/bin/pygrub", line 907, in <module> > chosencfg = run_grub(file, entry, fs, incfg["args"]) > File "/usr/lib/xen/bin/pygrub", line 625, in run_grub > g = Grub(file, fs) > File "/usr/lib/xen/bin/pygrub", line 249, in __init__ > self.read_config(file, fs) > File "/usr/lib/xen/bin/pygrub", line 460, in read_config > self.cf.parse(buf) > File "/usr/lib/python3.7/site-packages/grub/GrubConf.py", line 388, in > parse > if l.startswith('#'): > TypeError: startswith first arg must be bytes or a tuple of bytes, not str > > > bash-5.0# vim /usr/lib/python3.7/site-packages/grub/GrubConf.py +388 > > bash-5.0# diff GrubConf.py > /usr/lib/python3.7/site-packages/grub/GrubConf.py > 376c376 > < lines = buf.split("\n") > --- > > lines = buf.split(b"\n") > 388c388 > < if l.startswith('#'): > --- > > if l.startswith(b'#'): > > > bash-5.0# /usr/lib/xen/bin/pygrub --debug --offset=1048576 > --list-entries /dev/vg_xen_vbds/lv_4g_02 > Using <class 'grub.GrubConf.Grub2ConfigFile'> to parse /boot/grub/grub.cfg > Traceback (most recent call last): > File "/usr/lib/xen/bin/pygrub", line 907, in <module> > chosencfg = run_grub(file, entry, fs, incfg["args"]) > File "/usr/lib/xen/bin/pygrub", line 625, in run_grub > g = Grub(file, fs) > File "/usr/lib/xen/bin/pygrub", line 249, in __init__ > self.read_config(file, fs) > File "/usr/lib/xen/bin/pygrub", line 460, in read_config > self.cf.parse(buf) > File "/usr/lib/python3.7/site-packages/grub/GrubConf.py", line 392, in > parse > if l.startswith('function'): > TypeError: startswith first arg must be bytes or a tuple of bytes, not str > > > bash-5.0# vim /usr/lib/python3.7/site-packages/grub/GrubConf.py +392 > > > bash-5.0# diff GrubConf.py > /usr/lib/python3.7/site-packages/grub/GrubConf.py > 376c376 > < lines = buf.split("\n") > --- > > lines = buf.split(b"\n") > 388c388 > < if l.startswith('#'): > --- > > if l.startswith(b'#'): > 392c392 > < if l.startswith('function'): > --- > > if l.startswith(b'function'): > > bash-5.0# /usr/lib/xen/bin/pygrub --debug --offset=1048576 > --list-entries /dev/vg_xen_vbds/lv_4g_02 > Using <class 'grub.GrubConf.Grub2ConfigFile'> to parse /boot/grub/grub.cfg > Traceback (most recent call last): > File "/usr/lib/xen/bin/pygrub", line 907, in <module> > chosencfg = run_grub(file, entry, fs, incfg["args"]) > File "/usr/lib/xen/bin/pygrub", line 625, in run_grub > g = Grub(file, fs) > File "/usr/lib/xen/bin/pygrub", line 249, in __init__ > self.read_config(file, fs) > File "/usr/lib/xen/bin/pygrub", line 460, in read_config > self.cf.parse(buf) > File "/usr/lib/python3.7/site-packages/grub/GrubConf.py", line 401, in > parse > title_match = re.match('^menuentry ["\'](.*?)["\'] (.*){', l) > File "/usr/lib/python3.7/re.py", line 173, in match > return _compile(pattern, flags).match(string) > TypeError: cannot use a string pattern on a bytes-like object > > > Hmmm? > > This looks like something a bit harder to transpose into > a "bytes" paradigm. > > Any ideas as to why my pythin3 Grub works in some cases but not > in others? > > Kevin Buckley. > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel