init
This commit is contained in:
commit
7518fed92e
85 changed files with 1193 additions and 0 deletions
1
airootfs/etc/hostname
Normal file
1
airootfs/etc/hostname
Normal file
|
@ -0,0 +1 @@
|
|||
archiso
|
1
airootfs/etc/locale.conf
Normal file
1
airootfs/etc/locale.conf
Normal file
|
@ -0,0 +1 @@
|
|||
LANG=C.UTF-8
|
1
airootfs/etc/localtime
Symbolic link
1
airootfs/etc/localtime
Symbolic link
|
@ -0,0 +1 @@
|
|||
/usr/share/zoneinfo/UTC
|
3
airootfs/etc/mkinitcpio.conf.d/archiso.conf
Normal file
3
airootfs/etc/mkinitcpio.conf.d/archiso.conf
Normal file
|
@ -0,0 +1,3 @@
|
|||
HOOKS=(base udev microcode modconf kms memdisk archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs block filesystems keyboard)
|
||||
COMPRESSION="xz"
|
||||
COMPRESSION_OPTIONS=(-9e)
|
8
airootfs/etc/mkinitcpio.d/linux.preset
Normal file
8
airootfs/etc/mkinitcpio.d/linux.preset
Normal file
|
@ -0,0 +1,8 @@
|
|||
# mkinitcpio preset file for the 'linux' package on archiso
|
||||
|
||||
PRESETS=('archiso')
|
||||
|
||||
ALL_kver='/boot/vmlinuz-linux'
|
||||
archiso_config='/etc/mkinitcpio.conf.d/archiso.conf'
|
||||
|
||||
archiso_image="/boot/initramfs-linux.img"
|
7
airootfs/etc/modprobe.d/broadcom-wl.conf
Normal file
7
airootfs/etc/modprobe.d/broadcom-wl.conf
Normal file
|
@ -0,0 +1,7 @@
|
|||
# The broadcom-wl package requires some modules to be disabled in order to use
|
||||
# wl. Since the ISO image needs to cover many hardware cases, this file
|
||||
# overrides the default blacklist in /usr/lib/modprobe.d/
|
||||
#
|
||||
# If you need to use wl, you may need to delete this file, then `rmmod` any
|
||||
# already-loaded modules that are now blacklisted before proceeding to modprobe
|
||||
# wl itself.
|
11
airootfs/etc/motd
Normal file
11
airootfs/etc/motd
Normal file
|
@ -0,0 +1,11 @@
|
|||
To install [38;2;23;147;209mArch Linux[0m follow the installation guide:
|
||||
https://wiki.archlinux.org/title/Installation_guide
|
||||
|
||||
For Wi-Fi, authenticate to the wireless network using the [35miwctl[0m utility.
|
||||
For mobile broadband (WWAN) modems, connect with the [35mmmcli[0m utility.
|
||||
Ethernet, WLAN and WWAN interfaces using DHCP should work automatically.
|
||||
|
||||
After connecting to the internet, the installation guide can be accessed
|
||||
via the convenience script [35mInstallation_guide[0m.
|
||||
|
||||
[41m [41m [41m [40m [44m [40m [41m [46m [45m [41m [46m [43m [41m [44m [45m [40m [44m [40m [41m [44m [41m [41m [46m [42m [41m [44m [43m [41m [45m [40m [40m [44m [40m [41m [44m [42m [41m [46m [44m [41m [46m [47m [0m
|
13
airootfs/etc/pacman.d/hooks/uncomment-mirrors.hook
Normal file
13
airootfs/etc/pacman.d/hooks/uncomment-mirrors.hook
Normal file
|
@ -0,0 +1,13 @@
|
|||
# remove from airootfs!
|
||||
[Trigger]
|
||||
Operation = Install
|
||||
Operation = Upgrade
|
||||
Type = Package
|
||||
Target = pacman-mirrorlist
|
||||
|
||||
[Action]
|
||||
Description = Uncommenting all mirrors in /etc/pacman.d/mirrorlist...
|
||||
When = PostTransaction
|
||||
Depends = pacman-mirrorlist
|
||||
Depends = sed
|
||||
Exec = /usr/bin/sed -i "s/#Server/Server/g" /etc/pacman.d/mirrorlist
|
|
@ -0,0 +1,18 @@
|
|||
# remove from airootfs!
|
||||
# As a workaround for https://bugs.archlinux.org/task/49347 , remove pacman hooks specific to the ISO build process.
|
||||
# If not, they would be used when pacstrap is run in the live environment.
|
||||
|
||||
[Trigger]
|
||||
Operation = Install
|
||||
Operation = Upgrade
|
||||
Operation = Remove
|
||||
Type = Package
|
||||
Target = *
|
||||
|
||||
[Action]
|
||||
Description = Work around FS#49347 by removing custom pacman hooks that are only required during ISO build...
|
||||
When = PostTransaction
|
||||
Depends = sh
|
||||
Depends = coreutils
|
||||
Depends = grep
|
||||
Exec = /bin/sh -c "rm -- $(grep -Frl 'remove from airootfs' /etc/pacman.d/hooks/)"
|
1
airootfs/etc/passwd
Normal file
1
airootfs/etc/passwd
Normal file
|
@ -0,0 +1 @@
|
|||
root:x:0:0:root:/root:/usr/bin/zsh
|
1
airootfs/etc/resolv.conf
Symbolic link
1
airootfs/etc/resolv.conf
Symbolic link
|
@ -0,0 +1 @@
|
|||
/run/systemd/resolve/stub-resolv.conf
|
1
airootfs/etc/shadow
Normal file
1
airootfs/etc/shadow
Normal file
|
@ -0,0 +1 @@
|
|||
root::14871::::::
|
3
airootfs/etc/ssh/sshd_config.d/10-archiso.conf
Normal file
3
airootfs/etc/ssh/sshd_config.d/10-archiso.conf
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Allow root login using password authentication
|
||||
PasswordAuthentication yes
|
||||
PermitRootLogin yes
|
|
@ -0,0 +1,2 @@
|
|||
[Journal]
|
||||
Storage=volatile
|
4
airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf
Normal file
4
airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf
Normal file
|
@ -0,0 +1,4 @@
|
|||
[Login]
|
||||
HandleSuspendKey=ignore
|
||||
HandleHibernateKey=ignore
|
||||
HandleLidSwitch=ignore
|
|
@ -0,0 +1,2 @@
|
|||
[Network]
|
||||
IPv6PrivacyExtensions=yes
|
24
airootfs/etc/systemd/network/20-ethernet.network
Normal file
24
airootfs/etc/systemd/network/20-ethernet.network
Normal file
|
@ -0,0 +1,24 @@
|
|||
[Match]
|
||||
# Matching with "Type=ether" causes issues with containers because it also matches virtual Ethernet interfaces (veth*).
|
||||
# See https://bugs.archlinux.org/task/70892
|
||||
# Instead match by globbing the network interface name.
|
||||
Name=en*
|
||||
Name=eth*
|
||||
|
||||
[Link]
|
||||
RequiredForOnline=routable
|
||||
|
||||
[Network]
|
||||
DHCP=yes
|
||||
MulticastDNS=yes
|
||||
|
||||
# systemd-networkd does not set per-interface-type default route metrics
|
||||
# https://github.com/systemd/systemd/issues/17698
|
||||
# Explicitly set route metric, so that Ethernet is preferred over Wi-Fi and Wi-Fi is preferred over mobile broadband.
|
||||
# Use values from NetworkManager. From nm_device_get_route_metric_default in
|
||||
# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/devices/nm-device.c
|
||||
[DHCPv4]
|
||||
RouteMetric=100
|
||||
|
||||
[IPv6AcceptRA]
|
||||
RouteMetric=100
|
20
airootfs/etc/systemd/network/20-wlan.network
Normal file
20
airootfs/etc/systemd/network/20-wlan.network
Normal file
|
@ -0,0 +1,20 @@
|
|||
[Match]
|
||||
Name=wl*
|
||||
|
||||
[Link]
|
||||
RequiredForOnline=routable
|
||||
|
||||
[Network]
|
||||
DHCP=yes
|
||||
MulticastDNS=yes
|
||||
|
||||
# systemd-networkd does not set per-interface-type default route metrics
|
||||
# https://github.com/systemd/systemd/issues/17698
|
||||
# Explicitly set route metric, so that Ethernet is preferred over Wi-Fi and Wi-Fi is preferred over mobile broadband.
|
||||
# Use values from NetworkManager. From nm_device_get_route_metric_default in
|
||||
# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/devices/nm-device.c
|
||||
[DHCPv4]
|
||||
RouteMetric=600
|
||||
|
||||
[IPv6AcceptRA]
|
||||
RouteMetric=600
|
19
airootfs/etc/systemd/network/20-wwan.network
Normal file
19
airootfs/etc/systemd/network/20-wwan.network
Normal file
|
@ -0,0 +1,19 @@
|
|||
[Match]
|
||||
Name=ww*
|
||||
|
||||
[Link]
|
||||
RequiredForOnline=routable
|
||||
|
||||
[Network]
|
||||
DHCP=yes
|
||||
|
||||
# systemd-networkd does not set per-interface-type default route metrics
|
||||
# https://github.com/systemd/systemd/issues/17698
|
||||
# Explicitly set route metric, so that Ethernet is preferred over Wi-Fi and Wi-Fi is preferred over mobile broadband.
|
||||
# Use values from NetworkManager. From nm_device_get_route_metric_default in
|
||||
# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/devices/nm-device.c
|
||||
[DHCPv4]
|
||||
RouteMetric=700
|
||||
|
||||
[IPv6AcceptRA]
|
||||
RouteMetric=700
|
4
airootfs/etc/systemd/resolved.conf.d/archiso.conf
Normal file
4
airootfs/etc/systemd/resolved.conf.d/archiso.conf
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Default systemd-resolved configuration for archiso
|
||||
|
||||
[Resolve]
|
||||
MulticastDNS=yes
|
|
@ -0,0 +1 @@
|
|||
/dev/null
|
10
airootfs/etc/systemd/system/choose-mirror.service
Normal file
10
airootfs/etc/systemd/system/choose-mirror.service
Normal file
|
@ -0,0 +1,10 @@
|
|||
[Unit]
|
||||
Description=Choose mirror from the kernel command line
|
||||
ConditionKernelCommandLine=mirror
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/local/bin/choose-mirror
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/cloud-config.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/cloud-final.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/cloud-init-local.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/cloud-init-main.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/cloud-init-network.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/ModemManager.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/systemd-networkd.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/systemd-resolved.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/systemd-timesyncd.service
|
8
airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount
Normal file
8
airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount
Normal file
|
@ -0,0 +1,8 @@
|
|||
[Unit]
|
||||
Description=Temporary /etc/pacman.d/gnupg directory
|
||||
|
||||
[Mount]
|
||||
What=tmpfs
|
||||
Where=/etc/pacman.d/gnupg
|
||||
Type=tmpfs
|
||||
Options=mode=0755,noswap
|
|
@ -0,0 +1,3 @@
|
|||
[Service]
|
||||
ExecStart=
|
||||
ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin root - $TERM
|
13
airootfs/etc/systemd/system/livecd-alsa-unmuter.service
Normal file
13
airootfs/etc/systemd/system/livecd-alsa-unmuter.service
Normal file
|
@ -0,0 +1,13 @@
|
|||
[Unit]
|
||||
Description=Unmute All Sound Card Controls For Use With The Live Arch Environment
|
||||
# This needs to run after the audio device becomes available.
|
||||
Wants=systemd-udev-settle.service
|
||||
After=systemd-udev-settle.service sound.target
|
||||
ConditionKernelCommandLine=accessibility=on
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/local/bin/livecd-sound -u
|
||||
|
||||
[Install]
|
||||
WantedBy=sound.target
|
20
airootfs/etc/systemd/system/livecd-talk.service
Normal file
20
airootfs/etc/systemd/system/livecd-talk.service
Normal file
|
@ -0,0 +1,20 @@
|
|||
[Unit]
|
||||
Description=Screen reader service
|
||||
After=livecd-alsa-unmuter.service
|
||||
Before=getty@tty1.service
|
||||
ConditionKernelCommandLine=accessibility=on
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
TTYPath=/dev/tty13
|
||||
ExecStartPre=/usr/bin/chvt 13
|
||||
ExecStart=/usr/local/bin/livecd-sound -p
|
||||
ExecStartPost=/usr/bin/chvt 1
|
||||
ExecStartPost=systemctl start espeakup.service
|
||||
StandardInput=tty
|
||||
TTYVHangup=yes
|
||||
TTYVTDisallocate=yes
|
||||
RemainAfterExit=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/ModemManager.service
|
|
@ -0,0 +1 @@
|
|||
../choose-mirror.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/hv_fcopy_daemon.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/hv_kvp_daemon.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/hv_vss_daemon.service
|
1
airootfs/etc/systemd/system/multi-user.target.wants/iwd.service
Symbolic link
1
airootfs/etc/systemd/system/multi-user.target.wants/iwd.service
Symbolic link
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/iwd.service
|
|
@ -0,0 +1 @@
|
|||
/etc/systemd/system/livecd-talk.service
|
|
@ -0,0 +1 @@
|
|||
../pacman-init.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/reflector.service
|
1
airootfs/etc/systemd/system/multi-user.target.wants/sshd.service
Symbolic link
1
airootfs/etc/systemd/system/multi-user.target.wants/sshd.service
Symbolic link
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/sshd.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/systemd-networkd.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/systemd-resolved.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/vboxservice.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/vmtoolsd.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/vmware-vmblock-fuse.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/systemd-networkd-wait-online.service
|
15
airootfs/etc/systemd/system/pacman-init.service
Normal file
15
airootfs/etc/systemd/system/pacman-init.service
Normal file
|
@ -0,0 +1,15 @@
|
|||
[Unit]
|
||||
Description=Initializes Pacman keyring
|
||||
Requires=etc-pacman.d-gnupg.mount
|
||||
After=etc-pacman.d-gnupg.mount time-sync.target
|
||||
BindsTo=etc-pacman.d-gnupg.mount
|
||||
Before=archlinux-keyring-wkd-sync.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/usr/bin/pacman-key --init
|
||||
ExecStart=/usr/bin/pacman-key --populate
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -0,0 +1,6 @@
|
|||
[Unit]
|
||||
ConditionKernelCommandLine=!mirror
|
||||
|
||||
[Service]
|
||||
Restart=on-failure
|
||||
RestartSec=10
|
1
airootfs/etc/systemd/system/sockets.target.wants/pcscd.socket
Symbolic link
1
airootfs/etc/systemd/system/sockets.target.wants/pcscd.socket
Symbolic link
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/pcscd.socket
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/systemd-networkd.socket
|
|
@ -0,0 +1 @@
|
|||
../livecd-alsa-unmuter.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/systemd-time-wait-sync.service
|
|
@ -0,0 +1 @@
|
|||
/usr/lib/systemd/system/systemd-timesyncd.service
|
|
@ -0,0 +1,6 @@
|
|||
# Allow systemd-networkd-wait-online to succeed with one interface, otherwise, if multiple network interfaces exist,
|
||||
# network-online.target gets needlessly delayed.
|
||||
# See https://wiki.archlinux.org/title/systemd-networkd#systemd-networkd-wait-online
|
||||
[Service]
|
||||
ExecStart=
|
||||
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --any
|
8
airootfs/etc/xdg/reflector/reflector.conf
Normal file
8
airootfs/etc/xdg/reflector/reflector.conf
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Reflector configuration file for the systemd service.
|
||||
|
||||
--save /etc/pacman.d/mirrorlist
|
||||
--ipv4
|
||||
--ipv6
|
||||
--protocol https
|
||||
--latest 20
|
||||
--sort rate
|
44
airootfs/root/.automated_script.sh
Executable file
44
airootfs/root/.automated_script.sh
Executable file
|
@ -0,0 +1,44 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
script_cmdline() {
|
||||
local param
|
||||
for param in $(</proc/cmdline); do
|
||||
case "${param}" in
|
||||
script=*)
|
||||
echo "${param#*=}"
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
automated_script() {
|
||||
local script rt
|
||||
script="$(script_cmdline)"
|
||||
if [[ -n "${script}" && ! -x /tmp/startup_script ]]; then
|
||||
if [[ "${script}" =~ ^((http|https|ftp|tftp)://) ]]; then
|
||||
# there's no synchronization for network availability before executing this script
|
||||
printf '%s: waiting for network-online.target\n' "$0"
|
||||
until systemctl --quiet is-active network-online.target; do
|
||||
sleep 1
|
||||
done
|
||||
printf '%s: downloading %s\n' "$0" "${script}"
|
||||
curl "${script}" --location --retry-connrefused --retry 10 --fail -s -o /tmp/startup_script
|
||||
rt=$?
|
||||
else
|
||||
cp "${script}" /tmp/startup_script
|
||||
rt=$?
|
||||
fi
|
||||
if [[ ${rt} -eq 0 ]]; then
|
||||
chmod +x /tmp/startup_script
|
||||
printf '%s: executing automated script\n' "$0"
|
||||
# note that script is executed when other services (like pacman-init) may be still in progress, please
|
||||
# synchronize to "systemctl is-system-running --wait" when your script depends on other services
|
||||
/tmp/startup_script
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ $(tty) == "/dev/tty1" ]]; then
|
||||
automated_script
|
||||
fi
|
4
airootfs/root/.gnupg/scdaemon.conf
Normal file
4
airootfs/root/.gnupg/scdaemon.conf
Normal file
|
@ -0,0 +1,4 @@
|
|||
disable-ccid
|
||||
disable-pinpad
|
||||
pcsc-driver /usr/lib/libpcsclite.so
|
||||
pcsc-shared
|
6
airootfs/root/.zlogin
Normal file
6
airootfs/root/.zlogin
Normal file
|
@ -0,0 +1,6 @@
|
|||
# fix for screen readers
|
||||
if grep -Fqa 'accessibility=' /proc/cmdline &> /dev/null; then
|
||||
setopt SINGLE_LINE_ZLE
|
||||
fi
|
||||
|
||||
~/.automated_script.sh
|
5
airootfs/usr/local/bin/Installation_guide
Executable file
5
airootfs/usr/local/bin/Installation_guide
Executable file
|
@ -0,0 +1,5 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
exec lynx 'https://wiki.archlinux.org/title/Installation_guide'
|
29
airootfs/usr/local/bin/choose-mirror
Executable file
29
airootfs/usr/local/bin/choose-mirror
Executable file
|
@ -0,0 +1,29 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
get_cmdline() {
|
||||
local param
|
||||
for param in $(</proc/cmdline); do
|
||||
case "${param}" in
|
||||
"${1}="*)
|
||||
echo "${param##*=}"
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
mirror="$(get_cmdline mirror)"
|
||||
[[ "$mirror" == 'auto' ]] && mirror="$(get_cmdline archiso_http_srv)"
|
||||
[[ -n "$mirror" ]] || exit 0
|
||||
|
||||
mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.orig
|
||||
cat >/etc/pacman.d/mirrorlist <<EOF
|
||||
#
|
||||
# Arch Linux repository mirrorlist
|
||||
# Generated by archiso
|
||||
#
|
||||
|
||||
Server = ${mirror%%/}/\$repo/os/\$arch
|
||||
EOF
|
239
airootfs/usr/local/bin/livecd-sound
Executable file
239
airootfs/usr/local/bin/livecd-sound
Executable file
|
@ -0,0 +1,239 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
usage() {
|
||||
cat <<-_EOF_
|
||||
live cd sound helper script.
|
||||
Usage: livecdsound [OPTION]
|
||||
OPTIONS
|
||||
-u, --unmute unmute all sound cards
|
||||
-p, --pick select a card for speetch output
|
||||
-h, --help Show this usage message
|
||||
|
||||
_EOF_
|
||||
}
|
||||
|
||||
bugout() {
|
||||
printf "/usr/local/bin/livecdsound: programming error"
|
||||
stat_fail
|
||||
}
|
||||
|
||||
echo_card_indices() {
|
||||
if [[ -f /proc/asound/cards ]]; then
|
||||
sed -n -e's/^[[:space:]]*\([0-7]\)[[:space:]].*/\1/p' /proc/asound/cards
|
||||
fi
|
||||
}
|
||||
|
||||
# The following functions try to set many controls.
|
||||
# No card has all the controls and so some of the attempts are bound to fail.
|
||||
# Because of this, the functions can't return useful status values.
|
||||
|
||||
# $1 <card id>
|
||||
# $2 <control>
|
||||
# $3 <level>
|
||||
unmute_and_set_level() {
|
||||
[[ -n "$3" && -n "$2" && -n "$1" ]] || bugout
|
||||
systemd-cat -t "livecdsound" printf "Setting: %s on card: %s to %s\n" "$2" "$1" "$3"
|
||||
systemd-cat -t "livecdsound" amixer -c "$1" set "$2" "$3" unmute
|
||||
return 0
|
||||
}
|
||||
|
||||
# $1 <card id>
|
||||
# $2 <control>
|
||||
mute_and_zero_level() {
|
||||
[[ -n "$1" && -n "$2" ]] || bugout
|
||||
systemd-cat -t "livecdsound" printf "Muting control: %s on card: %s\n" "$2" "$1"
|
||||
systemd-cat -t "livecdsound" amixer -c "$1" set "$2" "0%" mute
|
||||
return 0
|
||||
}
|
||||
|
||||
# $1 <card ID>
|
||||
# $2 <control>
|
||||
# $3 "on" | "off"
|
||||
switch_control() {
|
||||
[[ -n "$3" && -n "$1" ]] || bugout
|
||||
systemd-cat -t "livecdsound" printf "Switching control: %s on card: %s to %s\n" "$2" "$1" "$3"
|
||||
systemd-cat -t "livecdsound" amixer -c "$1" set "$2" "$3"
|
||||
return 0
|
||||
}
|
||||
|
||||
# $1 <card ID>
|
||||
sanify_levels_on_card() {
|
||||
unmute_and_set_level "$1" "Front" "80%"
|
||||
unmute_and_set_level "$1" "Master" "80%"
|
||||
unmute_and_set_level "$1" "Master Mono" "80%"
|
||||
unmute_and_set_level "$1" "Master Digital" "80%" # E.g., cs4237B
|
||||
unmute_and_set_level "$1" "Playback" "80%"
|
||||
unmute_and_set_level "$1" "Headphone" "100%"
|
||||
unmute_and_set_level "$1" "PCM" "80%"
|
||||
unmute_and_set_level "$1" "PCM,1" "80%" # E.g., ess1969
|
||||
unmute_and_set_level "$1" "DAC" "80%" # E.g., envy24, cs46xx
|
||||
unmute_and_set_level "$1" "DAC,0" "80%" # E.g., envy24
|
||||
unmute_and_set_level "$1" "DAC,1" "80%" # E.g., envy24
|
||||
unmute_and_set_level "$1" "Synth" "80%"
|
||||
unmute_and_set_level "$1" "CD" "80%"
|
||||
unmute_and_set_level "$1" "PC Speaker" "100%"
|
||||
|
||||
mute_and_zero_level "$1" "Mic"
|
||||
mute_and_zero_level "$1" "IEC958" # Ubuntu #19648
|
||||
|
||||
# Intel P4P800-MX
|
||||
switch_control "$1" "Master Playback Switch" on
|
||||
switch_control "$1" "Master Surround" on
|
||||
|
||||
# Trident/YMFPCI/emu10k1:
|
||||
unmute_and_set_level "$1" "Wave" "80%"
|
||||
unmute_and_set_level "$1" "Music" "80%"
|
||||
unmute_and_set_level "$1" "AC97" "80%"
|
||||
|
||||
# DRC:
|
||||
unmute_and_set_level "$1" "Dynamic Range Compression" "80%"
|
||||
|
||||
# Required for HDA Intel (hda-intel):
|
||||
unmute_and_set_level "$1" "Front" "80%"
|
||||
|
||||
# Required for SB Live 7.1/24-bit (ca0106):
|
||||
unmute_and_set_level "$1" "Analog Front" "80%"
|
||||
|
||||
# Required at least for Via 823x hardware on DFI K8M800-MLVF Motherboard
|
||||
switch_control "$1" "IEC958 Capture Monitor" off
|
||||
|
||||
# Required for hardware allowing toggles for AC97 through IEC958,
|
||||
# valid values are 0, 1, 2, 3. Needs to be set to 0 for PCM1.
|
||||
unmute_and_set_level "$1" "IEC958 Playback AC97-SPSA" "0"
|
||||
|
||||
# Required for newer Via hardware
|
||||
unmute_and_set_level "$1" "VIA DXS,0" "80%"
|
||||
unmute_and_set_level "$1" "VIA DXS,1" "80%"
|
||||
unmute_and_set_level "$1" "VIA DXS,2" "80%"
|
||||
unmute_and_set_level "$1" "VIA DXS,3" "80%"
|
||||
|
||||
# Required on some notebooks with ICH4:
|
||||
switch_control "$1" "Headphone Jack Sense" off
|
||||
switch_control "$1" "Line Jack Sense" off
|
||||
|
||||
# Some machines need one or more of these to be on;
|
||||
# others need one or more of these to be off:
|
||||
|
||||
switch_control "$1" "Audigy Analog/Digital Output Jack" on
|
||||
switch_control "$1" "SB Live Analog/Digital Output Jack" on
|
||||
|
||||
# D1984 -- Thinkpad T61/X61
|
||||
switch_control "$1" "Speaker" on
|
||||
switch_control "$1" "Headphone" on
|
||||
|
||||
# HDA-Intel w/ "Digital" capture mixer (See Ubuntu #193823)
|
||||
unmute_and_set_level "$1" "Digital" "80%"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# $1 <card ID> | "all"
|
||||
sanify_levels() {
|
||||
local ttsdml_returnstatus=0
|
||||
local card
|
||||
case "$1" in
|
||||
all)
|
||||
for card in $(echo_card_indices); do
|
||||
sanify_levels_on_card "$card" || ttsdml_returnstatus=1
|
||||
done
|
||||
;;
|
||||
*)
|
||||
sanify_levels_on_card "$1" || ttsdml_returnstatus=1
|
||||
;;
|
||||
esac
|
||||
return "$ttsdml_returnstatus"
|
||||
}
|
||||
|
||||
# List all cards that *should* be usable for PCM audio. In my experience,
|
||||
# the console speaker (handled by the pcsp driver) isn't a suitable playback
|
||||
# device, so we'll exclude it.
|
||||
list_non_pcsp_cards() {
|
||||
for card in $(echo_card_indices); do
|
||||
local cardfile="/proc/asound/card${card}/id"
|
||||
if [[ -r "$cardfile" && -f "$cardfile" && "$(cat "$cardfile")" != pcsp ]]; then
|
||||
echo "$card"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Properly initialize the sound card so that we have audio at boot.
|
||||
unmute_all_cards() {
|
||||
sanify_levels all
|
||||
}
|
||||
|
||||
is_numeric() {
|
||||
local str="$1"
|
||||
[[ "$str" =~ ^[0-9]+$ ]]
|
||||
}
|
||||
|
||||
set_default_card() {
|
||||
local card="$1"
|
||||
sed -e "s/%card%/$card/g" </usr/local/share/livecd-sound/asound.conf.in \
|
||||
>/etc/asound.conf
|
||||
}
|
||||
|
||||
play_on_card() {
|
||||
local card="$1" file="$2"
|
||||
aplay -q "-Dplughw:$card,0" "$file"
|
||||
}
|
||||
|
||||
# If there are multiple usable sound cards, prompt the user to choose one,
|
||||
# using auditory feedback.
|
||||
pick_a_card() {
|
||||
set -f
|
||||
usable_cards="$(list_non_pcsp_cards)"
|
||||
num_usable_cards="$(wc -w <<<"$usable_cards")"
|
||||
|
||||
if (( num_usable_cards == 1 )); then
|
||||
systemd-cat -t "livecdsound" printf "Only one sound card is detected\n"
|
||||
exit 0
|
||||
fi
|
||||
systemd-cat -t "livecdsound" printf "multiple sound cards detected\n"
|
||||
for card in "${usable_cards[@]}"; do
|
||||
if ! is_numeric "$card"; then
|
||||
continue
|
||||
fi
|
||||
play_on_card "$card" /usr/share/livecd-sounds/pick-a-card.wav &
|
||||
done
|
||||
wait
|
||||
sleep 1
|
||||
for card in "${usable_cards[@]}"; do
|
||||
if ! is_numeric "$card"; then
|
||||
continue
|
||||
fi
|
||||
play_on_card "$card" /usr/share/livecd-sounds/beep.wav
|
||||
if read -r -t 10; then
|
||||
systemd-cat -t "livecdsound" printf "Selecting %s sound card as default\n" "$card"
|
||||
set_default_card "$card"
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
if (( $# == 0 )); then
|
||||
echo "error: No argument passed."
|
||||
exit 1
|
||||
fi
|
||||
while [[ "${1}" != "" ]]; do
|
||||
case ${1} in
|
||||
-h|--help)
|
||||
usage
|
||||
exit
|
||||
;;
|
||||
-u|--unmute)
|
||||
systemd-cat -t "livecdsound" printf "Unmuting all cards"
|
||||
unmute_all_cards
|
||||
;;
|
||||
-p|--pick)
|
||||
pick_a_card
|
||||
;;
|
||||
*)
|
||||
echo "error: Unsupported argument"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
3
airootfs/usr/local/share/livecd-sound/asound.conf.in
Normal file
3
airootfs/usr/local/share/livecd-sound/asound.conf.in
Normal file
|
@ -0,0 +1,3 @@
|
|||
Defaults node
|
||||
defaults.ctl.card %card%;
|
||||
defaults.pcm.card %card%;
|
Loading…
Add table
Add a link
Reference in a new issue