Handbook 3.7: minor formatting fixes
This commit is contained in:
parent
7a0e0f04b8
commit
71c841f91d
@ -14,7 +14,8 @@ The following runlevels are used in CRUX (defined in %fn%/etc/inittab%%).
|
|||||||
|
|
||||||
!!! Layout
|
!!! Layout
|
||||||
|
|
||||||
The initialization scripts used in CRUX follow the BSD-style (as opposed to the SysV-style) and have the following layout.
|
The initialization scripts used in CRUX follow the BSD-style (as opposed to the
|
||||||
|
SysV-style) and have the following layout.
|
||||||
|
|
||||||
||cellpadding="3" rules="all" frame="box"
|
||cellpadding="3" rules="all" frame="box"
|
||||||
||! File ||! Description
|
||! File ||! Description
|
||||||
@ -27,7 +28,8 @@ The initialization scripts used in CRUX follow the BSD-style (as opposed to the
|
|||||||
||%fn%/etc/rc.conf%% ||System configuration
|
||%fn%/etc/rc.conf%% ||System configuration
|
||||||
||%fn%/etc/rc.d/%% ||Service start/stop script directory
|
||%fn%/etc/rc.d/%% ||Service start/stop script directory
|
||||||
|
|
||||||
Modify %fn%/etc/rc.modules%%, %fn%/etc/rc.local%% and %fn%/etc/rc.conf%% according to your needs.
|
Modify %fn%/etc/rc.modules%%, %fn%/etc/rc.local%% and %fn%/etc/rc.conf%%
|
||||||
|
according to your needs.
|
||||||
|
|
||||||
!!! [[#ConfigurationVariables]] Configuration Variables in /etc/rc.conf
|
!!! [[#ConfigurationVariables]] Configuration Variables in /etc/rc.conf
|
||||||
|
|
||||||
@ -38,17 +40,22 @@ The following configuration variables are found in %fn%/etc/rc.conf%%.
|
|||||||
(:cell align=center:)'''Description'''
|
(:cell align=center:)'''Description'''
|
||||||
(:cellnr valign=center:)FONT
|
(:cellnr valign=center:)FONT
|
||||||
(:cell:)
|
(:cell:)
|
||||||
Specifies which console font to load at system startup. The contents of this variable will be passed as argument to '''setfont(1)'''. The available fonts are located in %fn%/usr/share/kbd/consolefonts/%%.
|
Specifies which console font to load at system startup. The contents of this
|
||||||
|
variable will be passed as argument to '''setfont(1)'''. The available fonts are
|
||||||
|
located in %fn%/usr/share/kbd/consolefonts/%%.
|
||||||
|
|
||||||
[-Example:-] @@FONT=default@@
|
[-Example:-] @@FONT=default@@
|
||||||
(:cellnr valign=center:)KEYMAP
|
(:cellnr valign=center:)KEYMAP
|
||||||
(:cell:)
|
(:cell:)
|
||||||
Specifies which console keyboard map to load at system startup. The contents of this variable will be passed as argument to '''loadkeys(1)'''. The available keyboard maps are located in %fn%/usr/share/kbd/keymaps/%%.
|
Specifies which console keyboard map to load at system startup. The contents of
|
||||||
|
this variable will be passed as argument to '''loadkeys(1)'''. The available
|
||||||
|
keyboard maps are located in %fn%/usr/share/kbd/keymaps/%%.
|
||||||
|
|
||||||
[-Example:-] @@KEYMAP=sv-latin1@@
|
[-Example:-] @@KEYMAP=sv-latin1@@
|
||||||
(:cellnr valign=center:)TIMEZONE
|
(:cellnr valign=center:)TIMEZONE
|
||||||
(:cell:)
|
(:cell:)
|
||||||
Specifies the timezone used by the system. The available zone description files are located in %fn%/usr/share/zoneinfo/%%.
|
Specifies the timezone used by the system. The available zone description files
|
||||||
|
are located in %fn%/usr/share/zoneinfo/%%.
|
||||||
|
|
||||||
[-Example:-] @@TIMEZONE=Europe/Stockholm@@
|
[-Example:-] @@TIMEZONE=Europe/Stockholm@@
|
||||||
(:cellnr valign=center:)HOSTNAME
|
(:cellnr valign=center:)HOSTNAME
|
||||||
@ -63,16 +70,24 @@ Specifies the system logging daemon(s) to run at startup.
|
|||||||
[-Example:-] @@SYSLOG=sysklogd@@
|
[-Example:-] @@SYSLOG=sysklogd@@
|
||||||
(:cellnr valign=center:)SERVICES
|
(:cellnr valign=center:)SERVICES
|
||||||
(:cell:)
|
(:cell:)
|
||||||
Specifies which services to start at system startup. The services specified in this array must have a matching start/stop script in %fn%/etc/rc.d/%%. When entering multi-user mode the specified scripts will be called in the specified order with the argument '''start'''. At system shutdown or when entering single-user mode these scripts will be called in the reverse order with the argument '''stop'''.
|
Specifies which services to start at system startup. The services specified in
|
||||||
|
this array must have a matching start/stop script in %fn%/etc/rc.d/%%. When
|
||||||
|
entering multi-user mode the specified scripts will be called in the specified
|
||||||
|
order with the argument '''start'''. At system shutdown or when entering
|
||||||
|
single-user mode these scripts will be called in the reverse order with the
|
||||||
|
argument '''stop'''.
|
||||||
|
|
||||||
[-Example:-] @@SERVICES=(crond lo net sshd)@@
|
[-Example:-] @@SERVICES=(crond lo net sshd)@@
|
||||||
(:tableend:)
|
(:tableend:)
|
||||||
|
|
||||||
!!! [[#LocaleGeneration]] Generating locales
|
!!! [[#LocaleGeneration]] Generating locales
|
||||||
Starting with CRUX 2.5, glibc does not contain all possible locales anymore, thus you'll have to generate the locales you
|
Starting with CRUX 2.5, glibc does not contain all possible locales anymore,
|
||||||
need/use. To ensure proper operation of %fn%pkgmk%%, the locale C.UTF-8 is generated as part of the CRUX installation. Any
|
thus you'll have to generate the locales you need/use. To ensure proper
|
||||||
other desired locales must be created by the administrator. A typical setup for swedish users would use the following
|
operation of %fn%pkgmk%%, the locale C.UTF-8 is generated as part of the CRUX
|
||||||
commands, so replace @@sv_SE*@@ with the locale you want:
|
installation. Any other desired locales must be created by the administrator. A
|
||||||
|
typical setup for swedish users would use the following commands, so replace
|
||||||
|
@@sv_SE*@@ with the locale you want:
|
||||||
|
|
||||||
# localedef -i sv_SE -f ISO-8859-1 sv_SE
|
# localedef -i sv_SE -f ISO-8859-1 sv_SE
|
||||||
# localedef -i sv_SE -f ISO-8859-1 sv_SE.ISO-8859-1
|
# localedef -i sv_SE -f ISO-8859-1 sv_SE.ISO-8859-1
|
||||||
# localedef -i sv_SE -f UTF-8 sv_SE.UTF-8
|
# localedef -i sv_SE -f UTF-8 sv_SE.UTF-8
|
||||||
@ -80,7 +95,10 @@ commands, so replace @@sv_SE*@@ with the locale you want:
|
|||||||
|
|
||||||
!!! Network Configuration
|
!!! Network Configuration
|
||||||
|
|
||||||
The network configuration is found in the service script %fn%/etc/rc.d/net%%. To enable this service you need to add net to the SERVICES array in %fn%/etc/rc.conf%%. By default this service script configures a dynamic IP address. Example:
|
The network configuration is found in the service script %fn%/etc/rc.d/net%%. To
|
||||||
|
enable this service you need to add net to the SERVICES array in
|
||||||
|
%fn%/etc/rc.conf%%. By default this service script configures a dynamic IP
|
||||||
|
address. Example:
|
||||||
|
|
||||||
[@
|
[@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
@ -132,7 +150,9 @@ esac
|
|||||||
# End of file
|
# End of file
|
||||||
@]
|
@]
|
||||||
|
|
||||||
If you want to configure your system to use a static IP address, specify TYPE=static and the correct interface. You will also need to configure DNS settings in /etc/resolv.conf. Example:
|
If you want to configure your system to use a static IP address, specify
|
||||||
|
TYPE=static and the correct interface. You will also need to configure DNS
|
||||||
|
settings in /etc/resolv.conf. Example:
|
||||||
|
|
||||||
[@
|
[@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
@ -195,54 +215,75 @@ nameserver your DNS server>
|
|||||||
# End of file
|
# End of file
|
||||||
@]
|
@]
|
||||||
|
|
||||||
To associate with a password-protected wireless network, you should first create a configuration file for
|
To associate with a WPA2-protected wireless network, you should first create a
|
||||||
%fn%wpa_supplicant%% to use, then launch wpa_supplicant on that interface.
|
configuration file for %fn%wpa_supplicant%% to use, then launch wpa_supplicant
|
||||||
|
on that interface.
|
||||||
|
|
||||||
$ wpa-passphrase MYNETWORK MYPASSWORD > /etc/wpa_supplicant-wlan0.conf
|
$ wpa-passphrase MYNETWORK MYPASSWORD > /etc/wpa_supplicant-wlan0.conf
|
||||||
$ wpa_supplicant -i wlan0 -c /etc/wpa_supplicant-wlan0.conf
|
$ wpa_supplicant -i wlan0 -c /etc/wpa_supplicant-wlan0.conf
|
||||||
|
|
||||||
-> Replace '''wlan0''' with the name of your actual network interface. Run %fn%ip link%% to see the list of all available
|
-> Replace '''wlan0''' with the name of your actual network interface. Run
|
||||||
interfaces.
|
%fn%ip link%% to see the list of all available interfaces.
|
||||||
|
|
||||||
If the %fn%wpa_supplicant%% output indicates a successful authentication, you can background the process and run
|
If the %fn%wpa_supplicant%% output indicates a successful authentication, you
|
||||||
%fn%dhcpcd wlan0%% to request an address from the DHCP server.
|
can background the process and run %fn%dhcpcd wlan0%% to request an address from
|
||||||
|
the DHCP server.
|
||||||
|
|
||||||
The '''wpa_supplicant''' package provides two startup scripts in %fn%/etc/rc.d%%. You might choose to put '''wlan''' in the
|
The '''wpa_supplicant''' package provides two startup scripts in
|
||||||
SERVICES array of %fn%/etc/rc.conf%% (replacing '''net'''), which will let %fn%wpa_supplicant%% manage all your
|
%fn%/etc/rc.d%%. You might choose to put '''wlan''' in the SERVICES array of
|
||||||
network interfaces. Another option is to let the '''net''' startup script call %fn%wpa_supplicant%% as needed, by copying
|
%fn%/etc/rc.conf%% (replacing '''net'''), which will let %fn%wpa_supplicant%%
|
||||||
into %fn%/lib/dhcpcd/dhcpcd-hooks/%% the example file %fn%/usr/share/dhcpcd/hooks/10-wpa_supplicant%%.
|
manage all your network interfaces. Another option is to let the '''net'''
|
||||||
|
startup script call %fn%wpa_supplicant%% as needed, by copying into
|
||||||
|
%fn%/lib/dhcpcd/dhcpcd-hooks/%% the example file
|
||||||
|
%fn%/usr/share/dhcpcd/hooks/10-wpa_supplicant%%.
|
||||||
|
|
||||||
!! Passwords and User Environment
|
!! Passwords and User Environment
|
||||||
|
|
||||||
CRUX uses SHA512 passwords by default. To change the password encryption method set the ENCRYPT_METHOD variable in %fn%/etc/login.defs%% to DES, MD5 or SHA256.
|
CRUX uses SHA512 passwords by default. To change the password encryption method
|
||||||
|
set the ENCRYPT_METHOD variable in %fn%/etc/login.defs%% to DES, MD5 or SHA256.
|
||||||
|
|
||||||
Furthermore, when compiling programs that use the @@crypt(3)@@ function to authenticate users you should make sure that these programs are linked against the %fn%libcrypt%% library (i.e. use '''-lcrypt''' when linking) which contains the SHA512 version of the crypt function (this version is backwards compatible and understands DES passwords as well).
|
Furthermore, when compiling programs that use the @@crypt(3)@@ function to
|
||||||
|
authenticate users you should make sure that these programs are linked against
|
||||||
|
the %fn%libcrypt%% library (i.e. use '''-lcrypt''' when linking) which contains
|
||||||
|
the SHA512 version of the crypt function (this version is backwards compatible
|
||||||
|
and understands DES passwords as well).
|
||||||
|
|
||||||
Also configurable in %fn%/etc/login.defs%% are the settings that govern how @@useradd(8)@@ behaves when you create a new
|
Also configurable in %fn%/etc/login.defs%% are the settings that govern how
|
||||||
non-root user, such as CREATE_HOME and USERGROUPS_ENAB. First-time CRUX administrators might be surprised to learn that
|
@@useradd(8)@@ behaves when you create a new non-root user, such as CREATE_HOME
|
||||||
creating a new user via %fn%useradd -m%% will not automatically populate the home directory with a basic shell
|
and USERGROUPS_ENAB. First-time CRUX administrators might be surprised to learn
|
||||||
startup file, as happens on other Linux distributions whose %fn%/etc/skel/%% contains their idea of an initial home
|
that creating a new user via %fn%useradd -m%% will not automatically populate
|
||||||
directory. No such decisions are imposed on CRUX administrators, who get to work with the upstream tools in their
|
the home directory with a basic shell startup file, as happens on other Linux
|
||||||
unmodified state.
|
distributions whose %fn%/etc/skel/%% contains their idea of an initial home
|
||||||
|
directory. No such decisions are imposed on CRUX administrators, who get to work
|
||||||
|
with the upstream tools in their unmodified state.
|
||||||
|
|
||||||
The core packages '''linux-pam''' and '''dumb_runtime_dir''' provide a number of modules that can be loaded upon
|
The core packages '''linux-pam''' and '''dumb_runtime_dir''', and the contrib
|
||||||
successful login. The files in %fn%/etc/pam.d%% govern the association between the type of login (eg., tty, SSH, su, X
|
package '''pam_xdg''', provide a number of modules that can be loaded upon
|
||||||
Display Manager) and the modules that get loaded (eg., pam_env, pam_exec, pam_limits). Read the manpage for any PAM module
|
logging in. The files in %fn%/etc/pam.d%% govern the association between
|
||||||
of interest, to learn how it might be configured for your needs. Some typical situations that can be solved with PAM
|
the type of login (eg., tty, SSH, su, X Display Manager) and the modules that
|
||||||
modules are listed in the table below.
|
get loaded (eg., pam_env, pam_exec, pam_limits). Some typical situations that
|
||||||
|
can be handled cleanly with PAM modules are listed in the table below.
|
||||||
|
|
||||||
||cellpadding="3" rules="all" frame="box"
|
||cellpadding="3" rules="all" frame="box"
|
||||||
||! file in /etc/pam.d ||! Typical usage
|
||! file in /etc/pam.d ||! Typical usage
|
||||||
||%fn%pam_env.so%% || export some mandatory environment variables, no matter what login shell the user has chosen
|
||%fn%pam_env.so%% || export some common environment variables, no matter what login shell the user has chosen
|
||||||
||%fn%pam_limits.so%% || increase the allowed number of opened files, to ensure proper operation of some games
|
||%fn%pam_limits.so%% || increase the allowed number of opened files, to ensure proper operation of some games
|
||||||
||%fn%pam_xauth.so%% || grant another user access to the X display of the logged-in user, so that programs invoked with ''su'' can work properly
|
||%fn%pam_xauth.so%% || grant another user access to the X display of the logged-in user, so that programs invoked with ''su'' can work properly
|
||||||
||%fn%pam_mount.so%% || automatically mount a LUKS-encrypted home partition
|
||%fn%pam_mount.so%% || automatically mount a LUKS-encrypted home partition after successful authentication
|
||||||
||%fn%pam_dumb_runtime_dir.so%% || create an XDG_RUNTIME_DIR for applications that conform to the freedesktop.org specification
|
||%fn%pam_dumb_runtime_dir.so%% || create an XDG_RUNTIME_DIR for applications that conform to the freedesktop.org specification
|
||||||
|
||%fn%pam_xdg.so%% || export the XDG environment variables defined in the freedesktop.org specification
|
||||||
|
|
||||||
|
If you find yourself in one of the situations in the table above, read the man
|
||||||
|
page for the corresponding PAM module to learn how to accomplish the desired
|
||||||
|
configuration.
|
||||||
|
|
||||||
!! Upgrading the Kernel
|
!! Upgrading the Kernel
|
||||||
|
|
||||||
The kernel source, which is found in %fn%/usr/src/linux-5.15.x/%% is not installed using '''pkgadd'''. If you decide to
|
The kernel source, which is found in %fn%/usr/src/linux-5.15.x/%% is not
|
||||||
upgrade your kernel you can safely do so by manually replacing the kernel source with a newer version (or place it
|
installed using '''pkgadd'''. If you decide to upgrade your kernel you can
|
||||||
somewhere else). This will not make the package database inconsistent (since it's not installed with '''pkgadd''') nor
|
safely do so by manually replacing the kernel source with a newer version (or
|
||||||
will it affect the kernel headers found in %fn%/usr/include/linux%% and %fn%/usr/include/asm%% since these are not
|
unpack the newer source tree somewhere else). This will not make the package
|
||||||
symlinks to the kernel source, but instead contain copies of the headers.
|
database inconsistent (since it's not installed with '''pkgadd''') nor will it
|
||||||
|
affect the kernel headers found in %fn%/usr/include/linux%% and
|
||||||
|
%fn%/usr/include/asm%% since these are not symlinks to the kernel source, but
|
||||||
|
instead contain copies of the headers.
|
||||||
|
@ -1,43 +1,71 @@
|
|||||||
|
|
||||||
[[Profiles.PerLiden | Per Lidén]] wrote this handbook. RobertMcMeekin converted it to DocBook, the [[About | CRUX team]] made a Wiki version. Numerous others have given feedback and improvement suggestions.
|
[[Profiles.PerLiden | Per Lidén]] wrote this handbook. RobertMcMeekin converted
|
||||||
|
it to DocBook, the [[About | CRUX team]] made a Wiki version. Numerous others
|
||||||
|
have given feedback and improvement suggestions.
|
||||||
|
|
||||||
! Introduction
|
! Introduction
|
||||||
|
|
||||||
!! What is CRUX?
|
!! What is CRUX?
|
||||||
|
|
||||||
CRUX is a lightweight Linux distribution for the x86-64 architecture targeted at experienced Linux users. The primary focus of this distribution is "keep it simple",
|
CRUX is a lightweight Linux distribution for the x86-64 architecture targeted at
|
||||||
which it reflects in a simple tar.gz-based package system, BSD-style initscripts, and a relatively small collection of trimmed packages. The secondary focus is
|
experienced Linux users. The primary focus of this distribution is "keep it
|
||||||
utilization of new Linux features and recent tools and libraries. CRUX also has a ports system which makes it easy to install and upgrade applications.
|
simple", which it reflects in a simple tar.gz-based package system, BSD-style
|
||||||
|
initscripts, and a relatively small collection of trimmed packages. The
|
||||||
|
secondary focus is utilization of new Linux features and recent tools and
|
||||||
|
libraries. CRUX also has a ports system which makes it easy to install and
|
||||||
|
upgrade applications.
|
||||||
|
|
||||||
!! Why use CRUX?
|
!! Why use CRUX?
|
||||||
|
|
||||||
There are many Linux distributions out there these days, so what makes CRUX such an appealing choice to its users?
|
There are many Linux distributions out there these days, so what makes CRUX such
|
||||||
The choice of distribution is a matter of taste, really. Here are a few hints about the tastes and goals of the people behind CRUX.
|
an appealing choice to its users? The choice of distribution is a matter of
|
||||||
CRUX is made with simplicity in mind from beginning to end. Making it easy to create new and update old packages is essential; updating a package in CRUX is often
|
taste, really. Here are a few hints about the tastes and goals of the people
|
||||||
just a matter of typing %fn%sudo prt-get update $MYPKG%%.
|
behind CRUX. CRUX is made with simplicity in mind from beginning to end. Making
|
||||||
The usage of ports helps keep your packages up to date; not the latest bleeding-edge-alpha version, but the latest stable version.
|
it easy to create new and update old packages is essential; updating a package
|
||||||
Other features include creating packages optimized for your processor, eg. by compiling with -march=x86-64, and avoiding cluttering the filesystem with files you'll never use, eg. /usr/doc/*, etc. If you need more information about a specific program, other than information found in the man-page, Google usually knows all about it.
|
in CRUX is often just a matter of typing %fn%sudo prt-get update $MYPKG%%.
|
||||||
Although CRUX strives to use new features as they become available, you will never have to deal with a frenzy of innovation that leaves you with an unrecognizable system. A CRUX user from the early years could abandon the distribution for two decades, then install the latest release and feel right at home.
|
The usage of ports helps keep your packages up to date; not the latest
|
||||||
|
bleeding-edge-alpha version, but the latest stable version. Other features
|
||||||
|
include creating packages optimized for your processor, eg. by compiling with
|
||||||
|
-march=x86-64, and avoiding cluttering the filesystem with files you'll never
|
||||||
|
use, eg. /usr/doc/*, etc. If you need more information about a specific program,
|
||||||
|
other than information found in the man-page, Google usually knows all about it.
|
||||||
|
Although CRUX strives to use new features as they become available, you will
|
||||||
|
never have to deal with a frenzy of innovation that leaves you with an
|
||||||
|
unrecognizable system. A CRUX user from the early years could abandon the
|
||||||
|
distribution for two decades, then install the latest release and feel right at
|
||||||
|
home.
|
||||||
|
|
||||||
In short, CRUX might suit you very well if you are:
|
In short, CRUX might suit you very well if you are:
|
||||||
* A somewhat experienced Linux user who wants a clean and solid Linux distribution as the foundation of your installation.
|
|
||||||
|
* A somewhat experienced Linux user who wants a clean and solid Linux
|
||||||
|
distribution as the foundation of your installation.
|
||||||
|
|
||||||
* Someone who does not hesitate to download and compile programs from the source.
|
* Someone who does not hesitate to download and compile programs from the source.
|
||||||
* Someone who values consistency and stability in the essential components of the operating system.
|
|
||||||
|
* Someone who values consistency and stability in the essential components of
|
||||||
|
the operating system.
|
||||||
|
|
||||||
%lfloat% http://crux.nu/doc/images/note.png
|
%lfloat% http://crux.nu/doc/images/note.png
|
||||||
'''Note'''[[]]
|
'''Note'''[[]]
|
||||||
''If you are using CRUX, we highly recommend to subscribing to our low-volume [[MailingLists | mailing list]] because security updates and updates that need user action are announced there.''
|
''If you are using CRUX, we highly recommend to subscribing to our low-volume
|
||||||
|
[[MailingLists | mailing list]] because security updates and updates that need
|
||||||
|
user action are announced there.''
|
||||||
|
|
||||||
!!License
|
!!License
|
||||||
|
|
||||||
!!!Packages
|
!!!Packages
|
||||||
Since CRUX is a Linux distribution, it contains software written by a lot of different people. Each software package comes with its own license, chosen by its author(s). To find out how a particular package is licensed, have a look at its source code.
|
Since CRUX is a Linux distribution, it contains software written by a lot of
|
||||||
|
different people. Each software package comes with its own license, chosen by
|
||||||
|
its author(s). To find out how a particular package is licensed, have a look at
|
||||||
|
its source code.
|
||||||
|
|
||||||
!!! Build Scripts
|
!!! Build Scripts
|
||||||
All package build scripts in CRUX (in package categories %fn%core%%, %fn%opt%%, %fn%xorg%%, and %fn%compat-32%%) are Copyright © 2000-2022 by Per Lidén and the CRUX development team and are released under the
|
All package build scripts in CRUX (in package categories %fn%core%%, %fn%opt%%,
|
||||||
|
%fn%xorg%%, and %fn%compat-32%%) are Copyright © 2000-2022 by Per Lidén and the
|
||||||
|
CRUX development team and are released under the
|
||||||
[[http://www.gnu.org/copyleft/gpl.html | GNU General Public License]].
|
[[http://www.gnu.org/copyleft/gpl.html | GNU General Public License]].
|
||||||
|
|
||||||
!!! NO WARRANTY
|
!!! NO WARRANTY
|
||||||
CRUX is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Use it at YOUR OWN RISK.
|
CRUX is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. Use it at YOUR OWN RISK.
|
||||||
|
@ -1,51 +1,80 @@
|
|||||||
!The Package System
|
!The Package System
|
||||||
!!Introduction
|
!!Introduction
|
||||||
|
|
||||||
The package system ([[http://crux.nu/Wiki/FaqPkgUtils | pkgutils]]) is made with simplicity in mind, where all packages are plain %fn%tar.gz files%% (i.e. without any kind of meta data).
|
The package system ([[http://crux.nu/Wiki/FaqPkgUtils | pkgutils]]) is made with
|
||||||
|
simplicity in mind, where all packages are plain %fn%tar.gz files%% (i.e.
|
||||||
|
without any kind of meta data).
|
||||||
|
|
||||||
Packages follow the naming convention %fn%''<name>#<version>-<release>''.pkg.tar.gz%%, where %fn%<name>%% is the name of the program, %fn%<version>%% is the version
|
Packages follow the naming convention
|
||||||
number of the program, and %fn%<release>%% is the version number of the package. \\
|
%fn%''<name>#<version>-<release>''.pkg.tar.gz%%, where %fn%<name>%% is the name
|
||||||
The %fn%pkg.tar.gz%% extension is used (instead of just %fn%tar.gz%%) to indicate that this is not just any %fn%tar.gz%% file, but a %fn%tar.gz%% that is meant to be installed using '''pkgadd'''.
|
of the program, %fn%<version>%% is the version number of the program, and
|
||||||
This helps distinguish packages from other %fn%tar.gz%% files.
|
%fn%<release>%% is the version number of the package. \\ The %fn%pkg.tar.gz%%
|
||||||
Note that pkgmk nowadays supports additional compression schemes like bzip2 with the %fn%tar.bz2%% extension or XZ ending with %fn%tar.xz%%.
|
extension is used (instead of just %fn%tar.gz%%) to indicate that this is not
|
||||||
|
just any %fn%tar.gz%% file, but a %fn%tar.gz%% that is meant to be installed
|
||||||
|
using '''pkgadd'''. This helps distinguish packages from other %fn%tar.gz%%
|
||||||
|
files. Note that pkgmk nowadays supports additional compression schemes like
|
||||||
|
bzip2 with the %fn%tar.bz2%% extension or XZ ending with %fn%tar.xz%%.
|
||||||
|
|
||||||
'''pkgadd(8)''', '''pkgrm(8)''', '''pkginfo(8)''', and '''pkgmk(8)''' are the package management utilities. With these utilities you can install, uninstall, inspect, make packages, or query the package database.
|
'''pkgadd(8)''', '''pkgrm(8)''', '''pkginfo(8)''', and '''pkgmk(8)''' are the
|
||||||
|
package management utilities. With these utilities you can install, uninstall,
|
||||||
|
inspect, make packages, or query the package database.
|
||||||
|
|
||||||
When a package is installed using '''pkgadd''' a new record is added to the package database (stored in %fn%/var/lib/pkg/db%%). The basic package system does not have
|
When a package is installed using '''pkgadd''' a new record is added to the
|
||||||
any kind of dependency checking, thus it will not warn you if you try to build a package that requires libraries or headers from other packages. Your mistake will
|
package database (stored in %fn%/var/lib/pkg/db%%). The basic package system
|
||||||
only be revealed when the pkgmk build function exits with errors. The included '''prt-get''' tool, however, can be told to resolve dependencies, if called with
|
does not have any kind of dependency checking, thus it will not warn you if you
|
||||||
'''prt-get depinst''' rather than simply '''prt-get install'''.
|
try to build a package that requires libraries or headers from other packages.
|
||||||
|
Your mistake will only be revealed when the pkgmk build function exits with
|
||||||
|
errors. The included '''prt-get''' tool, however, can be told to resolve
|
||||||
|
dependencies, if called with '''prt-get depinst''' rather than simply '''prt-get
|
||||||
|
install'''.
|
||||||
|
|
||||||
The following sections will in describe in short how to use the package utilities. Additional information about these utilities can be found on their respective man
|
The following sections will in describe in short how to use the package
|
||||||
pages.
|
utilities. Additional information about these utilities can be found on their
|
||||||
|
respective man pages.
|
||||||
|
|
||||||
!! Using the Package System
|
!! Using the Package System
|
||||||
!!! Installing a Package
|
!!! Installing a Package
|
||||||
|
|
||||||
Installing a package is done by using '''pkgadd'''. This utility requires at least one argument, the package you want to install. Example:
|
Installing a package is done by using '''pkgadd'''. This utility requires at
|
||||||
|
least one argument, the package you want to install. Example:
|
||||||
|
|
||||||
$ pkgadd bash#5.0.18-1.pkg.tar.gz
|
$ pkgadd bash#5.0.18-1.pkg.tar.gz
|
||||||
|
|
||||||
When installing a package the package manager will ensure that no previously installed files are overwritten. If conflicts are found, an error message will be printed and '''pkgadd''' will abort without installing the package. The error message will contain the names of the conflicting files. Example:
|
When installing a package the package manager will ensure that no previously
|
||||||
|
installed files are overwritten. If conflicts are found, an error message will
|
||||||
|
be printed and '''pkgadd''' will abort without installing the package. The error
|
||||||
|
message will contain the names of the conflicting files. Example:
|
||||||
|
|
||||||
$ pkgadd bash#5.0.18-1.pkg.tar.gz
|
$ pkgadd bash#5.0.18-1.pkg.tar.gz
|
||||||
bin/sh
|
bin/sh
|
||||||
usr/man/man1/sh.1.gz
|
usr/man/man1/sh.1.gz
|
||||||
pkgadd error: listed file(s) already installed (use -f to ignore and overwrite)
|
pkgadd error: listed file(s) already installed (use -f to ignore and overwrite)
|
||||||
|
|
||||||
To force the installation and overwrite the conflicting files, you can use the option '''-f''' (or '''--force'''). Example:
|
To force the installation and overwrite the conflicting files, you can use the
|
||||||
|
option '''-f''' (or '''--force'''). Example:
|
||||||
|
|
||||||
$ pkgadd -f bash#5.0.18-1.pkg.tar.gz
|
$ pkgadd -f bash#5.0.18-1.pkg.tar.gz
|
||||||
|
|
||||||
The package system allows a file to be owned by exactly one package. When forcing an installation the ownership of the conflicting files will be transferred to the package that is currently being installed. Directories can however be owned by more then one package.
|
The package system allows a file to be owned by exactly one package. When
|
||||||
|
forcing an installation the ownership of the conflicting files will be
|
||||||
|
transferred to the package that is currently being installed. Directories can
|
||||||
|
however be owned by more then one package.
|
||||||
|
|
||||||
->%lfloat%http://crux.nu/doc/images/warning.png
|
->%lfloat%http://crux.nu/doc/images/warning.png
|
||||||
'''Warning'''[[]]
|
'''Warning'''[[]]
|
||||||
->''It is often not a good idea to force the installation unless you really know what you are doing. If a package conflicts with already installed files it could be a sign that the package is broken and installs unexpected files. Use this option with extreme care, preferably not at all.''
|
->''It is often not a good idea to force the installation unless you really know
|
||||||
|
what you are doing. If a package conflicts with already installed files it could
|
||||||
|
be a sign that the package is broken and installs unexpected files. Use this
|
||||||
|
option with extreme care, preferably not at all.''
|
||||||
|
|
||||||
As earlier, the package file itself does not contain any meta data. Instead, the package manager uses the package filename to determine the package name and version.
|
As earlier, the package file itself does not contain any meta data. Instead, the
|
||||||
Thus, when installing a package file named %fn%bash#5.0.18-1.pkg.tar.gz%%, the package manager will interpret this as a package named %fn%bash%% at version %fn%5.0.18-1%%.
|
package manager uses the package filename to determine the package name and
|
||||||
If '''pkgadd''' is unable to interpret the filename (e.g. # is missing or the filename does not end with %fn%.pkg.tar.gz%%) an error message will be printed and pkgadd will abort without installing the package.
|
version. Thus, when installing a package file named
|
||||||
|
%fn%bash#5.0.18-1.pkg.tar.gz%%, the package manager will interpret this as a
|
||||||
|
package named %fn%bash%% at version %fn%5.0.18-1%%. If '''pkgadd''' is unable to
|
||||||
|
interpret the filename (e.g. # is missing or the filename does not end with
|
||||||
|
%fn%.pkg.tar.gz%%) an error message will be printed and pkgadd will abort
|
||||||
|
without installing the package.
|
||||||
|
|
||||||
!!! [[#UpgradingaPackage]] Upgrading a Package
|
!!! [[#UpgradingaPackage]] Upgrading a Package
|
||||||
|
|
||||||
@ -53,20 +82,31 @@ Upgrading a package is done using '''pkgadd''' with the '''-u option'''. Example
|
|||||||
|
|
||||||
$ pkgadd -u bash#5.0.18-1.pkg.tar.gz
|
$ pkgadd -u bash#5.0.18-1.pkg.tar.gz
|
||||||
|
|
||||||
This will replace the previously installed %fn%bash%% package with the new one. If you have not previously installed %fn%bash%%, '''pkgadd''' will print an error message. The package system does not care about the version number of the package in that you can “upgrade” version 2.05-1 with version 2.04-1 (or even with version 2.05-1 itself). The installed package will be replaced with the specified package.
|
This will replace the previously installed %fn%bash%% package with the new one.
|
||||||
|
If you have not previously installed %fn%bash%%, '''pkgadd''' will print an
|
||||||
|
error message. The package system does not care about the version number of the
|
||||||
|
package in that you can “upgrade” version 2.05-1 with version 2.04-1
|
||||||
|
(or even with version 2.05-1 itself). The installed package will be replaced
|
||||||
|
with the specified package.
|
||||||
|
|
||||||
Upgrading a package is not simply a wrapper for '''pkgrm''' followed by '''pkgadd''', because you usually want to preserve
|
Upgrading a package is not simply a wrapper for '''pkgrm''' followed by
|
||||||
your customizations of the config and log files that are owned by the already-installed package. Therefore, @@pkgadd -u@@
|
'''pkgadd''', because you usually want to preserve your customizations of the
|
||||||
conducts some upgrade-specific checks of the filesystem and the package database to construct what is called a '''keep
|
config and log files that are owned by the already-installed package. Therefore,
|
||||||
list''', in addition to the '''non-install list''' (which is initialized for every '''pkgadd''' transaction). The
|
@@pkgadd -u@@ conducts some upgrade-specific checks of the filesystem and the
|
||||||
construction of both lists is governed by the file %fn%/etc/pkgadd.conf%%.
|
package database to construct what is called a '''keep list''' (in addition to
|
||||||
|
the '''non-install list''' which is initialized for every '''pkgadd'''
|
||||||
|
transaction). The construction of both lists is governed by the file
|
||||||
|
%fn%/etc/pkgadd.conf%%.
|
||||||
|
|
||||||
%fn%/etc/pkgadd.conf%% can contain rules describing how '''pkgadd''' should behave when installing or
|
%fn%/etc/pkgadd.conf%% can contain rules describing how '''pkgadd''' should
|
||||||
upgrading any package. A rule is built out of three fragments; ''event'', ''pattern'' and ''action''. The event names the
|
behave when installing or upgrading any package. A rule is built out of three
|
||||||
kind of operation (INSTALL or UPGRADE) to which this rule will be applied. The ''pattern'' is a filename pattern expressed
|
fragments; ''event'', ''pattern'' and ''action''. The event names the kind of
|
||||||
as a regular expression and the action applicable to the INSTALL or UPGRADE ''event'' is YES or NO. More than one rule of
|
operation (INSTALL or UPGRADE) to which this rule will be applied. The
|
||||||
the same event type is allowed, in which case the first rule will have the lowest priority and the last rule will have the
|
''pattern'' is a filename pattern expressed as a regular expression and the
|
||||||
highest priority. Example:
|
action applicable to the INSTALL or UPGRADE ''event'' is YES or NO. More than
|
||||||
|
one rule of the same event type is allowed, in which case the first rule will
|
||||||
|
have the lowest priority and the last rule will have the highest priority.
|
||||||
|
Example:
|
||||||
|
|
||||||
[@
|
[@
|
||||||
#
|
#
|
||||||
@ -81,21 +121,25 @@ highest priority. Example:
|
|||||||
# End of file
|
# End of file
|
||||||
@]
|
@]
|
||||||
|
|
||||||
The above example will cause '''pkgadd''' to never upgrade anything in %fn%/etc/%% or %fn%/var/log/%% (subdirectories
|
The above example will cause '''pkgadd''' to never upgrade anything in
|
||||||
included), except files in %fn%/etc/X11/%% (subdirectories included), unless it is the file %fn%/etc/X11/xorg.conf%%. The
|
%fn%/etc/%% or %fn%/var/log/%% (subdirectories included), except files in
|
||||||
default rule is to upgrade everything, rules in this file are exceptions to that rule.
|
%fn%/etc/X11/%% (subdirectories included), unless it is the file
|
||||||
|
%fn%/etc/X11/xorg.conf%%. The default rule is to upgrade everything, rules in
|
||||||
|
this file are exceptions to that rule.
|
||||||
|
|
||||||
->%lfloat%http://crux.nu/doc/images/note.png
|
->%lfloat%http://crux.nu/doc/images/note.png
|
||||||
'''Note'''[[]]
|
'''Note'''[[]]
|
||||||
->''A pattern should never contain an initial “/” since you are referring to the files in the package, not the
|
->''A pattern should never contain an initial “/” since you are
|
||||||
files on the disk.''
|
referring to the files in the package, not the files on the disk.''
|
||||||
|
|
||||||
If '''pkgadd''' finds that a specific file should not be upgraded, it will install it under %fn%/var/lib/pkg/rejected/%%.
|
If '''pkgadd''' finds that a specific file should not be upgraded, it will
|
||||||
Files in this directory are never added to the package database. The user is then free to examine, use and/or remove that
|
install it under %fn%/var/lib/pkg/rejected/%%. Files in this directory are never
|
||||||
file manually. Another option is to use '''rejmerge'''. For each rejected file found in %fn%/var/lib/pkg/rejected/%%,
|
added to the package database. The user is then free to examine, use and/or
|
||||||
rejmerge will display the difference between the installed version and the rejected version. The user can then choose to
|
remove that file manually. Another option is to use '''rejmerge'''. For each
|
||||||
keep the installed version, upgrade to the rejected version or perform a merge of the two. Example (using the above
|
rejected file found in %fn%/var/lib/pkg/rejected/%%, rejmerge will display the
|
||||||
%fn%/etc/pkgadd.conf%%):
|
difference between the installed version and the rejected version. The user can
|
||||||
|
then choose to keep the installed version, upgrade to the rejected version or
|
||||||
|
perform a merge of the two. Example (using the above fn%/etc/pkgadd.conf%%):
|
||||||
|
|
||||||
$ pkgadd -u bash#5.0.18-1.pkg.tar.gz
|
$ pkgadd -u bash#5.0.18-1.pkg.tar.gz
|
||||||
pkgadd: rejecting etc/profile, keeping existing version
|
pkgadd: rejecting etc/profile, keeping existing version
|
||||||
@ -106,20 +150,22 @@ keep the installed version, upgrade to the rejected version or perform a merge o
|
|||||||
|
|
||||||
!!! Removing a Package
|
!!! Removing a Package
|
||||||
|
|
||||||
Removing a package is done by using '''pkgrm'''. This utility requires one argument, the name of the package you want to
|
Removing a package is done by using '''pkgrm'''. This utility requires one
|
||||||
remove. Example:
|
argument, the name of the package you want to remove. Example:
|
||||||
|
|
||||||
$ pkgrm bash
|
$ pkgrm bash
|
||||||
|
|
||||||
->%lfloat%http://crux.nu/doc/images/warning.png
|
->%lfloat%http://crux.nu/doc/images/warning.png
|
||||||
'''Warning'''[[]]
|
'''Warning'''[[]]
|
||||||
->''This will remove all files owned by the package, no questions asked. Think twice before doing it and make sure that
|
->''This will remove all files owned by the package, no questions asked. Think
|
||||||
you did not misspell the package name since that could remove something completely different (e.g. think about what could
|
twice before doing it and make sure that you did not misspell the package name
|
||||||
happen if you misspelled %fn%glib%% as %fn%glibc%%).''
|
since that could remove something completely different (e.g. think about what
|
||||||
|
could happen if you misspelled %fn%glib%% as %fn%glibc%%).''
|
||||||
|
|
||||||
!!! Querying the Package Database
|
!!! Querying the Package Database
|
||||||
|
|
||||||
Querying the package database is done using '''pkginfo'''. This utility has a few options to answer different queries.
|
Querying the package database is done using '''pkginfo'''. This utility has a
|
||||||
|
few options to answer different queries.
|
||||||
|
|
||||||
||cellpadding="3" rules="all" frame="box"
|
||cellpadding="3" rules="all" frame="box"
|
||||||
||! Option ||! Description
|
||! Option ||! Description
|
||||||
@ -177,7 +223,11 @@ Examples:
|
|||||||
|
|
||||||
!! Package management frontend: prt-get
|
!! Package management frontend: prt-get
|
||||||
|
|
||||||
In its current form '''pkgutils''' does not have a concept of dependency handling. To address this a frontend utility called '''prt-get''' was created. It supports dependency handling (with the caveat mentioned below) as well as some overlap with '''pkgutils''' features and has been an official part of CRUX for some time.
|
In its current form '''pkgutils''' does not have a concept of dependency
|
||||||
|
handling. To address this a frontend utility called '''prt-get''' was created.
|
||||||
|
It supports dependency handling (with the caveat mentioned below) as well as
|
||||||
|
some overlap with '''pkgutils''' features and has been an official part of CRUX
|
||||||
|
for some time.
|
||||||
|
|
||||||
!!! Functionality
|
!!! Functionality
|
||||||
|
|
||||||
@ -274,7 +324,8 @@ $ prt-get install xterm
|
|||||||
|
|
||||||
->%lfloat%http://crux.nu/doc/images/note.png
|
->%lfloat%http://crux.nu/doc/images/note.png
|
||||||
'''Note'''[[]]
|
'''Note'''[[]]
|
||||||
->''The 'install' command does NOT process dependencies and it is usually recommended to use 'depinst' (next) instead!''
|
->''The 'install' command does NOT process dependencies and it is usually
|
||||||
|
recommended to use 'depinst' (next) instead!''
|
||||||
|
|
||||||
[@
|
[@
|
||||||
$ prt-get depinst xterm
|
$ prt-get depinst xterm
|
||||||
@ -304,9 +355,10 @@ $ prt-get sysup
|
|||||||
|
|
||||||
->%lfloat%http://crux.nu/doc/images/note.png
|
->%lfloat%http://crux.nu/doc/images/note.png
|
||||||
'''Note'''[[]]
|
'''Note'''[[]]
|
||||||
->''Currently 'update' and 'sysup' do not process new dependencies introduced after the initial installation of a port. To
|
->''Currently 'update' and 'sysup' do not process new dependencies introduced
|
||||||
show such additions to the dependency lists of installed ports, you can chain together several invocations of
|
after the initial installation of a port. To show such additions to the
|
||||||
%fn%prt-get%% with one invocation of %fn%awk%% as follows.''
|
dependency lists of installed ports, you can chain together several invocations
|
||||||
|
of %fn%prt-get%% with one invocation of %fn%awk%% as follows.''
|
||||||
[@
|
[@
|
||||||
$ prt-get isinst $(prt-get quickdep $(prt-get quickdiff)) | awk '/not installed/ {print $2}'
|
$ prt-get isinst $(prt-get quickdep $(prt-get quickdiff)) | awk '/not installed/ {print $2}'
|
||||||
@]
|
@]
|
||||||
@ -315,18 +367,29 @@ $ prt-get isinst $(prt-get quickdep $(prt-get quickdiff)) | awk '/not installed/
|
|||||||
|
|
||||||
!!!! /etc/prt-get.conf
|
!!!! /etc/prt-get.conf
|
||||||
|
|
||||||
'''prt-get''''s main configuration file, '/etc/prt-get.conf', contains options that can be used to change prt-get's behavior. Notably in this file the following options can be configured:
|
'''prt-get''''s main configuration file, '/etc/prt-get.conf', contains options
|
||||||
|
that can be used to change prt-get's behavior. Notably in this file the
|
||||||
|
following options can be configured:
|
||||||
|
|
||||||
%fn%prtdir%% - This option can occur multiple times and specifies a directory with a 'collection' of ports prt-get should check in its operation. By default the 'core', 'opt', and 'xorg' collections are enabled. The 'compat-32' and 'contrib' collections are disabled by default, see sections "Enabling the 'contrib' collection" and "Enabling the 'compat-32' collection".
|
%fn%prtdir%% - This option can occur multiple times and specifies a directory
|
||||||
|
with a 'collection' of ports prt-get should check in its operation. By default
|
||||||
|
the 'core', 'opt', and 'xorg' collections are enabled. The 'compat-32' and
|
||||||
|
'contrib' collections are disabled by default, see sections "Enabling the
|
||||||
|
'contrib' collection" and "Enabling the 'compat-32' collection".
|
||||||
|
|
||||||
%fn%logfile%% - This option configures a file for prt-get to log its operation if desired.
|
%fn%logfile%% - This option configures a file for prt-get to log its operation
|
||||||
|
if desired.
|
||||||
|
|
||||||
%fn%runscripts%% - This option configures prt-get to run pre-/post-install scripts if they exist in ports being installed or updated. It is recommended that this be enabled as in many cases if a pre- or post-install script exists in a port, it is required to be run for proper operation.
|
%fn%runscripts%% - This option configures prt-get to run pre-/post-install
|
||||||
|
scripts if they exist in ports being installed or updated. It is recommended
|
||||||
|
that this be enabled as in many cases if a pre- or post-install script exists
|
||||||
|
in a port, it is required to be run for proper operation.
|
||||||
|
|
||||||
!!!! /etc/prt-get.aliases
|
!!!! /etc/prt-get.aliases
|
||||||
|
|
||||||
'''prt-get''' has a concept of aliases which can be used in a fashion similar to the concept of 'provides' in some other
|
'''prt-get''' has a concept of aliases which can be used in a fashion similar to
|
||||||
Linux distributions. This file is %fn%/etc/prt-get.aliases%% and contains lines in the following format:
|
the concept of 'provides' in some other Linux distributions. This file is
|
||||||
|
%fn%/etc/prt-get.aliases%% and contains lines in the following format:
|
||||||
|
|
||||||
[@
|
[@
|
||||||
postfix: sendmail
|
postfix: sendmail
|
||||||
@ -335,22 +398,26 @@ qmail: sendmail
|
|||||||
masqmail: sendmail
|
masqmail: sendmail
|
||||||
@]
|
@]
|
||||||
|
|
||||||
The above set of aliases indicates that %fn%postfix%%, %fn%exim%%, %fn%qmail%%, and %fn%masqmail%% are all considered
|
The above set of aliases indicates that %fn%postfix%%, %fn%exim%%, %fn%qmail%%,
|
||||||
sufficient to satisfy a dependency on '%fn%sendmail%%' in a port.
|
and %fn%masqmail%% are all considered sufficient to satisfy a dependency on
|
||||||
|
'%fn%sendmail%%' in a port.
|
||||||
|
|
||||||
Sometimes the port maintainer will list among the required dependencies a lightweight library, to save on compilation time
|
Sometimes the port maintainer will list among the required dependencies a
|
||||||
for the majority of users. If you already have the more powerful library installed, you can use %fn%prt-get.aliases%% to
|
lightweight library, to save on compilation time for the majority of users. If
|
||||||
avoid automatic installation of the lightweight alternative. For example, on a system with %fn%mozjs91%% already built,
|
you already have the more powerful library installed, you can use
|
||||||
you would not want %fn%prt-get depinst polkit%% to build fn%duktape%% as well. This can be accomplished with the following
|
%fn%prt-get.aliases%% to avoid automatic installation of the lightweight
|
||||||
line in %fn%prt-get.aliases%%:
|
alternative. For example, on a system with %fn%mozjs91%% already built, you
|
||||||
|
would not want %fn%prt-get depinst polkit%% to build fn%duktape%% as well. This
|
||||||
|
can be accomplished with the following line in %fn%prt-get.aliases%%:
|
||||||
|
|
||||||
[@
|
[@
|
||||||
mozjs91: duktape
|
mozjs91: duktape
|
||||||
@]
|
@]
|
||||||
|
|
||||||
Another case where this might be useful would be that of replacing a slow-compiling source port with a precompiled binary
|
Another case where aliases might be useful would be that of replacing a
|
||||||
port in order to save time. For example the following would indicate that '%fn%rust-bin%%' is considered sufficient to
|
slow-compiling source port with a precompiled binary port in order to save time.
|
||||||
satisfy a dependency on '%fn%rust%%' in a port:
|
For example the following would indicate that '%fn%rust-bin%%' is considered
|
||||||
|
sufficient to satisfy a dependency on '%fn%rust%%' in a port:
|
||||||
|
|
||||||
[@
|
[@
|
||||||
rust-bin: rust
|
rust-bin: rust
|
||||||
@ -358,25 +425,32 @@ rust-bin: rust
|
|||||||
|
|
||||||
->%lfloat%http://crux.nu/doc/images/note.png
|
->%lfloat%http://crux.nu/doc/images/note.png
|
||||||
'''Note'''[[]]
|
'''Note'''[[]]
|
||||||
->''prt-get's alias function does NOT automatically replace ports during an install or depinst operation. If a port
|
->''prt-get's alias function does NOT automatically replace ports during an
|
||||||
depends on '%fn%rust%%' and neither '%fn%rust-bin%%' or '%fn%rust%%' are installed, prt-get will install '%fn%rust%%' as
|
install or depinst operation. If a port depends on '%fn%rust%%' and neither
|
||||||
listed in the port's dependencies. If '%fn%rust-bin%%' is installed before the depending port's install or depinst
|
'%fn%rust-bin%%' or '%fn%rust%%' are installed, prt-get will install
|
||||||
operation, on the other hand, '''prt-get''' will consider the dependency satisfied.''
|
'%fn%rust%%' as listed in the port's dependencies. If '%fn%rust-bin%%' is
|
||||||
|
installed before the depending port's install or depinst operation, on the other
|
||||||
|
hand, '''prt-get''' will consider the dependency satisfied.''
|
||||||
|
|
||||||
This is NOT an exhaustive list of all of '''prt-get''''s commands, features, and configuration options, merely a starting
|
This is NOT an exhaustive list of all of '''prt-get''''s commands, features, and
|
||||||
point. More information can be found in the [[https://crux.nu/doc/prt-get%20-%20User%20Manual.html | manual]] and
|
configuration options, merely a starting point. More information can be found in
|
||||||
[[https://crux.nu/doc/prt-get%20-%20Quick%20start.html | quick start]] documentation.
|
the [[https://crux.nu/doc/prt-get%20-%20User%20Manual.html | manual]] and
|
||||||
|
[[https://crux.nu/doc/prt-get%20-%20Quick%20start.html | quick start]]
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
|
||||||
!! Creating Packages
|
!! Creating Packages
|
||||||
|
|
||||||
Creating a package is done using '''pkgmk'''. This utility uses a file called %fn%Pkgfile%%, which contains information
|
Creating a package is done using '''pkgmk'''. This utility uses a file called
|
||||||
about the package (such as name, version, etc) and the commands that should be executed in order to compile the package in
|
%fn%Pkgfile%%, which contains information about the package (such as name,
|
||||||
question.
|
version, etc) and the commands that should be executed in order to compile the
|
||||||
|
package in question.
|
||||||
|
|
||||||
To be more specific, the %fn%Pkgfile%% file is actually a '''bash(1)''' script, which defines a number of variables (name,
|
To be more specific, the %fn%Pkgfile%% file is actually a '''bash(1)''' script,
|
||||||
version, release and source) and a function (build). Below is an example of what a %fn%Pkgfile%% file might look like. The
|
which defines a number of variables (name, version, release and source) and a
|
||||||
example shows how to package the '''grep(1) utility'''. Some comments are inserted for explanation.
|
function (build). Below is an example of what a %fn%Pkgfile%% file might look
|
||||||
|
like. The example shows how to package the '''grep(1) utility'''. Some comments
|
||||||
|
are inserted for explanation.
|
||||||
|
|
||||||
[@
|
[@
|
||||||
# Specify the name of the package.
|
# Specify the name of the package.
|
||||||
@ -420,7 +494,8 @@ build() {
|
|||||||
}
|
}
|
||||||
@]
|
@]
|
||||||
|
|
||||||
In reality you do not include all those comments, thus the real %fn%Pkgfile%% for '''grep(1)''' looks like this:
|
In reality you do not include all those comments, thus the real %fn%Pkgfile%%
|
||||||
|
for '''grep(1)''' looks like this:
|
||||||
|
|
||||||
[@
|
[@
|
||||||
# Description: GNU grep, egrep and fgrep
|
# Description: GNU grep, egrep and fgrep
|
||||||
@ -443,41 +518,58 @@ build() {
|
|||||||
|
|
||||||
->%lfloat%http://crux.nu/doc/images/note.png
|
->%lfloat%http://crux.nu/doc/images/note.png
|
||||||
'''Note'''[[]]
|
'''Note'''[[]]
|
||||||
->''The build() function in the example above is just an example of how '''grep''' is built. The contents of the function
|
->''The build() function in the example above is just an example of how
|
||||||
can differ significantly if the program is built in some other way, e.g. does not use '''autoconf'''.''
|
'''grep''' is built. The contents of the function can differ significantly if
|
||||||
|
the program is built in some other way, e.g. does not use '''autoconf'''.''
|
||||||
|
|
||||||
When the build() function has been executed, the %fn%$PKG%% directory will be made into a package named
|
When the build() function has been executed, the %fn%$PKG%% directory will be
|
||||||
%fn%''<name>#<version>-<release>''.pkg.tar.gz%%.
|
made into a package named fn%''<name>#<version>-<release>''.pkg.tar.gz%%. Before
|
||||||
Before the package creation is completed, '''pkgmk''' will check the content of the package against the %fn%.footprint%%
|
the package creation is completed, '''pkgmk''' will check the contents of the
|
||||||
file. If this file does not exist, it will be created and the test will be skipped.
|
package against the %fn%.footprint%% file. If this file does not exist, it will
|
||||||
The %fn%.footprint%% file will contain a list of all files that should be in the package if the build was successful or a
|
be created and the test will be skipped. The %fn%.footprint%% file will contain
|
||||||
list of all the files that were installed in %fn%$PKG%% (if the %fn%.footprint%% did not already exist). If there is a
|
a list of all files that should be in the package if the build was successful or
|
||||||
mismatch the test will fail and an error message will be printed. You should not write the %fn%.footprint%% file by hand.
|
a list of all the files that were installed in %fn%$PKG%% (if the
|
||||||
Instead, when a package has been upgraded and you need to update the contents of the %fn%.footprint%% file you simply do
|
%fn%.footprint%% did not already exist). If there is a mismatch the test will
|
||||||
'''pkgmk -uf'''. This test ensures that a rebuild of the package turned out as expected.
|
fail and an error message will be printed. You should not write the
|
||||||
|
%fn%.footprint%% file by hand. Instead, when a package has been upgraded and you
|
||||||
|
need to update the contents of the %fn%.footprint%% file you simply do
|
||||||
|
'''pkgmk -uf'''. This test ensures that a rebuild of the package turned out as
|
||||||
|
expected.
|
||||||
|
|
||||||
If the package built without errors it's time to install it by using '''pkgadd''' and try it out. I highly recommend
|
If the package built without errors it's time to install it by using
|
||||||
looking at the %fn%Pkgfile%% in another package(s), since looking at examples is a great way to learn.
|
'''pkgadd''' and try it out. I highly recommend looking at the %fn%Pkgfile%% in
|
||||||
|
another package(s), since looking at examples is a great way to learn.
|
||||||
|
|
||||||
->%lfloat%http://crux.nu/doc/images/note.png
|
->%lfloat%http://crux.nu/doc/images/note.png
|
||||||
'''Note'''[[]]
|
'''Note'''[[]]
|
||||||
->''Please see the [[https://crux.nu/Main/PortGuidelines | PortGuidelines]] for additional information''.''
|
->''Please see the [[#PackageGuidelines | Package Guidelines]] for
|
||||||
|
additional recommendations regarding Pkgfile variables (name, version, release,
|
||||||
|
build) and the footprint.''
|
||||||
|
|
||||||
!! Adjusting/Configuring the Package Build Process
|
!! Adjusting/Configuring the Package Build Process
|
||||||
|
|
||||||
Many settings pertaining to the package build process can be adjusted by editing the '''pkgmk(8)''' configuration file
|
Many settings pertaining to the package build process can be adjusted by editing
|
||||||
'''/etc/pkgmk.conf'''. Some of these configurable settings include:
|
the '''pkgmk(8)''' configuration file '''/etc/pkgmk.conf'''. Some of these
|
||||||
|
configurable settings include:
|
||||||
|
|
||||||
* CFLAGS, CXXFLAGS - these settings control optimization and architecture options for package compiles. '''It is best NOT
|
* CFLAGS, CXXFLAGS - these settings control optimization and architecture
|
||||||
to change these unless you absolutely know what you're doing!'''
|
options for package compiles. '''It is best NOT to change these unless you
|
||||||
|
absolutely know what you're doing!'''
|
||||||
|
|
||||||
* PKGMK_SOURCE_MIRRORS - this setting defines locations from which pkgmk will attempt to fetch source archives. If this
|
* PKGMK_SOURCE_MIRRORS - this setting defines locations from which pkgmk will
|
||||||
array only contains mirrors administered by the CRUX team, building a port from your personal collection might result in
|
attempt to fetch source archives. If this array only contains mirrors
|
||||||
''404 Not Found'' errors until all the mirrors are exhausted, and then the source defined in the Pkgfile will be tried.
|
administered by the CRUX team, building a port from your personal collection
|
||||||
|
might result in ''404 Not Found'' errors until all the mirrors are exhausted,
|
||||||
|
and then the source defined in the Pkgfile will be tried.
|
||||||
|
|
||||||
* PKGMK_SOURCE_DIR - this setting defines where pkgmk will store (if downloading) and use source archives when building
|
* PKGMK_SOURCE_DIR - this setting defines where pkgmk will store (if
|
||||||
* PKGMK_PACKAGE_DIR - this setting defines where pkgmk will create package files once the build process is complete
|
downloading) and use source archives when building
|
||||||
* PKGMK_WORK_DIR - this setting defines a work area pkgmk will use to build the package
|
|
||||||
|
* PKGMK_PACKAGE_DIR - this setting defines where pkgmk will create package files
|
||||||
|
once the build process is complete
|
||||||
|
|
||||||
|
* PKGMK_WORK_DIR - this setting defines a work area pkgmk will use to build the
|
||||||
|
package
|
||||||
|
|
||||||
Here are some examples:
|
Here are some examples:
|
||||||
|
|
||||||
@ -485,55 +577,70 @@ Here are some examples:
|
|||||||
PKGMK_SOURCE_MIRRORS=(http://fileserver.intranet/crux/sources/)
|
PKGMK_SOURCE_MIRRORS=(http://fileserver.intranet/crux/sources/)
|
||||||
@]
|
@]
|
||||||
|
|
||||||
This setting instructs pkgmk to attempt to fetch all source archives from [=http://fileserver.intranet/crux/sources/=] before falling back to the source URL specified in the Pkgfile. Multiple URLS can be separated by spaces.
|
This setting instructs pkgmk to attempt to fetch all source archives from
|
||||||
|
[=http://fileserver.intranet/crux/sources/=] before falling back to the source
|
||||||
|
URL specified in the Pkgfile. Multiple URLS can be separated by spaces.
|
||||||
|
|
||||||
[@
|
[@
|
||||||
PKGMK_SOURCE_DIR="/usr/ports/srcfiles"
|
PKGMK_SOURCE_DIR="/usr/ports/srcfiles"
|
||||||
@]
|
@]
|
||||||
|
|
||||||
This example instructs pkgmk to store and find source archives in /usr/ports/srcfiles. An example benefit of this setup
|
This example instructs pkgmk to store and find source archives in
|
||||||
would be the ability to store /usr/ports/srcfiles on an NFS server on your local network for use by multiple crux
|
/usr/ports/srcfiles. An example benefit of this setup would be the ability to
|
||||||
installations. (PKGMK_PACKAGE_DIR can be set and used the same way. But if NFS is too challenging to set up on your local
|
store /usr/ports/srcfiles on an NFS server on your local network for use by
|
||||||
network and you find it easier to configure an http server instead, %fn%pkg-get%% from the %fn%opt%% collection gives you
|
multiple crux installations. (PKGMK_PACKAGE_DIR can be set and used the same
|
||||||
an alternative mechanism for sharing built packages.)
|
way. But if NFS is too challenging to set up on your local network and you find
|
||||||
|
it easier to configure an http server instead, %fn%pkg-get%% from the %fn%opt%%
|
||||||
|
collection gives you an alternative mechanism for sharing built packages.)
|
||||||
|
|
||||||
[@
|
[@
|
||||||
PKGMK_WORK_DIR="/usr/ports/work/$name"
|
PKGMK_WORK_DIR="/usr/ports/work/$name"
|
||||||
@]
|
@]
|
||||||
|
|
||||||
This example instructs pkgmk to use /usr/ports/work/$name as a work area for building the specified package. Building the
|
This example instructs pkgmk to use /usr/ports/work/$name as a work area for
|
||||||
'''grep''' package would result in the work area being '''/usr/ports/work/grep'''. An alternative would be to use a tmpfs
|
building the specified package. Building the '''grep''' package would result in
|
||||||
as your work directory.
|
the work area being '''/usr/ports/work/grep'''. An alternative would be to use a
|
||||||
|
tmpfs as your work directory.
|
||||||
|
|
||||||
There are a few more settings which can be found in the pkgmk.conf man page.
|
There are a few more settings which can be found in the pkgmk.conf man page.
|
||||||
|
|
||||||
!! Package Guidelines
|
[[#PackageGuidelines]] !! Package Guidelines
|
||||||
!!! General
|
!!! General
|
||||||
|
|
||||||
* The name of a package should always be lowercase (e.g. name=eterm and not name=Eterm). In case the package is added to
|
* The name of a package should always be lowercase (e.g. name=eterm and not
|
||||||
the CRUX ports system the exact same name should be use for the name of the directory in the ports structure, i.e.
|
name=Eterm). In case the package is added to the CRUX ports system the exact
|
||||||
%fn%/usr/ports/???/eterm%%.
|
same name should be use for the name of the directory in the ports structure,
|
||||||
|
i.e. fn%/usr/ports/???/eterm%%.
|
||||||
|
|
||||||
* Do not combine several separately distributed programs/libraries into one package. Make several packages instead.
|
* Do not combine several separately distributed programs/libraries into one
|
||||||
|
package. Make several packages instead.
|
||||||
|
|
||||||
* The build function should never touch anything outside the work directory, and ideally should not rely on having
|
* The build function should never touch anything outside the work directory, and
|
||||||
an internet connection (say, to download sources not listed in the %fn%source%% array). While '''pkgmk''' does not
|
ideally should not rely on having an internet connection (say, to download
|
||||||
currently recognize git urls in the %fn%source%% array, efforts are underway to add this feature, thereby removing the
|
sources not listed in the %fn%source%% array). While '''pkgmk''' does not
|
||||||
temptation to write a build function that reaches out to the internet for the latest git source tree.
|
currently recognize git urls in the %fn%source%% array, efforts are underway
|
||||||
|
to add this feature, thereby removing the temptation to write a build function
|
||||||
|
that reaches out to the internet for the latest git source tree.
|
||||||
|
|
||||||
-> The motivation for a policy of separating 'download' from 'build' is that a user with intermittent internet access
|
-> The motivation for a policy of separating 'download' from 'build' is that a
|
||||||
should be able to run @@pkgmk -do@@ in the directory of every outdated package, and then go offline to finish the sysup
|
user with intermittent internet access should be able to run @@pkgmk -do@@ in
|
||||||
operation. Language-specific toolchains, like those embraced by rust and python (cargo and pip, respectively), are making
|
the directory of every outdated package, and then go offline to finish the sysup
|
||||||
this policy more difficult to enforce. You are free to forego CRUX pkgutils and let the ecosystems of the ''N'' different
|
operation. Language-specific toolchains, like those embraced by rust and python
|
||||||
languages manage their respective software in separate subdirectories (like python's %fn%~/.local/share/virtualenv%% or
|
(cargo and pip, respectively), are making this policy more difficult to enforce.
|
||||||
rust's %fn%~/.cargo%%), at the expense of having to learn '''N+1''' administration suites rather than just the 1 suite of
|
You are free to forego CRUX pkgutils and let the ecosystems of the ''N''
|
||||||
CRUX pkgutils. Every language-specific project that appears in the official repositories represents a hard-won effort by
|
different languages manage their respective software in separate subdirectories
|
||||||
the CRUX development team to sustain the historic method of software deployment, in the face of software development
|
(like python's %fn%~/.local/share/virtualenv%% or rust's %fn%~/.cargo%%), at the
|
||||||
trends all heading away from this model.
|
expense of having to learn '''N+1''' administration suites rather than just the
|
||||||
|
1 suite of CRUX pkgutils. Every language-specific project that appears in the
|
||||||
|
official repositories represents a hard-won effort by the CRUX development team
|
||||||
|
to sustain the historic method of software deployment, in the face of software
|
||||||
|
development trends all heading away from this model.
|
||||||
|
|
||||||
!!! Directories
|
!!! Directories
|
||||||
|
|
||||||
* In general packages should install files in these directories. Exceptions are of course allowed if there is a good reason. But try to follow the following directory structure as close as possible.
|
* In general packages should install files in these directories. Exceptions are
|
||||||
|
of course allowed if there is a good reason. But try to follow the following
|
||||||
|
directory structure as close as possible.
|
||||||
|
|
||||||
>>margin-left=40px
|
>>margin-left=40px
|
||||||
||cellpadding="3" rules="all" frame="box"
|
||cellpadding="3" rules="all" frame="box"
|
||||||
@ -549,23 +656,44 @@ trends all heading away from this model.
|
|||||||
||%fn%/etc/%% ||Configuration files for system software (daemons, etc)
|
||%fn%/etc/%% ||Configuration files for system software (daemons, etc)
|
||||||
>>
|
>>
|
||||||
|
|
||||||
* %fn%/opt%% directory is reserved for manually compiled/installed applications. Packages should never place anything there.
|
* %fn%/opt%% directory is reserved for manually compiled/installed applications.
|
||||||
* %fn%/usr/libexec/%% is not used in CRUX, thus packages should never install anything there. Use %fn%/usr/lib/<prog>/%% instead.
|
Packages should never place anything there.
|
||||||
|
|
||||||
|
* %fn%/usr/libexec/%% is not used in CRUX, thus packages should never install
|
||||||
|
anything there. Use %fn%/usr/lib/<prog>/%% instead.
|
||||||
|
|
||||||
!!! Remove Junk Files
|
!!! Remove Junk Files
|
||||||
|
|
||||||
* Packages should not contain “junk files”. This includes info pages and other online documentation, man pages excluded (e.g. %fn%usr/doc/*%%, %fn%README%%, %fn%*.info%%, %fn%*.html%%, etc).
|
* Packages should not contain “junk files”. This includes info pages
|
||||||
* Files related to NLS (national language support), always use '''--disable-nls''' when available.
|
and other online documentation, man pages excluded (e.g. %fn%usr/doc/*%%,
|
||||||
* Useless or obsolete binaries (e.g. %fn%/usr/games/banner%% and %fn%/sbin/mkfs.minix%%).
|
%fn%README%%, %fn%*.info%%, %fn%*.html%%, etc).
|
||||||
|
|
||||||
|
* Files related to NLS (national language support), always use
|
||||||
|
'''--disable-nls''' when available.
|
||||||
|
|
||||||
|
* Useless or obsolete binaries (e.g. %fn%/usr/games/banner%% and
|
||||||
|
%fn%/sbin/mkfs.minix%%).
|
||||||
|
|
||||||
!!! Pkgfile
|
!!! Pkgfile
|
||||||
|
|
||||||
* Do not add new variables to the %fn%Pkgfile%%. Only in very few cases does this actually improve the readability or the quality of the package. Further, the only variables that are guranteed to work with future versions of '''pkgmk''' are @@name@@, @@version@@, @@release@@, and @@source@@. Other names could be in conflict with internal variables in '''pkgmk'''.
|
* Do not add new variables to the %fn%Pkgfile%%. Only in very few cases does
|
||||||
* Use the @@$name@@ and @@$version@@ variables to make the package easier to update/maintain. For example, [=source=(http://xyz.org/$name-$version.tar.gz)=] is better than [=source=(http://xyz.org/myprog-1.0.3.tar.gz)=] since the URL will automatically updated when you modify the @@$version@@ variable.
|
this actually improve the readability or the quality of the package. Further,
|
||||||
|
the only variables that are guranteed to work with future versions of
|
||||||
|
'''pkgmk''' are @@name@@, @@version@@, @@release@@, and @@source@@. Other
|
||||||
|
names could be in conflict with internal variables in '''pkgmk'''.
|
||||||
|
|
||||||
|
* Use the @@$name@@ and @@$version@@ variables to make the package easier to
|
||||||
|
update/maintain. For example, [=source=(http://xyz.org/$name-$version.tar.gz)=]
|
||||||
|
is better than [=source=(http://xyz.org/myprog-1.0.3.tar.gz)=] since the URL
|
||||||
|
will automatically updated when you modify the @@$version@@ variable.
|
||||||
|
|
||||||
* Remember that @@source@@ is an array, i.e. always do @@source=(...)@@ and not @@source=...@@
|
* Remember that @@source@@ is an array, i.e. always do @@source=(...)@@ and not @@source=...@@
|
||||||
* Another array that '''pkgmk''' will make use of, if defined, is @@renames@@ (introduced in CRUX 3.7). This array lets
|
|
||||||
you save the downloaded source tarballs with a more descriptive filename, to avoid filename collisions when using a shared
|
* Another array that '''pkgmk''' will make use of, if defined, is @@renames@@
|
||||||
directory for downloads. See the %fn%Pkgfile%% man page for more details.
|
(introduced in CRUX 3.7). This array lets you save the downloaded source
|
||||||
|
tarballs with a more descriptive filename, to avoid filename collisions when
|
||||||
|
using a shared directory for downloads. See the %fn%Pkgfile%% man page for more
|
||||||
|
details.
|
||||||
|
|
||||||
!!!! Pkgfile header
|
!!!! Pkgfile header
|
||||||
|
|
||||||
@ -579,7 +707,8 @@ Provide a header including the following fields:
|
|||||||
||URL||A webpage with more information on this software package||
|
||URL||A webpage with more information on this software package||
|
||||||
||Depends on||A list of dependencies, separated either by spaces or commas||
|
||Depends on||A list of dependencies, separated either by spaces or commas||
|
||||||
|
|
||||||
@@Depends on@@ can be omitted if there are no dependencies; @@Packager@@ can be omitted if the maintainer and packager are the same person.
|
@@Depends on@@ can be omitted if there are no dependencies; @@Packager@@ can be
|
||||||
|
omitted if the maintainer and packager are the same person.
|
||||||
|
|
||||||
'''Example header'''
|
'''Example header'''
|
||||||
|
|
||||||
|
@ -2,43 +2,72 @@
|
|||||||
!! Introduction
|
!! Introduction
|
||||||
!!! What is a Port?
|
!!! What is a Port?
|
||||||
|
|
||||||
A port is a directory containing the files needed for building a package using '''pkgmk'''. This means that this directory at least has the files %fn%Pkgfile%% (which is the package build description) and %fn%.footprint%% (which is used for regression testing and contains a list of files this package is expected to contain once it is built). Further, a port directory can contain patches and/or other files needed for building the package. It is important to understand that the actual source code for the package is not necessarily present in port directory. Instead the %fn%Pkgfile%% contains an URL which points to a location where the source can be downloaded.
|
A port is a directory containing the files needed for building a package using
|
||||||
|
'''pkgmk'''. This means that this directory at least has the files %fn%Pkgfile%%
|
||||||
|
(which is the package build description) and %fn%.footprint%% (which is used for
|
||||||
|
regression testing and contains a list of files this package is expected to
|
||||||
|
contain once it is built). Further, a port directory can contain patches and/or
|
||||||
|
other files needed for building the package. It is important to understand that
|
||||||
|
the actual source code for the package is not necessarily present in port
|
||||||
|
directory. Instead the %fn%Pkgfile%% contains an URL which points to a location
|
||||||
|
where the source can be downloaded.
|
||||||
|
|
||||||
The use of the word ''port'' in this context is borrowed from the BSD world, where a ''port'' refers to a program that has been ported to a system or platform. The word can sometimes be a bit misleading since most programs require no actual porting to run on CRUX (or on Linux in general).
|
The use of the word ''port'' in this context is borrowed from the BSD world,
|
||||||
|
where a ''port'' refers to a program that has been ported to a system or
|
||||||
|
platform. The word can sometimes be a bit misleading since most programs require
|
||||||
|
no actual porting to run on CRUX (or on Linux in general).
|
||||||
|
|
||||||
!!! What is the Ports System?
|
!!! What is the Ports System?
|
||||||
|
|
||||||
The term ''Ports System'' refers to a remote repository containing ports and a client program capable of downloading ports from that repository. The administrator of
|
The term ''Ports System'' refers to a remote repository containing ports and a
|
||||||
a CRUX system runs the '''ports(8)''' bash script to download ports from the remote repository and place them in %fn%/usr/ports/%%. The '''ports''' script uses
|
client program capable of downloading ports from that repository. The
|
||||||
rsync(1) or httpup(1) or git(1) to do the actual downloading/synchronization.
|
administrator of a CRUX system runs the '''ports(8)''' bash script to download
|
||||||
|
ports from the remote repository and place them in %fn%/usr/ports/%%. The
|
||||||
|
'''ports''' script uses rsync(1) or httpup(1) or git(1) to do the actual
|
||||||
|
downloading/synchronization.
|
||||||
|
|
||||||
!!! Port collections
|
!!! Port collections
|
||||||
|
|
||||||
CRUX ports are organized in so-called 'collections'. There are three different layers of ports:
|
CRUX ports are organized in so-called 'collections'. There are three different
|
||||||
|
layers of ports:
|
||||||
|
|
||||||
!!!! The official collections 'core', 'opt', 'xorg' and 'compat-32'
|
!!!! The official collections 'core', 'opt', 'xorg' and 'compat-32'
|
||||||
|
|
||||||
%fn%core%%, %fn%opt%%, %fn%xorg%% and %fn%compat-32%% are the four primary collections of CRUX. They're maintained by the CRUX development team which ensures that they're consistent and working well together. The first three are enabled by default. The %fn%compat-32%% collection is disabled by default and contains 32-bit compatibility ports.
|
%fn%core%%, %fn%opt%%, %fn%xorg%% and %fn%compat-32%% are the four primary
|
||||||
|
collections of CRUX. They're maintained by the CRUX development team which
|
||||||
|
ensures that they're consistent and working well together. The first three are
|
||||||
|
enabled by default. The %fn%compat-32%% collection is disabled by default and
|
||||||
|
contains 32-bit compatibility ports.
|
||||||
|
|
||||||
!!!! The user contributed collection 'contrib'
|
!!!! The user contributed collection 'contrib'
|
||||||
The %fn%contrib%% collection is a collection which is provided by experienced port maintainers: some are part of the CRUX development team, while others are regular users. Its goal is to reduce the number of duplicate ports provided in the individual collections. If you're a seasoned port maintainer, you might even want to join the contrib collection.
|
The %fn%contrib%% collection is a collection which is provided by experienced
|
||||||
|
port maintainers: some are part of the CRUX development team, while others are
|
||||||
|
regular users. Its goal is to reduce the number of duplicate ports provided in
|
||||||
|
the individual collections. If you're a seasoned port maintainer, you might
|
||||||
|
even want to join the contrib collection.
|
||||||
|
|
||||||
As those ports are not provided officially by the CRUX development team, this collection is disabled by default.
|
As those ports are not provided officially by the CRUX development team, this
|
||||||
|
collection is disabled by default.
|
||||||
|
|
||||||
!!!! The individual collections from CRUX users
|
!!!! The individual collections from CRUX users
|
||||||
|
|
||||||
Using [[HttpUp]] or git, every user can publish his or her own ports easily; the only requirement for that is some
|
Using [[HttpUp]] or git, every user can publish his or her own ports easily; the
|
||||||
webspace to upload the ports. Maintaining an HttpUp repository of ports, which you've tested and gotten successfully
|
only requirement for that is some webspace to upload the ports. Maintaining an
|
||||||
running, is a simple way to contribute back to the CRUX community.
|
HttpUp repository of ports, which you've tested and gotten successfully running,
|
||||||
|
is a simple way to contribute back to the CRUX community.
|
||||||
|
|
||||||
!! Using the Ports System
|
!! Using the Ports System
|
||||||
!!! Synchronizing Your Local Ports Structure
|
!!! Synchronizing Your Local Ports Structure
|
||||||
|
|
||||||
When CRUX is installed for the first time the local ports structure (%fn%/usr/ports/%%) is empty. To bring your local ports structure up to date you use the '''ports''' utility with the '''-u''' option. Example:
|
When CRUX is installed for the first time the local ports structure
|
||||||
|
(%fn%/usr/ports/%%) is empty. To bring your local ports structure up to date you
|
||||||
|
use the '''ports''' utility with the '''-u''' option. Example:
|
||||||
|
|
||||||
$ ports -u
|
$ ports -u
|
||||||
|
|
||||||
The '''-u''' option means update, and tells '''ports''' to contact the ports repository and download new and updated ports. The output from this execution is something like this:
|
The '''-u''' option means update, and tells '''ports''' to contact the ports
|
||||||
|
repository and download new and updated ports. The output from this execution is
|
||||||
|
something like this:
|
||||||
|
|
||||||
Updating file list from crux.nu::ports/crux-3.7/core/
|
Updating file list from crux.nu::ports/crux-3.7/core/
|
||||||
Updating collection ports/crux-3.7/core/
|
Updating collection ports/crux-3.7/core/
|
||||||
@ -55,11 +84,50 @@ The output reveals which files are downloaded, updated and deleted.
|
|||||||
|
|
||||||
!!! Listing Local Ports
|
!!! Listing Local Ports
|
||||||
|
|
||||||
When the local ports structure has been updated the directory %fn%/usr/ports/%% will contain two package categories, %fn%core%% and %fn%opt%%. Under each of these directories you will find ports. You can simply browse around in the directory structure to find out which ports are available.
|
When the local ports structure has been updated the directory %fn%/usr/ports/%%
|
||||||
|
will contain two package categories, %fn%core%% and %fn%opt%%. Under each of
|
||||||
|
these directories you will find ports. You can simply browse around in the
|
||||||
|
directory structure to find out which ports are available.
|
||||||
|
|
||||||
$ cd /usr/ports/core/
|
$ cd /usr/ports/core/
|
||||||
$ ls
|
$ ls
|
||||||
|
|
||||||
|
acl/ gperf/ openssh/
|
||||||
|
attr/ grep/ openssl/
|
||||||
|
autoconf/ groff/ patch/
|
||||||
|
automake/ gzip/ pciutils/
|
||||||
|
bash/ hdparm/ perl/
|
||||||
|
bc/ httpup/ pkgconf/
|
||||||
|
binutils/ iana-etc/ pkgutils/
|
||||||
|
bison/ inetutils/ ports/
|
||||||
|
bzip2/ iproute2/ procps/
|
||||||
|
ca-certificates/ iptables/ prt-get/
|
||||||
|
COPYING kbd/ psmisc/
|
||||||
|
COPYRIGHT kmod/ python3/
|
||||||
|
coreutils/ less/ rc/
|
||||||
|
cpio/ libarchive/ rdate/
|
||||||
|
curl/ libcap/ readline/
|
||||||
|
dash/ libdevmapper/ rsync/
|
||||||
|
db/ libffi/ sed/
|
||||||
|
dcron/ libgmp/ shadow/
|
||||||
|
dhcpcd/ libmpc/ signify/
|
||||||
|
diffutils/ libmpfr/ sqlite3/
|
||||||
|
e2fsprogs/ libnsl/ start-stop-daemon/
|
||||||
|
ed/ libpcre/ sudo/
|
||||||
|
elfutils/ libpipeline/ sysfsutils/
|
||||||
|
eudev/ libtirpc/ sysklogd/
|
||||||
|
exim/ libtool/ sysvinit/
|
||||||
|
expat/ libusb/ tar/
|
||||||
|
file/ linux-pam/ time/
|
||||||
|
filesystem/ lzo/ tzdata/
|
||||||
|
findutils/ m4/ usbutils/
|
||||||
|
flex/ make/ util-linux/
|
||||||
|
gawk/ man-db/ vim/
|
||||||
|
gcc/ man-pages/ wget/
|
||||||
|
gdbm/ mlocate/ which/
|
||||||
|
gettext/ mpdecimal/ xz/
|
||||||
|
glibc/ nasm/ zlib/
|
||||||
|
glibc-32/ ncurses/ zstd/
|
||||||
|
|
||||||
You can also use '''ports''' with the '''-l''' option to list all local ports. Example:
|
You can also use '''ports''' with the '''-l''' option to list all local ports. Example:
|
||||||
|
|
||||||
@ -73,34 +141,46 @@ You can also use '''ports''' with the '''-l''' option to list all local ports. E
|
|||||||
core/binutils
|
core/binutils
|
||||||
...
|
...
|
||||||
|
|
||||||
If you are looking for a specific package, it might be easier to use this approach (e.g. @@ports -l | grep sendmail@@) to find out if the package is available and if so in which category it is located.
|
If you are looking for a specific package, it might be easier to use this
|
||||||
|
approach (e.g. @@ports -l | grep sendmail@@) to find out if the package is
|
||||||
|
available and if so in which category it is located.
|
||||||
|
|
||||||
!!! Listing Version Differences
|
!!! Listing Version Differences
|
||||||
|
|
||||||
To find out if the ports structure carries ports that are different (likely newer) compared to the versions currently installed you can use the option '''-d'''. If version differences are found, the output from the above command could look something like this:
|
To find out if the ports structure carries ports that are different (likely
|
||||||
|
newer) compared to the versions currently installed you can use the option
|
||||||
|
'''-d'''. If version differences are found, the output from the above command
|
||||||
|
could look something like this:
|
||||||
|
|
||||||
$ ports -d
|
$ ports -d
|
||||||
Collection Name Port Installed
|
Collection Name Port Installed
|
||||||
core glibc 2.3.6-3 2.3.6-2
|
core glibc 2.3.6-3 2.3.6-2
|
||||||
opt gtk 2.8.12-1 2.8.11-1
|
opt gtk 2.8.12-1 2.8.11-1
|
||||||
|
|
||||||
If no version differences were found, i.e. the system is in sync with the ports structure, the output will simply be:
|
If no version differences were found, i.e. the system is in sync with the ports
|
||||||
|
structure, the output will simply be:
|
||||||
|
|
||||||
$ ports -d
|
$ ports -d
|
||||||
No differences found
|
No differences found
|
||||||
|
|
||||||
!!! Building and Installing Packages
|
!!! Building and Installing Packages
|
||||||
|
|
||||||
Once you have found a port that you want to build and install you simply go into the desired port directory and use '''pkgmk''' to build it. Example:
|
Once you have found a port that you want to build and install you simply go into
|
||||||
|
the desired port directory and use '''pkgmk''' to build it. Example:
|
||||||
|
|
||||||
$ cd /usr/ports/core/gawk
|
$ cd /usr/ports/core/gawk
|
||||||
$ pkgmk -d
|
$ pkgmk -d
|
||||||
|
|
||||||
The '''-d''' option means download missing source files and tells '''pkgmk''' to download the source(s) specified in the Pkgfile (in case the source is already downloaded this option is ignored). When the download is completed the package will be built. If the package was built successfully you can use '''pkgadd''' to install or upgrade it. Example:
|
The '''-d''' option means download missing source files and tells '''pkgmk''' to
|
||||||
|
download the source(s) specified in the Pkgfile (in case the source is already
|
||||||
|
downloaded this option is ignored). When the download is completed the package
|
||||||
|
will be built. If the package was built successfully you can use '''pkgadd''' to
|
||||||
|
install or upgrade it. Example:
|
||||||
|
|
||||||
$ pkgadd gawk#3.1.5-3.pkg.tar.gz
|
$ pkgadd gawk#3.1.5-3.pkg.tar.gz
|
||||||
|
|
||||||
To make life a bit easier these two steps can be made into one by using the options '''-i''' (for install) or '''-u''' (for upgrade). Example:
|
To make life a bit easier these two steps can be made into one by using the
|
||||||
|
options '''-i''' (for install) or '''-u''' (for upgrade). Example:
|
||||||
|
|
||||||
$ pkgmk -d -i
|
$ pkgmk -d -i
|
||||||
|
|
||||||
@ -108,24 +188,29 @@ or
|
|||||||
|
|
||||||
$ pkgmk -d -u
|
$ pkgmk -d -u
|
||||||
|
|
||||||
This will download, build and then install/upgrade the package. Note that the package will only be installed/upgraded if the build is successful.
|
This will download, build and then install/upgrade the package. Note that the
|
||||||
|
package will only be installed/upgraded if the build is successful.
|
||||||
|
|
||||||
!!! Enabling the 'contrib' collection
|
!!! Enabling the 'contrib' collection
|
||||||
|
|
||||||
As previously mentioned, the 'contrib' collection contains useful ports of experienced port maintainers. Since they are
|
As previously mentioned, the 'contrib' collection contains useful ports of
|
||||||
not provided by the CRUX development team, you should be slightly more critical with respect to quality and security.
|
experienced port maintainers. Since they are not provided by the CRUX
|
||||||
However, members with write permissions for 'contrib' are usually well-known and active in the CRUX community.
|
development team, you should be slightly more critical with respect to quality
|
||||||
|
and security. However, members with write permissions for 'contrib' are usually
|
||||||
|
well-known and active in the CRUX community.
|
||||||
|
|
||||||
To enable the 'contrib' collection so that @@ports -u@@ will bring it up to date, just rename its rsync file.
|
To enable the 'contrib' collection so that @@ports -u@@ will bring it up to
|
||||||
|
date, just rename its rsync file.
|
||||||
|
|
||||||
[@
|
[@
|
||||||
$ cd /etc/ports
|
$ cd /etc/ports
|
||||||
$ mv contrib.rsync.inactive contrib.rsync
|
$ mv contrib.rsync.inactive contrib.rsync
|
||||||
@]
|
@]
|
||||||
|
|
||||||
You will probably also want to let %fn%prt-get%% know about the newly-enabled 'contrib' tree. This can be done by editing
|
You will probably also want to let %fn%prt-get%% know about the newly-enabled
|
||||||
%fn%/etc/prt-get.conf%% and uncommenting the line @@prtdir /usr/ports/contrib@@ (i.e. remove the hashmark in the beginning of
|
'contrib' tree. This can be done by editing fn%/etc/prt-get.conf%% and
|
||||||
the line. After that, it should look like this:
|
uncommenting the line @@prtdir /usr/ports/contrib@@ (i.e. remove the hashmark in
|
||||||
|
the beginning of the line. After that, it should look like this:
|
||||||
|
|
||||||
[@
|
[@
|
||||||
###
|
###
|
||||||
@ -144,7 +229,8 @@ Now, run @@ports -u@@ and you're ready to use the ports from %fn%contrib%%.
|
|||||||
|
|
||||||
!!! Enabling the 'compat-32' collection
|
!!! Enabling the 'compat-32' collection
|
||||||
|
|
||||||
The 'compat-32' collection contains compatibility ports needed for 32-bit support (32-bit applications running on a 64-bit multilib system.)
|
The 'compat-32' collection contains compatibility ports needed for 32-bit
|
||||||
|
support (32-bit applications running on a 64-bit multilib system.)
|
||||||
|
|
||||||
To enable it for %fn%ports%%, do
|
To enable it for %fn%ports%%, do
|
||||||
|
|
||||||
@ -153,43 +239,55 @@ $ cd /etc/ports
|
|||||||
$ mv compat-32.rsync.inactive compat-32.rsync
|
$ mv compat-32.rsync.inactive compat-32.rsync
|
||||||
@]
|
@]
|
||||||
|
|
||||||
The 'compat-32' collection is enabled in the same way as the 'contrib' collection (described previously) for usage with %fn%prt-get%%.
|
The 'compat-32' collection is enabled in the same way as the 'contrib'
|
||||||
|
collection (described previously) for usage with %fn%prt-get%%.
|
||||||
|
|
||||||
As with 'contrib', run @@ports -u@@ and you're ready to use the ports from %fn%compat-32%%.
|
As with 'contrib', run @@ports -u@@ and you're ready to use the ports from
|
||||||
|
%fn%compat-32%%.
|
||||||
|
|
||||||
!!! Additional tools
|
!!! Additional tools
|
||||||
!!!! Building ports as unprivileged user
|
!!!! Building ports as unprivileged user
|
||||||
|
|
||||||
Building packages requires root privileges in order to create files with the correct owner and group. This is a security
|
Building packages requires root privileges in order to create files with the
|
||||||
concern because a malicious or badly designed port can run arbitrary commands when its Pkgfile is sourced by the shell.
|
correct owner and group. This is a security concern because a malicious or badly
|
||||||
The '''fakeroot''' command provides a way to build ports as normal user. Particularly when you build packages from user
|
designed port can run arbitrary commands when its Pkgfile is sourced by the
|
||||||
contributed repositories you are advised to use '''fakeroot''':
|
shell. The '''fakeroot''' command provides a way to build ports as normal user.
|
||||||
|
Particularly when you build packages from user contributed repositories you are
|
||||||
|
advised to use '''fakeroot''':
|
||||||
|
|
||||||
[@
|
[@
|
||||||
$ fakeroot pkgmk -d
|
$ fakeroot pkgmk -d
|
||||||
@]
|
@]
|
||||||
|
|
||||||
* You can also make '''prt-get''' use '''fakeroot''', by modifying the line in %fn%prt-get.conf%% that contains
|
* You can also make '''prt-get''' use '''fakeroot''', by modifying the line in
|
||||||
@@makecommand@@. This line would allow a non-root user running @@prt-get@@ to create packages with no footprint mismatches
|
%fn%prt-get.conf%% that contains @@makecommand@@. This line would allow a
|
||||||
(wrong owner/group), but the installation of these packages (and the running of pre-/post-install scripts) needs additional
|
non-root user running @@prt-get@@ to create packages with no footprint
|
||||||
privileges.
|
mismatches (wrong owner/group), but the installation of these packages (and
|
||||||
|
the running of pre-/post-install scripts) needs additional privileges.
|
||||||
|
|
||||||
* Additional lines in %fn%prt-get.conf%%, defining @@addcommand@@ and @@runscriptcommand@@ with '''sudo''' or
|
* Additional lines in %fn%prt-get.conf%%, defining @@addcommand@@ and
|
||||||
'''doas''', is one way to let @@prt-get@@ work properly for a non-root user.
|
@@runscriptcommand@@ with '''sudo''' or '''doas''', is one way to let
|
||||||
|
@@prt-get@@ work properly for a non-root user.
|
||||||
|
|
||||||
* Another possibility is to write a '''sudo''' or '''doas''' configuration that grants permission to run @@prt-get@@
|
* Another possibility is to write a '''sudo''' or '''doas''' configuration that
|
||||||
itself, and then as a non-root user you would always run @@sudo prt-get@@ rather than @@prt-get@@ directly.
|
grants permission to run @@prt-get@@ itself, and then as a non-root user you
|
||||||
|
would always run @@sudo prt-get@@ rather than @@prt-get@@ directly.
|
||||||
|
|
||||||
* Read the man pages for %fn%prt-get.conf%% and %fn%sudo/doas%% to learn how these pieces fit together, and choose whichever
|
* Read the man pages for %fn%prt-get.conf%% and %fn%sudo/doas%% to learn how
|
||||||
option you like best. To give extra scrutiny to ports you find outside the official repositories, it helps to
|
these pieces fit together, and choose whichever option you like best. To give
|
||||||
restrict yourself to low-level commands @@pkgmk@@ and @@pkgadd@@ rather than the wrapper program @@prt-get@@. This
|
extra scrutiny to ports you find outside the official repositories, it helps to
|
||||||
practice forces you to be in the directory of the unofficial port, where the %fn%Pkgfile%% source array and build function
|
restrict yourself to low-level commands @@pkgmk@@ and @@pkgadd@@ rather than the
|
||||||
are more likely to receive your careful attention.
|
wrapper program @@prt-get@@. This practice forces you to be in the directory of
|
||||||
|
the unofficial port, where the %fn%Pkgfile%% source array and build function are
|
||||||
|
more likely to receive your careful attention.
|
||||||
|
|
||||||
!!!! Useful scripts
|
!!!! Useful scripts
|
||||||
|
|
||||||
Regarding package and ports management there are many tasks which can be done in several steps with the CRUX standard
|
Regarding package and ports management there are many tasks which can be done in
|
||||||
tools introduced above. The %fn%opt%% repository contains a port called [[PrtUtils|prt-utils]] with many such scripts.
|
several steps with the CRUX standard tools introduced above. The %fn%opt%%
|
||||||
Other combinations of low-level tools, using UNIX pipes, command substitution, and text processing utilities, can be found
|
repository contains a port called [[PrtUtils|prt-utils]] with many such scripts.
|
||||||
in the bug tracker, the mailing list, and IRC logs. Efforts are underway to bring this diaspora of institutional knowledge
|
Other combinations of low-level tools, using UNIX pipes, command substitution,
|
||||||
into a central place, such as the EXAMPLES section of the most relevant man page.
|
and text processing utilities, can be found in the bug tracker, the mailing
|
||||||
|
list, and IRC logs. Efforts are underway to bring this diaspora of institutional
|
||||||
|
knowledge into a central place, such as the EXAMPLES section of the most
|
||||||
|
relevant man page.
|
||||||
|
Loading…
Reference in New Issue
Block a user