initdb creates a new PostgreSQL database cluster. A database cluster is a collection of databases that are managed by a single server instance.
Creating a database cluster consists of creating the directories in which the database data will live, generating the shared catalog tables (tables that belong to the whole cluster rather than to any particular database), and creating the template1 and postgres databases. When you later create a new database, everything in the template1 database is copied. (Therefore, anything installed in template1 is automatically copied into each database created later.) The postgres database is a default database meant for use by users, utilities and third party applications.
Although initdb will attempt to create the specified data directory, it might not have permission if the parent directory of the desired data directory is root-owned. To initialize in such a setup, create an empty data directory as root, then use chown to assign ownership of that directory to the database user account, then su to become the database user to run initdb.
initdb must be run as the user that will own the server process, because the server needs to have access to the files and directories that initdb creates. Since the server may not be run as root, you must not run initdb as root either. (It will in fact refuse to do so.)
initdb initializes the database cluster's default locale and character set encoding. The collation order (LC_COLLATE) and character set classes (LC_CTYPE, e.g. upper, lower, digit) are fixed for all databases and can not be changed. Collation orders other than C or POSIX also have a performance penalty. For these reasons it is important to choose the right locale when running initdb. The remaining locale categories can be changed later when the server is started. All server locale values (lc_*) can be displayed via SHOW ALL. More details can be found in Section 21.1.
The character set encoding can be set separately for a database when it is created. initdb determines the encoding for the template1 database, which will serve as the default for all other databases. To alter the default encoding use the --encoding option. More details can be found in Section 21.2.