You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.2 KiB
111 lines
3.2 KiB
# Copyright (c) 2018 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import logging
|
|
import re
|
|
|
|
from autotest_lib.client.common_lib import error
|
|
|
|
|
|
def make_rootfs_writable(host):
|
|
"""
|
|
Checks and makes root filesystem writable.
|
|
|
|
Checks if root filesytem is writable. If not
|
|
it converts root filesystem to writable.
|
|
This function will reboot the DUT
|
|
|
|
@param host: An Autotest host object
|
|
|
|
@raises TestError: If making root fs writable fails.
|
|
|
|
"""
|
|
|
|
if is_rootfs_writable(host):
|
|
logging.info('DUT root file system is writable.')
|
|
else:
|
|
logging.info('DUT root file system is not writable. '
|
|
'Converting it writable...')
|
|
convert_rootfs_writable(host)
|
|
if not is_rootfs_writable(host):
|
|
raise error.TestError('Failed to make root filesystem writable')
|
|
logging.info('DUT root filesystem converted to writable')
|
|
|
|
|
|
def convert_rootfs_writable(host):
|
|
"""
|
|
Makes CrOS rootfs writable.
|
|
|
|
Remove root fs verification, reboot host
|
|
and remounts the root fs
|
|
|
|
@param host: An Autotest host object.
|
|
|
|
@raises TestError: If executing the command on CrOS fails.
|
|
"""
|
|
|
|
logging.info('Disabling rootfs verification.')
|
|
remove_rootfs_verification(host)
|
|
|
|
logging.info('Rebooting the host')
|
|
host.reboot()
|
|
|
|
logging.info('Remounting root filesystem')
|
|
cmd = 'mount -o remount,rw /'
|
|
res = host.run(cmd)
|
|
|
|
if res.exit_status != 0:
|
|
raise error.TestError('Executing remount command on DUT failed')
|
|
|
|
|
|
def remove_rootfs_verification(host):
|
|
"""
|
|
Removes root fs verification from CrOS host.
|
|
|
|
@param host: an Autotest host object.
|
|
|
|
@raises TestError: if executing the command on CrOS fails.
|
|
"""
|
|
|
|
# 2 & 4 are default partitions, and the system boots from one of them.
|
|
# Code from chromite/scripts/deploy_chrome.py
|
|
KERNEL_A_PARTITION = 2
|
|
KERNEL_B_PARTITION = 4
|
|
|
|
cmd_template = ('/usr/share/vboot/bin/make_dev_ssd.sh'
|
|
' --partitions "%d %d"'
|
|
' --remove_rootfs_verification --force')
|
|
cmd = cmd_template % (KERNEL_A_PARTITION, KERNEL_B_PARTITION)
|
|
res = host.run(cmd)
|
|
if res.exit_status != 0:
|
|
raise error.TestError('Executing command on DUT failed')
|
|
|
|
|
|
def is_rootfs_writable(host):
|
|
"""
|
|
Checks if the root file system is writable.
|
|
|
|
@param host: an Autotest host object.
|
|
|
|
@returns Boolean denoting where root filesytem is writable or not.
|
|
|
|
@raises TestError: if executing the command on CrOS fails.
|
|
"""
|
|
|
|
# Query the DUT's filesystem /dev/root and check whether it is rw
|
|
|
|
cmd = 'cat /proc/mounts | grep "/dev/root"'
|
|
result = host.run(cmd)
|
|
if result.exit_status > 0:
|
|
raise error.TestError('Executing command on DUT failed')
|
|
fields = re.split(' |,', result.stdout)
|
|
|
|
# Result of grep will be of the following format
|
|
# /dev/root / ext2 ro,seclabel <....truncated...> => readonly
|
|
# /dev/root / ext2 rw,seclabel <....truncated...> => readwrite
|
|
if fields.__len__() < 4 or fields[3] not in ['rw', 'ro']:
|
|
raise error.TestError('Command output not in expected format')
|
|
|
|
return fields[3] == 'rw'
|