1bbbd9b6eSWillian Rampazzo# Linux initrd integration test. 282d4c923SWainer dos Santos Moschetta# 382d4c923SWainer dos Santos Moschetta# Copyright (c) 2018 Red Hat, Inc. 482d4c923SWainer dos Santos Moschetta# 582d4c923SWainer dos Santos Moschetta# Author: 682d4c923SWainer dos Santos Moschetta# Wainer dos Santos Moschetta <wainersm@redhat.com> 782d4c923SWainer dos Santos Moschetta# 882d4c923SWainer dos Santos Moschetta# This work is licensed under the terms of the GNU GPL, version 2 or 982d4c923SWainer dos Santos Moschetta# later. See the COPYING file in the top-level directory. 1082d4c923SWainer dos Santos Moschetta 113c1de3afSAlex Bennéeimport os 128f1c89ecSLi Zhijianimport logging 1382d4c923SWainer dos Santos Moschettaimport tempfile 1482d4c923SWainer dos Santos Moschetta 15*2283b627SPhilippe Mathieu-Daudéfrom avocado_qemu import QemuSystemTest 163c1de3afSAlex Bennéefrom avocado import skipIf 1782d4c923SWainer dos Santos Moschetta 1882d4c923SWainer dos Santos Moschetta 19*2283b627SPhilippe Mathieu-Daudéclass LinuxInitrd(QemuSystemTest): 2082d4c923SWainer dos Santos Moschetta """ 2182d4c923SWainer dos Santos Moschetta Checks QEMU evaluates correctly the initrd file passed as -initrd option. 2282d4c923SWainer dos Santos Moschetta 23b194713fSCleber Rosa :avocado: tags=arch:x86_64 24ba21bde9SCleber Rosa :avocado: tags=machine:pc 2582d4c923SWainer dos Santos Moschetta """ 2682d4c923SWainer dos Santos Moschetta 278f1c89ecSLi Zhijian timeout = 300 2882d4c923SWainer dos Santos Moschetta 293c7156fdSLi Zhijian def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self): 3082d4c923SWainer dos Santos Moschetta """ 3182d4c923SWainer dos Santos Moschetta Pretends to boot QEMU with an initrd file with size of 2GiB 3282d4c923SWainer dos Santos Moschetta and expect it exits with error message. 333c7156fdSLi Zhijian Fedora-18 shipped with linux-3.6 which have not supported xloadflags 343c7156fdSLi Zhijian cannot support more than 2GiB initrd. 3582d4c923SWainer dos Santos Moschetta """ 363c7156fdSLi Zhijian kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora/li' 373c7156fdSLi Zhijian 'nux/releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz') 383c7156fdSLi Zhijian kernel_hash = '41464f68efe42b9991250bed86c7081d2ccdbb21' 3982d4c923SWainer dos Santos Moschetta kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 4082d4c923SWainer dos Santos Moschetta max_size = 2 * (1024 ** 3) - 1 4182d4c923SWainer dos Santos Moschetta 4282d4c923SWainer dos Santos Moschetta with tempfile.NamedTemporaryFile() as initrd: 4382d4c923SWainer dos Santos Moschetta initrd.seek(max_size) 4482d4c923SWainer dos Santos Moschetta initrd.write(b'\0') 4582d4c923SWainer dos Santos Moschetta initrd.flush() 46c80c6bebSWainer dos Santos Moschetta self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name, 47c80c6bebSWainer dos Santos Moschetta '-m', '4096') 48c80c6bebSWainer dos Santos Moschetta self.vm.set_qmp_monitor(enabled=False) 49c80c6bebSWainer dos Santos Moschetta self.vm.launch() 50c80c6bebSWainer dos Santos Moschetta self.vm.wait() 51c80c6bebSWainer dos Santos Moschetta self.assertEqual(self.vm.exitcode(), 1) 5282d4c923SWainer dos Santos Moschetta expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % ( 5382d4c923SWainer dos Santos Moschetta max_size + 1) 54c80c6bebSWainer dos Santos Moschetta self.assertRegex(self.vm.get_log(), expected_msg) 558f1c89ecSLi Zhijian 563c1de3afSAlex Bennée @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') 578f1c89ecSLi Zhijian def test_with_2gib_file_should_work_with_linux_v4_16(self): 588f1c89ecSLi Zhijian """ 598f1c89ecSLi Zhijian QEMU has supported up to 4 GiB initrd for recent kernel 608f1c89ecSLi Zhijian Expect guest can reach 'Unpacking initramfs...' 618f1c89ecSLi Zhijian """ 6293bbbdf6SCleber Rosa kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' 6393bbbdf6SCleber Rosa '/linux/releases/28/Everything/x86_64/os/images/pxeboot/' 6493bbbdf6SCleber Rosa 'vmlinuz') 658f1c89ecSLi Zhijian kernel_hash = '238e083e114c48200f80d889f7e32eeb2793e02a' 668f1c89ecSLi Zhijian kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 678f1c89ecSLi Zhijian max_size = 2 * (1024 ** 3) + 1 688f1c89ecSLi Zhijian 698f1c89ecSLi Zhijian with tempfile.NamedTemporaryFile() as initrd: 708f1c89ecSLi Zhijian initrd.seek(max_size) 718f1c89ecSLi Zhijian initrd.write(b'\0') 728f1c89ecSLi Zhijian initrd.flush() 738f1c89ecSLi Zhijian 748f1c89ecSLi Zhijian self.vm.set_console() 758f1c89ecSLi Zhijian kernel_command_line = 'console=ttyS0' 768f1c89ecSLi Zhijian self.vm.add_args('-kernel', kernel_path, 778f1c89ecSLi Zhijian '-append', kernel_command_line, 788f1c89ecSLi Zhijian '-initrd', initrd.name, 798f1c89ecSLi Zhijian '-m', '5120') 808f1c89ecSLi Zhijian self.vm.launch() 818f1c89ecSLi Zhijian console = self.vm.console_socket.makefile() 828f1c89ecSLi Zhijian console_logger = logging.getLogger('console') 838f1c89ecSLi Zhijian while True: 848f1c89ecSLi Zhijian msg = console.readline() 858f1c89ecSLi Zhijian console_logger.debug(msg.strip()) 868f1c89ecSLi Zhijian if 'Unpacking initramfs...' in msg: 878f1c89ecSLi Zhijian break 888f1c89ecSLi Zhijian if 'Kernel panic - not syncing' in msg: 898f1c89ecSLi Zhijian self.fail("Kernel panic reached") 90