18dcac1cfSThomas Huth#!/usr/bin/env python3 28dcac1cfSThomas Huth# 3bbbd9b6eSWillian Rampazzo# Linux initrd integration test. 482d4c923SWainer dos Santos Moschetta# 582d4c923SWainer dos Santos Moschetta# Copyright (c) 2018 Red Hat, Inc. 682d4c923SWainer dos Santos Moschetta# 782d4c923SWainer dos Santos Moschetta# Author: 882d4c923SWainer dos Santos Moschetta# Wainer dos Santos Moschetta <wainersm@redhat.com> 982d4c923SWainer dos Santos Moschetta# 1082d4c923SWainer dos Santos Moschetta# This work is licensed under the terms of the GNU GPL, version 2 or 1182d4c923SWainer dos Santos Moschetta# later. See the COPYING file in the top-level directory. 1282d4c923SWainer dos Santos Moschetta 138f1c89ecSLi Zhijianimport logging 1482d4c923SWainer dos Santos Moschettaimport tempfile 1582d4c923SWainer dos Santos Moschetta 16*3d593860SDaniel P. Berrangéfrom qemu_test import QemuSystemTest, Asset, skipFlakyTest 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 """ 2382d4c923SWainer dos Santos Moschetta 248f1c89ecSLi Zhijian timeout = 300 2582d4c923SWainer dos Santos Moschetta 268dcac1cfSThomas Huth ASSET_F18_KERNEL = Asset( 278dcac1cfSThomas Huth ('https://archives.fedoraproject.org/pub/archive/fedora/linux/' 288dcac1cfSThomas Huth 'releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz'), 298dcac1cfSThomas Huth '1a27cb42559ce29237ac186699d063556ad69c8349d732bb1bd8d614e5a8cc2e') 308dcac1cfSThomas Huth 318dcac1cfSThomas Huth ASSET_F28_KERNEL = Asset( 328dcac1cfSThomas Huth ('https://archives.fedoraproject.org/pub/archive/fedora/linux/' 338dcac1cfSThomas Huth 'releases/28/Everything/x86_64/os/images/pxeboot/vmlinuz'), 348dcac1cfSThomas Huth 'd05909c9d4a742a6fcc84dcc0361009e4611769619cc187a07107579a035f24e') 358dcac1cfSThomas Huth 363c7156fdSLi Zhijian def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self): 3782d4c923SWainer dos Santos Moschetta """ 3882d4c923SWainer dos Santos Moschetta Pretends to boot QEMU with an initrd file with size of 2GiB 3982d4c923SWainer dos Santos Moschetta and expect it exits with error message. 403c7156fdSLi Zhijian Fedora-18 shipped with linux-3.6 which have not supported xloadflags 413c7156fdSLi Zhijian cannot support more than 2GiB initrd. 4282d4c923SWainer dos Santos Moschetta """ 438dcac1cfSThomas Huth self.set_machine('pc') 448dcac1cfSThomas Huth kernel_path = self.ASSET_F18_KERNEL.fetch() 4582d4c923SWainer dos Santos Moschetta max_size = 2 * (1024 ** 3) - 1 4682d4c923SWainer dos Santos Moschetta 4782d4c923SWainer dos Santos Moschetta with tempfile.NamedTemporaryFile() as initrd: 4882d4c923SWainer dos Santos Moschetta initrd.seek(max_size) 4982d4c923SWainer dos Santos Moschetta initrd.write(b'\0') 5082d4c923SWainer dos Santos Moschetta initrd.flush() 51c80c6bebSWainer dos Santos Moschetta self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name, 52c80c6bebSWainer dos Santos Moschetta '-m', '4096') 53c80c6bebSWainer dos Santos Moschetta self.vm.set_qmp_monitor(enabled=False) 54c80c6bebSWainer dos Santos Moschetta self.vm.launch() 55c80c6bebSWainer dos Santos Moschetta self.vm.wait() 56c80c6bebSWainer dos Santos Moschetta self.assertEqual(self.vm.exitcode(), 1) 5782d4c923SWainer dos Santos Moschetta expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % ( 5882d4c923SWainer dos Santos Moschetta max_size + 1) 59c80c6bebSWainer dos Santos Moschetta self.assertRegex(self.vm.get_log(), expected_msg) 608f1c89ecSLi Zhijian 61*3d593860SDaniel P. Berrangé # XXX file tracking bug 62*3d593860SDaniel P. Berrangé @skipFlakyTest(bug_url=None) 638f1c89ecSLi Zhijian def test_with_2gib_file_should_work_with_linux_v4_16(self): 648f1c89ecSLi Zhijian """ 658f1c89ecSLi Zhijian QEMU has supported up to 4 GiB initrd for recent kernel 668f1c89ecSLi Zhijian Expect guest can reach 'Unpacking initramfs...' 678f1c89ecSLi Zhijian """ 688dcac1cfSThomas Huth self.set_machine('pc') 698dcac1cfSThomas Huth kernel_path = self.ASSET_F28_KERNEL.fetch() 708f1c89ecSLi Zhijian max_size = 2 * (1024 ** 3) + 1 718f1c89ecSLi Zhijian 728f1c89ecSLi Zhijian with tempfile.NamedTemporaryFile() as initrd: 738f1c89ecSLi Zhijian initrd.seek(max_size) 748f1c89ecSLi Zhijian initrd.write(b'\0') 758f1c89ecSLi Zhijian initrd.flush() 768f1c89ecSLi Zhijian 778f1c89ecSLi Zhijian self.vm.set_console() 788f1c89ecSLi Zhijian kernel_command_line = 'console=ttyS0' 798f1c89ecSLi Zhijian self.vm.add_args('-kernel', kernel_path, 808f1c89ecSLi Zhijian '-append', kernel_command_line, 818f1c89ecSLi Zhijian '-initrd', initrd.name, 828f1c89ecSLi Zhijian '-m', '5120') 838f1c89ecSLi Zhijian self.vm.launch() 848f1c89ecSLi Zhijian console = self.vm.console_socket.makefile() 858f1c89ecSLi Zhijian console_logger = logging.getLogger('console') 868f1c89ecSLi Zhijian while True: 878f1c89ecSLi Zhijian msg = console.readline() 888f1c89ecSLi Zhijian console_logger.debug(msg.strip()) 898f1c89ecSLi Zhijian if 'Unpacking initramfs...' in msg: 908f1c89ecSLi Zhijian break 918f1c89ecSLi Zhijian if 'Kernel panic - not syncing' in msg: 928f1c89ecSLi Zhijian self.fail("Kernel panic reached") 938dcac1cfSThomas Huth 948dcac1cfSThomas Huthif __name__ == '__main__': 958dcac1cfSThomas Huth QemuSystemTest.main() 96