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 152283b627SPhilippe Mathieu-Daudéfrom avocado_qemu import QemuSystemTest 16*9b45cc99SAlex Bennéefrom avocado import skipUnless 1782d4c923SWainer dos Santos Moschetta 1882d4c923SWainer dos Santos Moschetta 192283b627SPhilippe 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 56*9b45cc99SAlex Bennée @skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab') 57*9b45cc99SAlex Bennée 588f1c89ecSLi Zhijian def test_with_2gib_file_should_work_with_linux_v4_16(self): 598f1c89ecSLi Zhijian """ 608f1c89ecSLi Zhijian QEMU has supported up to 4 GiB initrd for recent kernel 618f1c89ecSLi Zhijian Expect guest can reach 'Unpacking initramfs...' 628f1c89ecSLi Zhijian """ 6393bbbdf6SCleber Rosa kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' 6493bbbdf6SCleber Rosa '/linux/releases/28/Everything/x86_64/os/images/pxeboot/' 6593bbbdf6SCleber Rosa 'vmlinuz') 668f1c89ecSLi Zhijian kernel_hash = '238e083e114c48200f80d889f7e32eeb2793e02a' 678f1c89ecSLi Zhijian kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 688f1c89ecSLi Zhijian max_size = 2 * (1024 ** 3) + 1 698f1c89ecSLi Zhijian 708f1c89ecSLi Zhijian with tempfile.NamedTemporaryFile() as initrd: 718f1c89ecSLi Zhijian initrd.seek(max_size) 728f1c89ecSLi Zhijian initrd.write(b'\0') 738f1c89ecSLi Zhijian initrd.flush() 748f1c89ecSLi Zhijian 758f1c89ecSLi Zhijian self.vm.set_console() 768f1c89ecSLi Zhijian kernel_command_line = 'console=ttyS0' 778f1c89ecSLi Zhijian self.vm.add_args('-kernel', kernel_path, 788f1c89ecSLi Zhijian '-append', kernel_command_line, 798f1c89ecSLi Zhijian '-initrd', initrd.name, 808f1c89ecSLi Zhijian '-m', '5120') 818f1c89ecSLi Zhijian self.vm.launch() 828f1c89ecSLi Zhijian console = self.vm.console_socket.makefile() 838f1c89ecSLi Zhijian console_logger = logging.getLogger('console') 848f1c89ecSLi Zhijian while True: 858f1c89ecSLi Zhijian msg = console.readline() 868f1c89ecSLi Zhijian console_logger.debug(msg.strip()) 878f1c89ecSLi Zhijian if 'Unpacking initramfs...' in msg: 888f1c89ecSLi Zhijian break 898f1c89ecSLi Zhijian if 'Kernel panic - not syncing' in msg: 908f1c89ecSLi Zhijian self.fail("Kernel panic reached") 91