1bbbd9b6eSWillian Rampazzo# Linux initrd integration test. 2bbbd9b6eSWillian Rampazzo# 3bbbd9b6eSWillian Rampazzo# Copyright (c) 2018 Red Hat, Inc. 4bbbd9b6eSWillian Rampazzo# 5bbbd9b6eSWillian Rampazzo# Author: 6bbbd9b6eSWillian Rampazzo# Wainer dos Santos Moschetta <wainersm@redhat.com> 7bbbd9b6eSWillian Rampazzo# 8bbbd9b6eSWillian Rampazzo# This work is licensed under the terms of the GNU GPL, version 2 or 9bbbd9b6eSWillian Rampazzo# later. See the COPYING file in the top-level directory. 10bbbd9b6eSWillian Rampazzo 11bbbd9b6eSWillian Rampazzoimport os 12bbbd9b6eSWillian Rampazzoimport logging 13bbbd9b6eSWillian Rampazzoimport tempfile 14bbbd9b6eSWillian Rampazzo 15*2283b627SPhilippe Mathieu-Daudéfrom avocado_qemu import QemuSystemTest 16bbbd9b6eSWillian Rampazzofrom avocado import skipIf 17bbbd9b6eSWillian Rampazzo 18bbbd9b6eSWillian Rampazzo 19*2283b627SPhilippe Mathieu-Daudéclass LinuxInitrd(QemuSystemTest): 20bbbd9b6eSWillian Rampazzo """ 21bbbd9b6eSWillian Rampazzo Checks QEMU evaluates correctly the initrd file passed as -initrd option. 22bbbd9b6eSWillian Rampazzo 23bbbd9b6eSWillian Rampazzo :avocado: tags=arch:x86_64 24bbbd9b6eSWillian Rampazzo :avocado: tags=machine:pc 25bbbd9b6eSWillian Rampazzo """ 26bbbd9b6eSWillian Rampazzo 27bbbd9b6eSWillian Rampazzo timeout = 300 28bbbd9b6eSWillian Rampazzo 29bbbd9b6eSWillian Rampazzo def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self): 30bbbd9b6eSWillian Rampazzo """ 31bbbd9b6eSWillian Rampazzo Pretends to boot QEMU with an initrd file with size of 2GiB 32bbbd9b6eSWillian Rampazzo and expect it exits with error message. 33bbbd9b6eSWillian Rampazzo Fedora-18 shipped with linux-3.6 which have not supported xloadflags 34bbbd9b6eSWillian Rampazzo cannot support more than 2GiB initrd. 35bbbd9b6eSWillian Rampazzo """ 36bbbd9b6eSWillian Rampazzo kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora/li' 37bbbd9b6eSWillian Rampazzo 'nux/releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz') 38bbbd9b6eSWillian Rampazzo kernel_hash = '41464f68efe42b9991250bed86c7081d2ccdbb21' 39bbbd9b6eSWillian Rampazzo kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 40bbbd9b6eSWillian Rampazzo max_size = 2 * (1024 ** 3) - 1 41bbbd9b6eSWillian Rampazzo 42bbbd9b6eSWillian Rampazzo with tempfile.NamedTemporaryFile() as initrd: 43bbbd9b6eSWillian Rampazzo initrd.seek(max_size) 44bbbd9b6eSWillian Rampazzo initrd.write(b'\0') 45bbbd9b6eSWillian Rampazzo initrd.flush() 46bbbd9b6eSWillian Rampazzo self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name, 47bbbd9b6eSWillian Rampazzo '-m', '4096') 48bbbd9b6eSWillian Rampazzo self.vm.set_qmp_monitor(enabled=False) 49bbbd9b6eSWillian Rampazzo self.vm.launch() 50bbbd9b6eSWillian Rampazzo self.vm.wait() 51bbbd9b6eSWillian Rampazzo self.assertEqual(self.vm.exitcode(), 1) 52bbbd9b6eSWillian Rampazzo expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % ( 53bbbd9b6eSWillian Rampazzo max_size + 1) 54bbbd9b6eSWillian Rampazzo self.assertRegex(self.vm.get_log(), expected_msg) 55bbbd9b6eSWillian Rampazzo 56bbbd9b6eSWillian Rampazzo @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') 57bbbd9b6eSWillian Rampazzo def test_with_2gib_file_should_work_with_linux_v4_16(self): 58bbbd9b6eSWillian Rampazzo """ 59bbbd9b6eSWillian Rampazzo QEMU has supported up to 4 GiB initrd for recent kernel 60bbbd9b6eSWillian Rampazzo Expect guest can reach 'Unpacking initramfs...' 61bbbd9b6eSWillian Rampazzo """ 62bbbd9b6eSWillian Rampazzo kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' 63bbbd9b6eSWillian Rampazzo '/linux/releases/28/Everything/x86_64/os/images/pxeboot/' 64bbbd9b6eSWillian Rampazzo 'vmlinuz') 65bbbd9b6eSWillian Rampazzo kernel_hash = '238e083e114c48200f80d889f7e32eeb2793e02a' 66bbbd9b6eSWillian Rampazzo kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 67bbbd9b6eSWillian Rampazzo max_size = 2 * (1024 ** 3) + 1 68bbbd9b6eSWillian Rampazzo 69bbbd9b6eSWillian Rampazzo with tempfile.NamedTemporaryFile() as initrd: 70bbbd9b6eSWillian Rampazzo initrd.seek(max_size) 71bbbd9b6eSWillian Rampazzo initrd.write(b'\0') 72bbbd9b6eSWillian Rampazzo initrd.flush() 73bbbd9b6eSWillian Rampazzo 74bbbd9b6eSWillian Rampazzo self.vm.set_console() 75bbbd9b6eSWillian Rampazzo kernel_command_line = 'console=ttyS0' 76bbbd9b6eSWillian Rampazzo self.vm.add_args('-kernel', kernel_path, 77bbbd9b6eSWillian Rampazzo '-append', kernel_command_line, 78bbbd9b6eSWillian Rampazzo '-initrd', initrd.name, 79bbbd9b6eSWillian Rampazzo '-m', '5120') 80bbbd9b6eSWillian Rampazzo self.vm.launch() 81bbbd9b6eSWillian Rampazzo console = self.vm.console_socket.makefile() 82bbbd9b6eSWillian Rampazzo console_logger = logging.getLogger('console') 83bbbd9b6eSWillian Rampazzo while True: 84bbbd9b6eSWillian Rampazzo msg = console.readline() 85bbbd9b6eSWillian Rampazzo console_logger.debug(msg.strip()) 86bbbd9b6eSWillian Rampazzo if 'Unpacking initramfs...' in msg: 87bbbd9b6eSWillian Rampazzo break 88bbbd9b6eSWillian Rampazzo if 'Kernel panic - not syncing' in msg: 89bbbd9b6eSWillian Rampazzo self.fail("Kernel panic reached") 90