nanoBase 1997 user manual 4235 This function helps with the
Transcript
nanoBase 1997 user manual 4235 This function helps with the
nanoBase 1997 user manual 4235 determinates the horizontal alignment: "L" all left; "l" middle left; "C" center; "c" center; "R" all right; "r" middle right. determinate the vertical alignment: "T" top; "t" up; "C" center; "c" center; "B" bottom; "b" down. cHorozontal cVertical This function helps with the windows alignment recalculating and modifying nTop , nLeft , nBottom and nRight in the way to obtain the desired alignment. COPYFILE() COPYFILE( cSourceFile , cTargetFile |cDevice ) ⇒ NIL the source filename. the target filename. the target devicename. cSourceFile cTargetFile cDevice This function copies the cSourceFile to cTargetFile or to cDevice. DBAPP() [ ] ] [ ] DBAPP( cFileName , acFields , bForCondition , bWhileCondition nNextRecords , nRecord , lRest , cDriver ) ⇒ NIL [ [ [ [ [ ] ] cFileName acFields bForCondition bWhileCondition nNextRecord nRecord lRest cDriver ], ] the filename containing data to append to the active alias. array of fieldnames indicating the fields that should be updated on the active alias (default is all). a code block containing the FOR condition to respect for the data append. Will be appended data that makes the evaluation of this code block True. a code block containing the WHILE condition to respect for the data append. Will be appended data as long as the evaluation of this code block is True: the first time it becomes False, the data appending is terminated. if used, means that only the first nNextRecords will be appended. if used, means that that only the record nRecord will be appended. this option is not available here also if the function saves a place for it. is the optional driver name to use to open the cFileName file. This function is used to append data to the active alias using data from the cFileName file, that in this case is a ‘.DBF’ file. nanoBase 1997 user manual 4236 DBCLOSE() DBCLOSE() ⇒ NIL It is a substitution function of DBCLOSEALL() to use inside "compiled" macros, as a true DBCLOSEALL() will close the macro file too. DBCONTINUE() DBCONTINUE() ⇒ NIL This function resumes a pending DBLOCATE(). DBCOPY() [ ] [ ] ] DBCOPY( cFileName , acFields , bForCondition , bWhileCondition nNextRecords , nRecord , lRest , cDriver ) ⇒ NIL [ [ [ [ [ ], ] ] ] cFileName acFields bForCondition bWhileCondition nNextRecord nRecord lRest cDriver the target filename for the data contained inside the active alias. array of fieldnames indicating the fields that should be used from the active alias (default is all). a code block containing the FOR condition to respect for the data copy. Will be copied the data that makes the evaluation of this code block True. a code block containing the WHILE condition to respect for the data copy. Will be copied data as long as the evaluation of this code block is True: the first time it becomes False, the data copying is terminated. if used, means that only the first nNextRecords will be copied. if used, means that that only the record nRecord will be copied. if used means that only the remaining records inside the active alias are copied. is the optional driver name to use to open the cFileName file. This function is used to copy data to cFileName form the active alias. DBCOPYSTRUCT() DBCOPYSTRUCT( cDatabase, cDatabase acFields [acFields] ) ⇒ NIL is a structure ‘.DBF’ file that will be filled with structure information about the active alias. is an array of fieldnames that should be taken into consideration. This function creates a structure ‘.DBF’ file copying the structure of the active alias. DBCOPYXSTRUCT() DBCOPYXSTRUCT( cExtendedDatabase ) ⇒ NIL cExtendedDatabase is a structure ‘.DBF’ file that will be filled with structure information about the active alias, accepting extended structure informations. nanoBase 1997 user manual 4237 This function creates a structure ‘.DBF’ file copying the structure of the active alias. This function accept non-standard structure, that is, the extended structure available inside Clipper. DBDELIM() [ ] [ ] DBDELIM( lCopyTo , cFileName , cDelimiter , acFields , bForCondition , bWhileCondition , nNextRecords , nRecord , lRest ) ⇒ NIL [ [ ] [ ] [ ] ] [ ] if True the function work copying data to cFileName from the active alias, if False the function work appending data from cFileName to the active alias. the filename containing data to append to the active alias or to use as the target of the data copy from the active alias. the delimiter string (or character) used to separate fields inside cFileName . array of fieldnames indicating the fields of the active alias that should be taken into consideration (default is all). a code block containing the FOR condition to respect. The operation will be made for all records that respect the condition. a code block containing the WHILE condition to respect. The first time it becomes False, the operation is terminated. if used, means that only the first nNextRecords will be appended/copied. if used, means that that only the record nRecord will be appended/copied. if used means that only the remaining records will be taken into consideration. lCopyTo cFileName cDelimiter acFields bForCondition bWhileCondition nNextRecord nRecord lRest This function is used to append data to the active alias using data from the cFileName file or to copy data into cFileName using the active alias as the source. cFileName is a delimited ASCII file. DBISTATUS() DBISTATUS() ⇒ cDBInformations This function returns the informations on the active alias in a text form. DBISTRUCTURE() DBISTRUCTURE() ⇒ cTextStructure | NIL This function returns the structure information on the active alias in a text form. DBJOIN() DBJOIN( cAlias , cDatabase, acFields , bForCondition [ cAlias cDatabase acFields ] [ ] ) ⇒ NIL the name of the alias to use to merge with records from the active alias. the target ‘.DBF’ filename. the array of fieldnames which represent the projection of fields form both Aliases into the new ‘.DBF’ file. If not specified, all fields from the primary work area are included in the target ‘.DBF’ file. This function creates a new database file by merging selected records and fields form two work areas (Aliases) based on a general condition. It works by making a complete nanoBase 1997 user manual 4238 pass through the secondary work area cAlias for each record in the primary work area (the active alias), evaluating the condition for each record in the secondary work area. When bForCondition is evaluated True, a new record is created in the target database file cDatabase using the fields specified from both work areas inside acFields . DBLABELFORM() [ ] [ ] [ ] [ ] ] [ ] [ ] [ DBLABELFORM( cLabel , lToPrinter , cFile , lNoConsole , bForCondition , bWhileCondition nNextRecords , nRecord , lRest , lSample ⇒ NIL [ [ ], ]) is the name of the label file (.LBL) that contains the label format definition. if True, the output is copied to printer (‘LPT1:’). if present, it is the name of a ASCII file where the output is copied. if True, the output is not sent to the console. a code block containing the FOR condition to respect for label print. Only the records contained inside the active alias that respect the condition will be used for labels. a code block containing the WHILE condition to respect for the label print. The first time that the condition is False, the label print terminates. if used, means that only the first nNextRecords will be used. if used, means that that only the record nRecord will be used. if used means that only the remaining records inside the active alias will be used. if True displays test labels as rows of asterisks. cLabel lToPrinter cFile lNoConsole bForCondition bWhileCondition nNextRecord nRecord lRest lSample This function prints labels to the console. DBLIST() [ [ ] [ [ [ ], DBLIST( lToDisplay lAll , bForCondition nNextRecords lToPrinter , lToDisplay abListColumns lAll bForCondition bWhileCondition nNextRecord nRecord lRest lToPrinter cFileName abListColumns , ], [bWhileCondition ], ], [nRecord], [lRest], ] [cFileName ] ) if True the printout is sent to the console screen. is an array of columns expressions to list. if True prints all the records contained inside the active alias. a code block containing the FOR condition to respect. Only the records contained inside the active alias that respect the condition will be used for list. a code block containing the WHILE condition to respect. The first time that the condition is False, the list terminates. if used, means that only the first nNextRecords will be used. if used, means that that only the record nRecord will be used. if used means that only the remaining records inside the active alias will be used. if True, the output is copied to printer (‘LPT1:’). if present, it is the name of a ASCII file where the output is copied. This function prints a list of records to the console. nanoBase 1997 user manual 4239 DBLOCATE() [ ] [ ] DBLOCATE( bForCondition , bWhileCondition , nNextRecords , nRecord , lRest ) ⇒ NIL [ ] [ ] [ ] a code block containing the FOR condition to respect. Only the records contained inside the active alias that respect the condition will be taken into consideration. a code block containing the WHILE condition to respect. The first time that the condition is False, the locate terminates. if used, means that only the first nNextRecords will be used. if used, means that that only the record nRecord will be used. if used means that only the remaining records inside the active alias will be used. bForCondition bWhileCondition nNextRecord nRecord lRest This function searches sequentially for the first record matching the FOR and WHILE conditions. Once a DBLOCATE() has been issued you can resume the search from the current record pointer position with DBCONTINUE(). The WHILE condition and the scope (nNextRecord , nRecord and lRest ) apply only to the initial DBLOCATE() and are not operational for any subsequent DBCONTINUE() call. DBOLDCREATE() DBOLDCREATE( cDatabase, cExtendedDatabase , cDriver , lNew , cAlias ) ⇒ NIL [ ] [ ] [ ] is the name of the new database file, with an optional drive and directory, specified as a character string. If specified without an extension (.dbf) is assumed. is a ‘.DBF’ file containing the structure information of the file to create. specifies the replaceable database driver (RDD) to use to process the current work area. cDriver is the name of the RDD specified as a character expression. if True the newly created ‘.DBF’ file is opened using the next available work area making it the current work area (the active alias). if lNew is set to True, this is the alias name to use to open the file. cDatabase cExtendedDatabase cDriver lNew cAlias This function is a old database function (superseded form DBCREATE() ) that creates a database file from the structure information contained inside a structure file. DBPACK() DBPACK() ⇒ NIL This function eliminates definitively the active alias records previously signed for deletion. It works only if the active alias is opened in exclusive mode. DBSDF() [ ] ] ] [ ] DBSDF( lCopyTo , cFileName , acFields , bForCondition , bWhileCondition , nNextRecords , nRecord , lRest [ [ lCopyTo cFileName ] [ ] [ ) ⇒ NIL if True the function works copying data to cFileName from the active alias, if False the function work appending data from cFileName to the active alias. the filename containing data to append to the active alias or to use as the target of the data copy from the active alias. nanoBase 1997 user manual 4240 array of fieldnames indicating the fields of the active alias that should be taken into consideration (default is all). a code block containing the FOR condition to respect. The operation will be made for all records that respect the condition. a code block containing the WHILE condition to respect. The first time it becomes False, the operation is terminated. if used, means that only the first nNextRecords will be appended/copied. if used, means that that only the record nRecord will be appended/copied. if used means that only the remaining records will be taken into consideration. acFields bForCondition bWhileCondition nNextRecord nRercord lReset This function is used to append data to the active alias using data from the cFileName file or to copy data into cFileName using the active alias as the source. cFileName is a SDF ASCII file. DBSORT() [ ] [ ] [ ] DBSORT( cDatabase, acFields , bForCondition , bWhileCondition , nNextRecords , nRecord , lRest [ [ ] ] [ ] ) ⇒ NIL the ‘.DBF’ file to create. the array of fields to be used to create the new sorted cDatabase file. a code block containing the FOR condition to respect. Only the records contained inside the active alias that respect the condition will be taken into consideration. a code block containing the WHILE condition to respect. The first time that the condition is False, the sort terminates. if used, means that only the first nNextRecords inside the active alias will be used. if used, means that that only the record nRecord will be used. if used means that only the remaining records inside the active alias will be used. cDatabase acFields bForCondition bWhileCondition nNextRecord nRecord lRest Copy the active alias to a ‘.DBF’ file in sorted order. DBTOTAL() [ ] DBTOTAL( cDatabase, bKey, acFields , bForCondition , bWhileCondition , nNextRecords , nRecord , lRest [ [ cDatabase bKey acFields bForCondition bWhileCondition nNextRecords nRecord lRest ] [ ] [ ] ] [ ] ) ⇒ NIL the ‘.DBF’ file to create that will contain the copy of summarised records. the code block key expression that should correspond to the key expression of the active index of the active alias. the array of fields to be used to create the new cDatabase file. a code block containing the FOR condition to respect. Only the records contained inside the active alias that respect the condition will be taken into consideration. a code block containing the WHILE condition to respect. The first time that the condition is False, the sort terminates. if used, means that only the first nNextRecords inside the active alias will be used. if used, means that that only the record nRecord will be used. if used means that only the remaining records inside the active alias will be used. nanoBase 1997 user manual 4241 This function summarises records by key value to a ‘.DBF’ file. It sequentially process the active alias scanning the specified scope of records. Records with the same key will be summarised inside the destination ‘.DBF’ file. The value of numeric fields of records with the same key are added. DBUPDATE() DBUPDATE( cAlias , bKey, [lRandom ], [bReplacement ] ) is the alias containing data to be used to update the active alias. is a code block expression using information form the cAlias to obtain a key to refer to the active alias. if True, allows record in the cAlias to be in any order. In this case, the active alias must be indexed with the same key as bKey. is the code block that will be executed when records matches: it should contains the criteria for data update. cAlias bKey lRandom bReplacement This function updates the active alias with data from another .DBF file. Example: dbUpdate( "INVOICE", {|| LAST}, .T.,; {|| FIELD->TOTAL1 := INVOICE->SUM1,; FIELD->TOTAL2 := INVOICE->SUM2 } ) DBZAP() DBZAP() ⇒ NIL This function erases immediately all the records contained inside the active alias. DISPBOXCOLOR() DISPBOXCOLOR( [nColorNumber ], [cBaseColor] ) ⇒ cColor may be 1 or 2 and are the two color used to create shadowed borders. 1 is usually used for the left and top line; 2 is used for the right and bottom line. is the starting color string. The default is the actual color. nColorNumber cBaseColor This function return a color string used for DISPBOXSHADOW() the function that create a shadowed border around a screen window. DISPBOXSHADOW() DISPBOXSHADOW( nTop , nLeft , nBottom , nRight , cBoxString , cColor1 , cColor2 ) ⇒ NIL [ ] [ nTop , nLeft , nBottom and nRight cBoxString cColor1 cColor2 ] [ ] are the screen coordinate where the box is to be displayed. is the box string containing the character to use to build the box. Default is a single line box. is the color string to use for the left and top side of the box. is the color string to use for the right and bottom side of the box. This function draws a screen box like DISPBOX() but allowing the variation of colors around the border to simulate a sort of shadow. nanoBase 1997 user manual 4242 DIR() DIR( [cFileSpec], [lDrives], [lDirs], [lFiles], [lNoDirReturn ], [nSortColumn ] ) ⇒ cPathname cFileSpec lDrives lDirs lFiles the filename or Pathname, also with wildcards, to be searched. true (‘.T.’) means: include drives letters. true (‘.T.’) means: include directory names. true (‘.T.’) means: include file names. true (‘.T.’) means: do not return the shown directory if [ Esc ] is used to exit. the column number to use to sort the list. The columns are: Name = 1, Size = 2, Date = 3, Time = 4, Attribute = 5. It is not possible to sort for extention. lNoRirReturn nSortColumn It is a window function useful to search a file or a directory. The complete pathname of the selected file is returned. DOC() DOC( [cTextFileName ] cTextFileName ) ⇒ NIL can contain the text file to open and edit; if empty, the editing of ‘UNTITLED.TXT’ will start. It is the nB Text editor useful for small text files (less then 64K) and contains a complete menu that can be started with F10 . [ ] Attention: doc() should not be used inside macros. DOTLINE() DOTLINE() ⇒ NIL This function is a "dot" command line useful for calculations resolution. The dot-line content may be passed to the keyboard buffer. DTEMONTH() Date of month DTEMONTH( nMonth , cLanguage ) ⇒ cMonth nMonth cLanguage the month number. the language name. This function translates the nMonth number into the month name translated using the cLanguage language. DTEWEEK() Date of week DTEWEEK( nWeek , cLanguage ) ⇒ cWeek nWeek is the week number (1 is Sunday, 7 is Saturday) to be translated into text. nanoBase 1997 user manual 4243 is the language name into which the week must be expressed. At the moment it works only for Italian, so cLanguage can only contain "ITALIANO". cLanguage This function translates the week number into the week name translated using the cLanguage language. EX() Execute EX( cFileMacro ) ⇒ nExitCode Executes the macro file cFileName . The extention must be specified. cFileMacro may be the name of a "compiled" macro or a text macro file. GET() GET( @aGetList , nTop , nLeft , { |x| iif( pcount() > 0, Var := x, Var ) } cGetPicture , cColorString , bPreExpression , bValid ) [ [ [ ] [ ] ] [ ] [ ] ] aGetList nTop and nLeft Var cGetPicture cColorString bPreExpression bValid is the get list array that will be increased with this get(). define the starting position of this get object on the screen. is the variable that is to be edited with this get. Var is in fact sent to the GET() function using a code block. is the get picture to use for Var . is the color string to use for the get. is a code block that will be evaluated before the get object will became active. It must result True to obtain that the get object became active. is a code block that will be evaluated after the get object is edited. It must result True to obtain that the get object may become inactive. Create screen editing masks. GVADD() Get validation add GVADD( @cField , cAdd ) ⇒ .T. cField cAdd the field to fill with more data. is the string to be added to the content of cField . This function is to be used inside GETs for pre/post validation, when a the content of a field should be added with more data. cField is returned with the same length as before to avoid troubles with current and future GETs. GVDEFAULT() Get validation default GVDEFAULT( @cField , cDefault ) ⇒ .T. @cField cDefault the field to check and if empty correct with cDefault . is the default value to be used to replace cField . nanoBase 1997 user manual 4244 This function is to be used inside GETs for pre/post validation, when a field should have a default value. cField is returned with the same length as before to avoid troubles with current and future GETs. GVFILEDIR() Get validation file directory GVFILEDIR( @cWildName ) ⇒ .T. is the file name taken from the current get to be used for search with DIR(). cWildName This function is to be used inside GETs for pre validation: the cWildName is a file name with wild cards that can be searched with the DIR() function after that a specific key is pressed. cWildName is returned with the same length as before to avoid troubles with current and future GETs. GVFILEEXIST() GVFILEEXIST( @cNameToTest , [cExtention ] ) ⇒ lSuccess is the file name taken from the current get to test for existence. is the normal extention of the file. @cNameToTest cExtention This function is to be used inside GETs for post validation: the file name have to exist. cNameToTest is returned with the same length as before to avoid troubles with current and future GETs. GVFILEEXTENTION() GVFILEEXTENTION( @cName , cExt ) ⇒ .T. the file name to be eventually corrected with file extention. the file extention to use as default. @cName cExt This function is to use inside GETs for pre/post validation, when the content of a field should contain a file name that should be corrected adding a default extention if not given from the user. GVSUBST() GVSUBST( @cField , cSubst ) ⇒ .T. the field to be replaced with cSubst . is the string to be used to replace the content of cField . @cField cSubst This function is to use inside GETs for pre/post validation, when the content of a field should be replaced with other data. cField is returned with the same length as before to avoid troubles with current and future GETs. HTF() HTF( [nInitialRecord ] ) ⇒ NIL nanoBase 1997 user manual 4245 is the record number where to start the Help Text File browse. Default is the actual record pointer. nInitialRecord This function browse a Help Text File that must be already opened and be the active alias. ISFILE() ISFILE( cName ) ⇒ lFileExists is the file name (with or without path) to be checked for existence. cName This function returns true (‘.T.’) if the file cName exists. The difference between this function and the standard FILE() function is that ISFILE() checks for wildcards before. If cName contains wildcards, the result is false (‘.F.’). ISWILD() ISWILD( cName ) ⇒ lIsWild is the file name (with or without path) to be checked for wildcards presence. cName This function returns true (‘.T.’) if cName contains wildcards. ISMEMVAR() ISMEMVAR( cName ) ⇒ lIsMemvar is the name of a possible memvar. cName This function returns true (‘.T.’) if the cName is a declared Memvar. ISCONSOLEON() ISCONSOLEON() ⇒ lConsoleIsOn This function returns true (‘.T.’) if the console will show the result of QOUT() and QQOUT(). ISPRINTERON() ISPRINTERON() ⇒ lPrinterIsOn This function returns true (‘.T.’) if the default printer will report the the result of QOUT() and QQOUT(). The default printer is ‘PRN:’ or ‘LPT1:’. If SET ALTERNATE TO is configured to send outputs to ‘LPT2:’ or another printer, the function will report false (‘.F.’). KEYBOARD() KEYBOARD( [cString] ) ⇒ NIL This function stuff a string into the keyboard buffer. LISTWINDOW() [ ] ] [ ] [ ] [ ] [ ] LISTWINDOW( acMenuItem , cDescription , nTop , nLeft , nBottom , nRight , cColorTop , cColorBody ) ⇒ nPosition [ [ acMenuItem ] is the character array containing the list of choices. nanoBase 1997 user manual 4246 is the header to be shown at the top window. are the window coordinates. is the color to use for window header and footer. is the color to use for the window body that is the space where the text appears. cDescription nTop , nLeft , nBottom , nRight cColorTop cColorBody This function is an similar to achoice(), but it shows a header and footer, and it saves the screen, acting like a window. MEMOWINDOW() [ ] [ ] [ ] [ ] [ ] [ ] [ ] ] MEMOWINDOW( cVar , cDescription , nTop , nLeft , nBottom , nRight , cColorTop , cColorBody , lEditMode , nLineLength , nTabSize ) ⇒ cVar [ [ ] [ ] is the character field (variable) to be edited. is the header to be shown at the top window. are the window coordinates. is the color to use for window header and footer. is the color to use for the window body that is the space where the text appears. is equivalent to memoedit(). is equivalent to memoedit(). is equivalent to memoedit(). cVar cDescription nTop , nLeft , nBottom , nRight cColorTop cColorBody lEditMode nLineLength nTabSize This function lets you easily edit a long character field (memo) defining automatically a simple window and providing a simple help. MEMPUBLIC() MEMPUBLIC( cMemvarName |acMemvarNames cMemvarName acMemvarNames ) ⇒ NIL is the name of the PUBLIC variable to create (max 10 characters). is an array of PUBLIC variable names to create (max 10 characters). Creates a PUBLIC variables or a group of variables. MEMRELEASE() MEMRELEASE( cMemvarName |acMemvarNames ) ⇒ NIL cMemvarName acMemvarNames is the name of the PUBLIC variable to be released. is an array of PUBLIC variable names to be released. This function releases a previously created PUBLIC variables or a group of variables. MEMRESTORE() MEMRESTORE( cMemFileName , cMemFileName lAdditive [lAdditive] ) ⇒ NIL the memory file (.MEM) to load from disk. if True causes memory variables loaded from the memory file to be added to the existing pool of memory variables. If False, the existing memory variables are automatically released. nanoBase 1997 user manual 4247 Retrieve memory variables form a memory file (.MEM). MEMSAVE() MEMSAVE( cMemFileName , [cSkeleton ], [lLike] ) ⇒ NIL the memory file (.MEM) where public variables should be saved. the skeleton mask for defining a group of variables. Wildcard characters may be used: _*_ and _?_. if True, the variables grouped with cSkeleton are saved, else only the other variables are saved. cMemFileName cSkeleton lLike Saves memory variables to a memory file (.MEM). MENUPROMPT() MENUPROMPT( @aoGet, nRow , nCol , cPrompt , bBlock [ [ ] [ ] ] [ ] ) ⇒ NIL is an array of get objects where a new get is added by MENUPROMPT(). These gets are read only. are the screen coordinates where the menu prompt will appear. is the menu prompt string. is the code block to execute when the cursor is on the current menu prompt. It is usually a code block that shows a message somewhere on the screen. aoGet nRow and nCol cPrompt bBlock This function should substitute the @...PROMPT command and handle the mouse. MENUTO() MENUTO( aoGet, nPos ) ⇒ nChoice array of get objects. starting position to be edited. aoGet nPos Like MENU TO. It returns the selected menu item created with MENUPROMPT(). It supports the mouse. MESSAGELINE() MESSAGELINE( ⇒ NIL [cMessage], [cColor], [nPosTop], [nPosLeft ] ) the message to be displayed. the color string. the starting position where the string message would appear on the screen. Default values are respectively ROW() and COL(). aMessage cColor nPosTop and nPosLeft MESSAGELINE() is a function that display a message on the screen on the selected position. If cMessage is NIL, the message is eliminated from screen restoring the previous screen content. MOUSESCRSAVE() [ ] [nLeft ], [nBottom ], [nRight ] MOUSESCRSAVE( nTop , ⇒ cSavedScreen ) nanoBase 1997 user manual 4248 nTop , nLeft , nBottom and nRight are the screen coordinates that will be to save the screen. This function works line SAVESCREEN() but it hide the mouse cursor before a screen save is made. MOUSESCRRESTORE() [ ] [ MOUSESCRRESTORE( nTop , nLeft cScreen ) ⇒ cSavedScreen [ ], [nBottom ], [nRight ], ] nTop , nLeft , nBottom and nRight cScreen are the screen coordinates where the saved screen will be restored. is the previously saved screen to restore. This function works line RESTSCREEN() but it hide the mouse cursor before a screen restore is made. PICCHRMAX() PICCHRMAX( [nCol], [nMaxCol ] ) ⇒ cPictureString is the starting position on the screen for the get field. is the end position on the screen of the get field. nCol nMaxCol This function is useful when a character field is to be used on a get object. The generated picture will be the of the maximum possible extention, eventually with scroll. QUIT() QUIT() ⇒ NIL Terminates program execution. READ() [ ] [aButtons ], [lReadOnly] READ( aoGet, nPos , ⇒ lUpdated ) is the array of get objects. is the starting position. is the array of buttons. if True, get fields cannot be modified; the default value is False. aoGet nPos aButtons lReadOnly This function is made to substitute the READMODAL() allowing the use of the mouse. The array aButtons is made with the help of the function BUTTON(). RF() RF( cFRMName , bForCondition , bWhileCondition , nNext , nRecord , lRest , lPlain , cbHeading , lBeforeEject , lSummary , lDate , acExtra ) ⇒ NIL [ [ [ [ ] [ ] ] [ ] [ ] [ ] [ ] [ ] [ ] cFRMName bForCondition bWhileCondition nNext nRecord ] ] the form (.FRM) file to use to print the active alias. code block for the FOR condition. code block for the WHILE condition. see REPORT FORM. see REPORT FORM nanoBase 1997 user manual 4249 see REPORT FORM if true (‘.T.’), force the print in a simple way. additional header in character or code block form. If a code block is sent, the final result must be a character string. if true (‘.T.’), force a form feed before the print. if true (‘.T.’), force a summary print only. if false (‘.F.’), force the print without date at the top of page. a character array that may be used for translating standard printed report form words and to add vertical and horizontal separations. The default value of acExtra is: acExtra [1] "Page No." acExtra [2] "** Subtotal **" acExtra [3] "* Subsubtotal *" acExtra [4] "*** Total ***" acExtra [5] " " vertical column separation axExtra [6] "" horizontal separation: no separation. lRest lPlain cbHeading lBeforeEject lSummary lDate acExtra This function does the same work of REPORT FORM or __ReportForm or dbReportForm, but it prints where qout() and qqout() print. RPT() RPT( cText ) ⇒ NIL This function prints the text contained into cText using print commands. This function accepts other parameters here not described, as they are not to be used for macro purpose. The printing is made using QOUT() and QQOUT(), this way it is sensible to the "alternate" file definition. RPTMANY() RPTMANY( cText , ⇒ NIL [bWhileCondition ], [bForCondition ] ) is the text to be printed. is a code block for a WHILE condition to respect for the records to print. is a code block for a FOR condition to respect for the records to print. cText bWhileCondition bForCondition This function prints the text contained into cText many times: one for every record contained into the active alias. RPTTRANSLATE() RPTTRANSLATE( cText ) ⇒ cTranslatedText This function translates once cText replacing variables with memvars or Fields. RUN() RUN( cCommand ) ⇒ NIL This function start execution of cCommand in a DOS session. It works only if there is enough available memory. SAY() SAY( nTop , nLeft , Expr , cSayPicture , cColorString [ ] [ ] ) ⇒ NIL nanoBase 1997 user manual 4250 define the starting position on the screen where the Expr should be displayed. is an expression that will be solved and displayed. is the picture to use to display Expr . is the color string to use. nTop and nLeft nLeft cSayPicture cColorString This function displays the result of Expr on the screen on the desired position. SETCOLORSTANDARD() [nColor], [cColor|acColor] cPreviousColor|acPreviousColor SETCOLORSTANDARD( ⇒ ) is the color number to take into consideration: 0 All colors 1 Base 2 Menu 3 Head 4 Body (Say - Get) 5 Button (Mouse buttons) 6 Message 7 Alert the color string to be associated with nColor . it the color array nColor cColor acColor This function is a way to handle colors inside the application. The functions that display something use a default color depending on what they does. These colors may be changed with SETCOLORSTANDARD(), all together or only one. SETFUNCTION() SETFUNCTION( nFunctionKey , cString ) ⇒ NIL the number of the function key ( 1=F1, 12=F12) to be assigned. the character string. nFunctionKey cString This function assigns a character string to a function key (obsolete). SETMOUSE() SETMOUSE( [lShow] )⇒ lPrevious True shows the mouse cursor, False hide the mouse cursor, NIL reports only the status. lShow This function is made to show, hide or report only the mouse cursor status. SETOUTPUT() [ ] SETOUTPUT( cPeriperal|aPeripheral ⇒ aPrevious_Output_Peripherals cPeripheral aPeripheral ) is the new output peripheral for qout() and qqout() functions. are the new output peripherals configurations for qout() and qqout() functions. nB is organised in the way to have only one output peripheral at the time. This function nanoBase 1997 user manual 4251 help to make order inside SET CONSOLE, SET PRINTER and SET ALTERNATE. If cPeripheral contains: "CON" SET CONSOLE is set to ON, SET PRINTER is set to OFF, SET ALTERNATE is set to OFF; "PRN" SET CONSOLE is set to OFF, SET PRINTER is set to ON, SET ALTERNATE is set to OFF; "LPT1" same as "PRN"; otherwise SET CONSOLE is set to OFF, SET PRINTER is set to OFF, SET ALTERNATE is set to ON, SET ALTERNATE TO is set to cPeripheral . aPeripheral is organised this way: aPeripheral [1] = _SET_CONSOLE aPeripheral [2] = _SET_PRINTER aPeripheral [3] = _SET_ALTERNATE aPeripheral [4] = _SET_ALTFILE aPeripheral [5] = _SET_EXTRA aPeripheral [6] = _SET_EXTRAFILE This function is necessary because SET ALTERNATE alone is not enough to print on the screen when the peripheral name is "CON" or to print on the printer when the peripheral name is "PRN" or "LPT1". In fact, in the first case, ROW() and COL() will not be updated, in the second case, PROW() and PCOL() will not be updated. This function returns an array organised in the same way as aPeripheral is, that shows the active output configuration. SETRPTEJECT() SETRPTEJECT( [lbEject] ) ⇒ lPreviousEjectMode This function is used to set the eject mode after every page print for RPT(). If single sheet paper is used, then SETRPTEJECT(.T.) must be set; for continuous paper, SETRPTEJECT(.F.) is correct. The default value is .F.. lbEject logical or code block, is the eject mode to set. Default is no change, the starting value is ‘.F.’ SETRPTLINES() SETRPTLINES() ⇒ nRemainingLines This function is used to report the number of lines available before the completion of the page print for RPT(). SETVERB() Set verbose nanoBase 1997 user manual 4252 [ SETVERB( cSpecifier , xNewSetting ⇒ xPreviousValueSet ], [lOpenMode] ) a word that defines the kind of set is going to be considered. is the new value to set up. used only for some kind of set. cSpecifier xNewSetting lOpenMode This function is analogue to SET() but it uses a character string (with cSpecifier ) and not a number to select the set. This is made to make easier the work with macros. cSpecifier may contain: "EXACT" "FIXED" "DECIMALS" "DATEFORMAT" "EPOCH" "PATH" "DEFAULT" "EXCLUSIVE" "SOFTSEEK" "UNIQUE" "DELETED" "CANCEL" "TYPEAHEAD" "COLOR" "CURSOR" "CONSOLE" "ALTERNATE" "ALTFILE" "DEVICE" "EXTRA" "EXTRAFILE" "PRINTER" "PRINTFILE" "MARGIN" "BELL" "CONFIRM" "ESCAPE" "INSERT" "EXIT" "INTENSITY" "SCOREBOARD" "DELIMITERS" "DELIMCHARS" "WRAP" "MESSAGE" "MCENTER" SETVERB("EXACT") (obsolete) SETVERB( "EXACT", [lExact] ) ⇒ lPrevious If lExact is True, it forces exact comparison of character strings, including length. If it is False, character strings are compared until the left string length is exhausted; that is that "" (the null string) is equal to any other string. nanoBase 1997 user manual 4253 Please note that the == operator is a comparison operator for exact match and using it, SETVERB("EXACT", ‘.F.’) will not work. The starting value is True; the recommended value is True. SETVERB("FIXED") SETVERB( "FIXED", [lFixed] ) ⇒ lPrevious If lFixed contains True, numeric values are displayed ever with a fixed number of decimal digits, depending on the value set by SETVERB("DECIMALS"). The starting value is False. The recommended value is False: if you have to display a fixed number of decimal digits it is better to define a good display picture. SETVERB("DECIMALS") SETVERB( "DECIMALS", [nDecimals] ) ⇒ nPrevious nDecimals is the number of digits to display after the decimal position. This set is enabled of disabled with SETVERB("FIXED"). The starting value is 8. SETVERB("DATEFORMAT") SETVERB( "DATEFORMAT", [cDateFormat] ) ⇒ cPrevious cDateFormat is a character expression that specifies the date format. The starting value is "dd/mm/yyyy". Some date format examples: "mm/dd/yyyy" "yyyy.mm.dd" "dd/mm/yyyy" "dd/mm/yyyy" "dd.mm.yyyy" "dd-mm-yyyy" "yyyy/mm/dd" "mm-dd-yyyy" AMERICAN ANSI BRITISH FRENCH GERMAN ITALIAN JAPAN USA SETVERB("EPOCH") SETVERB( "EPOCH", [nYear] ) ⇒ nPrevious nYear specifies the base year of 100-year period in which all dates containing only two year digits are assumed to fall. The starting value is 1900. SETVERB("PATH") SETVERB( "PATH", [cPath] ) ⇒ cPrevious cPath identifies the paths that nB uses when searching for a file not found in the current directory. The list of paths can be separated by commas or semicolons. The starting value is "". SETVERB("DEFAULT") SETVERB( "DEFAULT", [cPath] ) ⇒ cPrevious cPath identifies the default disk drive and directory. nanoBase 1997 user manual 4254 The starting value is "". SETVERB("EXCLUSIVE") SETVERB( "EXCLUSIVE", [lExclusive ] ) ⇒ lPrevious If lPath is True, the default database (.DBF) file open is made in exclusive mode; in the other case, in shared mode. The starting value is True. SETVERB("SOFTSEEK") SETVERB( "SOFTSEEK", [lSoftSeek ] ) ⇒ lPrevious If lSoftSeek is True, if a DBSEEK() index search fails, the record pointer is moved to the next record with a higher key. If it is False, in case of a DBSEEK() index search failure, the record pointer is moved at EOF(). The starting value is False. SETVERB("UNIQUE") (obsolete) SETVERB( "UNIQUE", [lUnique] ) ⇒ lPrevious If lUnique is True, during creation or update of ‘.DBF’ indexes, if two or more records are found with the same key, only the first record will be included inside the index. If lUnique is False, duplicated record keys are allowed. The starting value is False. SETVERB("DELETED") SETVERB( "DELETED", [lDeleted] ) ⇒ lPrevious If lDeleted is True, record signed for deletion are not filtered, that is, these are still normally visible as they were not deleted. In the other case, they hare (in most cases) hidden to the user. The starting value is False. SETVERB("CANCEL") SETVERB( "CANCEL", [lCancel] ) ⇒ lPrevious If lCancel is True, enables [ Alt+c ] and [ Ctrl+Break ] as termination keys. In the other case, not. The starting value is True. SETVERB("TYPEAHEAD") SETVERB( "TYPEAHEAD", [nTypeAhead ] ) ⇒ nPrevious nTypeAhead is the number of keystrokes the keyboard buffer can hold from a minimum of zero to a maximum of 4096. The starting value is 15. SETVERB("COLOR") SETVERB( "COLOR", [cColorString] ) ⇒ cPrevious nColorString defines the normal screen colors. There are five couple of colors, but only three are really operative: standard enhanced border background unselected This is the standard color used for screen output. This is the color used for highlighted screen output. Normally unused. Normally unused. This is the color used for GET fields without focus. nanoBase 1997 user manual 4255 The default color string is "BG+/B,N/W,N/N,N/N,W/N" that is: bright Cyan on Blue Black on White Black on Black Black on Black White on Black standard enhanced border background unselected The following table explains the use of letters inside the color string. Note that the plus sign (+) means high intensity, the star (*) means blink and that + and * can be allowed only to the first letter inside a couple. Color Black Blue Green Cyan Red Magenta Brown White Gray Bright Blue Bright Green Bright Cyan Bright Red Bright Magenta Bright Brown Bright White Black Inverse Video Blank Letter N, Space B G BG R RB GR W N+ B+ G+ BG+ R+ RB+ GR+ W+ U I X Monochrome Black Underline White White White White White White Black Bright Underline Bright White Bright White Bright White Bright White Bright White Bright White Underline Inverse Video Blank SETVERB("CURSOR") SETVERB( "CURSOR", [lCursor] ) ⇒ lPrevious If lCursor is True, the cursor is showed, else it is hidden. The starting value is True. SETVERB("CONSOLE") SETVERB( "CONSOLE", [lConsole] ) ⇒ lPrevious If lConsole is True, the output of console commands is displayed on the screen, else it is not. The starting value is True. SETVERB("ALTERNATE") SETVERB( "ALTERNATE", [lAlternate] ) ⇒ lPrevious If lAlternate is True, the output of console commands is send also to a standard ASCII text file. The starting value is False. SETVERB("ALTFILE") SETVERB( "ALTFILE", ⇒ cPrevious [cAlternateFilename ], [lAdditive] ) nanoBase 1997 user manual 4256 If SETVERB("ALTERNATE") is True, the output of the console is send also to cAlternateFilename , a standard ASCII file. If lAdditive is True, the output is appended to the ASCII file if it already exists, else it is erased first. SETVERB("DEVICE") SETVERB( "DEVICE", [cDevice] ) ⇒ cPrevious cDevice is the name of the device where SAY() will display its output. The starting value is "SCREEN", the alternative is "PRINTER". The recommended value is "SCREEN". SETVERB("EXTRA") SETVERB( "EXTRA", [lExtra] ) ⇒ lPrevious If lExtra is True, the output of console commands is send also to a standard ASCII text file. The starting value is False. SETVERB("EXTRAFILE") SETVERB( "EXTRAFILE", ⇒ cPrevious [cExtraFilename ], [lAdditive] ) If SETVERB("EXTRA") is True, the output of the console is send also to cExtraFilename , a standard ASCII file. If lAdditive is True, the output is appended to the ASCII file if it already exists, else it is erased first. SETVERB("PRINTER") SETVERB( "PRINTER", [lPrinter] ) ⇒ lPrevious If lPrinter is True, the output of console commands is also printed, else it is not. The starting value is False. SETVERB("PRINTFILE") SETVERB( "PRINTFILE", [cPrintFileName ] ) ⇒ cPrevious cPrintFileName is the name of the printer peripheral name. The starting value is "" (null string). SETVERB("MARGIN") SETVERB( "MARGIN", [nPageOffset ] ) ⇒ nPrevious nPageOffset is the positive number of column to be used as a left margin for all printer output. The starting value is 0. SETVERB("BELL") SETVERB( "BELL", [lBell] ) ⇒ lPrevious If lBell is True, the sound of the bell is used to get the attention of the user when some wrong actions are made. The starting value is False. nanoBase 1997 user manual 4257 SETVERB("CONFIRM") SETVERB( "CONFIRM", [lConfirm ] ) ⇒ lPrevious If lConfirm is False, the GET is simply terminated typing over the end of the get field; in the other case (True), the GET is terminated only pressing an "exit key". The starting value is True. SETVERB("ESCAPE") SETVERB( "ESCAPE", [lEscape] ) ⇒ lPrevious If lEscape is True, the [ Esc ] key is enabled to be a READ exit key, in the other case not. The starting value is True. The recommended value is True. SETVERB("INSERT") SETVERB( "INSERT", [lInsert] ) ⇒ lPrevious If lInsert is True, the data editing is in INSERT mode, in the other case, it is in OVERWRITE mode. The starting value is True. SETVERB("EXIT") SETVERB( "EXIT", [lExit] [ ] ) ⇒ lPrevious [ ] If lExit is True, Up and Down key may be used as exit key when the cursor is (respectively) on the first or on the last GET field. In the other case not. The starting value is False. The recommended value is False. SETVERB("INTENSITY") SETVERB( "INTENSITY", [lIntensity ] ) ⇒ lPrevious If lIntensitiy is True, the display of standard and enhanced display colors are enabled. In the other case, only standard colors are enabled. The starting value is True. The recommended value is True. SETVERB("SCOREBOARD") SETVERB( "SCOREBOARD", [lScoreboard] ) ⇒ lPrevious If lScoreboard is True, the display of messages from READ() and MEMOREAD() is allowed; in the order case not. The starting value is False. The recommended value is False: nB do not support scoreboard. SETVERB("DELIMITERS") SETVERB( "DELIMITERS", [lDelimiters] ) ⇒ lPrevious If lDelimiters is True, GET variables appear on the screen delimited with the delimiter symbols. In the other case, GET variables are not delimited this way, but only with the use of different colors. The starting value is False. The recommended value is False: the use of delimiters creates one more trouble when designing a screen mask. nanoBase 1997 user manual 4258 SETVERB("DELIMCHARS") SETVERB( "DELIMCHARS", [cDelimterCharacters] ) ⇒ cPrevious cDelimterCharacters are the delimiter characters used to delimit a GET field when SETVERB("DELIMITERS") is True. The starting value is "::". SETVERB("WRAP") SETVERB( "WRAP", [lWrap] ) ⇒ lPrevious If lWrap is True, the wrapping of the highlight in MENUs should be active, but this option is actually not active and all works as it is False. The starting value is False. SETVERB("MESSAGE") SETVERB( "MESSAGE", [nMessageRow ] ) ⇒ nPrevious nMessageRow is the row number where the @..PROMPT message line should appear on the screen. This option is not supported. The starting value is 0. SETVERB("MCENTER") SETVERB( "MCENTER", [lMessageCenter] ) ⇒ lPrevious If lMessageCenter is True, the @..PROMPT message line should appear centered on the screen. This option is not supported. The starting value is False. STRADDEXTENTION() STRADDEXTENTION( cName , cExt ) ⇒ cCompleteName cName cExt the file name (with or without path) that is probably without extention. the extention that must be added to cName if it has not one. This function check cName for the presence of an extention. It it has not one, cExt will be added. STRCUTEXTENTION() STRCUTEXTENTION( cName ) ⇒ cName cName the file name (with or without path) that is probably with extention. This function check cName for the presence of an extention. It it has one, the extention is removed. STRDRIVE() STRDRIVE( cName ) ⇒ cDrive cName the file name (with or without path) that contains the drive letter. This function tries to extract the drive letter information from cName . nanoBase 1997 user manual 4259 STREXTENTION() STREXTENTION( cName ) ⇒ cExtention the file name (with or without path) that contains an extention. cName This function tries to extract the extention information from cName . STRFILE() STRFILE( cName ) ⇒ cFileName cName the file name with or without path. This function tries to extract the file name without path from cName . STRFILEFIND() STRFILEFIND( cName , cPath ) ⇒ cFileName cName cPath the file name or pathname containing the file name to search inside the cPath list. a list of paths separated with semicolon (just like Dos does), where cFile should be searched. If your file is to be found on different possible positions, this function search the first place where the file is found and returns a valid pathname to that file. STRGETLEN() STRGETLEN( xExpr , cPicture ) ⇒ nFieldLength xExpr cPicture a generic expression. the picture string. This function returns the length of field when using xExpr with cPicture . STRLISTASARRAY() STRLISTASARRAY( cList , cList cDelimiter [cDelimiter] ) ⇒ aList a character string containing a list separated with cDelimiter . the delimiter used to separate the elements contained inside the list. This function transform a character string list into an array. STROCCURS() STROCCURS( cSearch , cTarget ) ⇒ nOccurrence cSearch cTarget the search string to find inside cTarget . the string to be searched for the presence of cSearch . This function returns the number of occurrence that cSearch is contained inside cTarget . STRPARENT() STRPARENT( cName ) ⇒ cParentPath cName the pathname. nanoBase 1997 user manual 4260 This function tries to return a parent path from cName . STRPATH() STRPATH( cName ) ⇒ cPath the pathname. cName This function tries to extract the path from cName . STRTEMPPATH() STRTEMPPATH() ⇒ cTempPath This function returns a temporary path searching for possible definitions inside the environmental variables. STRXTOSTRING() STRXTOSTRING( xVar , [cType] ) ⇒ cTrasformed_to_string is the data of any type to be converted into string. is the type of the data contained inside xVar . xVar cType This function returns xVar transformed into a character string. TB() TB( [nTop], [nLeft ], [nBottom ], [nRight ], [acCol], [acColSayPic], [acColTopSep], [acColBodySep], [acColBotSep], [acColHead], [acColFoot], [alColCalc], [abColValid], [abColMsg], [cColor], [abColColors], [nFreeze], [lModify], [lAppend], [lDelete], [lButtons | aButtons ] ) ⇒ NIL nTop , nLeft , nBottom , nRight defines the screen area where browse have to take place. acCol acColSayPic acColTopSep acColBodySep acColBotSep acColHead acColFoot alColCalc abColValid abColMsg cColor is the columns array to be included into the browse. is the picture array. is the top separation array: default is chr(194)+chr(196). is the body separation array: default is chr(179). is the bottom separation array: default is chr(193)+chr(196). is the header array for every column. is the footer array for every column. is the array that identify the calculated column (not editable). True (‘.T.’) means calculated. is the validation array that specify when a field is properly filled. The condition must be specified in code block format. is the message array that permits to show information at the bottom of browse area. The array must be composed with code blocks which result with a character string. is the color string: it may be longer than the usual 5 elements. nanoBase 1997 user manual abColColors nFreeze lModify lDelete lButtons aButtons aButtons [n ][1] N aButtons [n ][2] N aButtons [n ][3] C aButtons [n ][4] B 4261 is the color code block array. The code block receive as parameter the value contained inside the field and must return an array containing two numbers: they correspond to the two color couple from cColor. indicates the number of columns to be left frozen on the left side. indicates whether the browse can modify data. indicates whether the browse can delete and recall records. if True, default buttons are displayed. array of buttons. the n th button row position; the n th button column position; the n th button text; the n th button code block. This function, called without parameters, starts the browse of the active alias, and if relations are established, the browse includes also related data. Please note that due to an unresolved problem, the field names contained inside acCol should better contain also the alias (ALIAS->FIELD_NAME). See also the examples. TEXT() TEXT( cText ) ⇒ NIL Shows the text contained into cText . TGLINSERT() TGLINSERT() ⇒ NIL Toggle the global insert mode and the cursor shape. TIMEX2N() TIMEX2N( [nHH ], [nMM ], [nSS ] nHH nMM nSS ) ⇒ nTime is the number of hours. is the number of minutes. is the number of seconds. This function calculate the "time number" that is a number representing days and/or portion of a day: 1 is 1 day or 24 hours, 0.5 is 12 hours, and so on. TIMEN2H() TIMEN2H( nTime ) ⇒ nHours nTime is the "time number" that is a number representing days and/or portion of a day: 1 is 1 day or 24 hours, 0.5 is 12 hours, and so on. This function returns the integer number of hours contained inside nTime . TIMEN2M() TIMEN2M( nTime ) ⇒ nMinutes nanoBase 1997 user manual 4262 is the "time number" that is a number representing days and/or portion of a day: 1 is 1 day or 24 hours, 0.5 is 12 hours, and so on. nTime This function returns the integer number of minutes contained inside nTime after subtracting the hours. TIMEN2S() TIMEN2S( nTime ) ⇒ nSeconds is the "time number" that is a number representing days and/or portion of a day: 1 is 1 day or 24 hours, 0.5 is 12 hours, and so on. nTime This function returns the number of seconds (with eventual decimals) contained inside nTime after subtracting the hours and the minutes. TRUESETKEY() TRUESETLEY( nInkeyCode , bAction ) ⇒ .T. This function is equivalent to SETKEY() but it returns always ‘.T.’ WAITFILEEVAL() WAITFILEEVAL( lClose ) ⇒ .T. Shows a wait bar calling WAITPROGRESS() for operation on records of a database. If there is no index active, it is equivalent to WAITPROGRES(RECNO()/LASTREC()). if an index is active, this cannot work, so an increment for each call is made: WAITPROGRES((nIncrement++)/LASTREC()). This function must be closed calling it with the lClose parameter to true (‘.T.’). This way, internal counters are closed and WAITPROGRESS() is closed too. WAITFOR() WAITFOR( [cMessage] ) ⇒ NIL Shows cMessage until it is called again. The wait window is closed when called without parameter or with NIL. WAITPROGRESS() WAITPROGRESS( [nPercent] ) ⇒ .T. Shows a wait bar on the screen top depending on the value contained into nPercent . nPercent starts form 0 and ends to 1 (100%). If a value of one or more, or NIL is passed, the wait window is closed. 371.16 Normal command substitution Clipper works only with functions and commands that are converted into function using the ‘STD.CH’. Here are described some command replacement that can be used also with nB macros. ? [exp_list] qout([exp_list]) ? nanoBase 1997 user manual 4263 [exp_list] qqout([exp_list]) ?? @BOX [COLOR cColorString] nRight , [cnBoxString ], [cColorString ]) @ nTop , nLeft , nBottom , nRight BOX cnBoxString dispbox(nTop , nLeft , nBottom , @TO [COLOR cColorString] dispbox(nTop , nLeft , nBottom , nRight , 2 [,cColorString ]) @ nTop , nLeft TO nBottom , nRight [COLOR cColorString ] dispbox(nTop , nLeft , nBottom , nRight , 1 [,cColorString ]) @ nTop , nLeft CLEAR [TO nBottom , nRight ] scroll([nTop ], [nLeft ], [nBottom , nRight ]) @ nTop , nLeft TO nBottom , nRight DOUBLE setpos(nRow , nCol ) @GET [ ] ] [COLOR @ nTop , nLeft GET Var PICTURE cGetPicture ,→ VALID lPostExpression [ cColorString ] [WHEN lPreExpression setpos(nTop , nLeft ) [ ] aadd( GetList, _GET_( Var , "Var ", cGetPicture , {|| lPostExpression } ,←,→ {|| lPreExpression } ):display() ) atail(GetList):colorDisp(cColorString ) [ ] @SAY @ nTop , nLeft SAY exp [COLOR cColorString ] devpos(nTop , nLeft ) devout(exp [, ] cColorString ) @ nTop , nLeft SAY exp PICTURE cSayPicture [COLOR devpos(nTop , nLeft ) devoutpic(exp , cSayPicture , APPEND APPEND BLANK dbappend() CLEAR CLEAR Scroll() SetPos(0,0) ReadKill(.T.) GetList := {} CLEAR GETS ReadKill(.T.) GetList := {} CLEAR SCREEN Scroll() SetPos(0,0) | CLS [cColorString]) cColorString ] ] ←- nanoBase 1997 user manual 4264 CLOSE CLOSE dbCloseArea() CLOSE idAlias idAlias ->( dbCloseArea() ) CLOSE ALTERNATE Set(19, "") CLOSE DATABASES dbCloseAll() CLOSE INDEXES dbClearIndex() COMMIT COMMIT dbCommitAll() COUNT [ ] [WHILE ][ ] COUNT TO idVar FOR lForCondition ,→ RECORD nRecord REST ALL [ ][ lWhileCondition ] [NEXT nNextRecords dbeval( {||idVar :=idVar +1}, {||lForCondition }, {||lWhileCondition },←,→ nNextRecords , nRecord , lRest ) DEFAULT DEFAULT xVar TO xDefaultValue DEFAULT( @xVar , xDefaultValue ) ⇒ xVar DELETE DELETE dbDelete() [ ] [WHILE lWhileCondition ] [NEXT ] [ALL] DELETE FOR lForCondition ,→ RECORD nRecord REST [ ][ nNextRecords dbeval( {||dbDelete()}, {||lForCondition }, {||lWhileCondition },←,→ nNextRecords , nRecord , lRest ) DELETE FILE xcFile ferase( cFile ) EJECT EJECT qqout( chr(13) ) ERASE ERASE xcFile ferase( cFile ) FIND FIND xcSearchString dbSeek( cSearchString ) GO [ ] GO TO nRecord dbgoto(nRecord ) [ ] GO TO BOTTOM dbGoBottom() ]←- ]←- nanoBase 1997 user manual [ ] GO TO 4265 TOP dbgotop() INDEX ON [ ][ ] INDEX ON expKey TO xcIndexName UNIQUE FOR lForCondition ←,→ WHILE lWhileCondition EVAL lEvalCondition EVERY nRecords [ ] [[ ][ ]] [ASCENDING| ] DESCENDING [ ] [ ] ] [ ordCondSet( cForCondition , bForCondition , , bWhileCondition ,→ bEvalCondition , nRecords , RECNO(), , , , lDescending ) [ ] [ ],←- ordCreate( cIndexName , , cExpKey , bExpKey , lUnique ) READ READ ReadModal(GetList) GetList := {} READ SAVE ReadModal(GetList) RECALL RECALL dbRecall() [ ] [WHILE lWhileCondition ] [NEXT ] [ ] [ALL] RECALL FOR lForCondition ,→ RECORD nRecord REST [ nNextRecords dbeval( {||dbRecall()}, {||lForCondition }, {||lWhileCondition },←,→ nNextRecords , nRecord , lRest ) REINDEX REINDEX [EVAL ] [EVERY nRecords] , [bEvalCondition ], [nRecords ], lEvalCondition ordCondSet(, , , , , , , , , ) ordListRebuild() RENAME RENAME xcOldFile TO xcNewFile frename( cOldFile , cNewFile ) REPLACE [ ][ ][ ][ ] idField1 := exp1 [, idField2 ] REPLACE idField1 WITH exp1 , idField2 WITH exp2 ... ←,→ FOR lForCondition WHILE lWhileCondition NEXT nNextRecords ,→ RECORD nRecord REST ALL [ [ ][ ] dbeval( {|| := exp2 ... },←,→{||lForCondition }, {||lWhileCondition }, nNextRecords ,←,→ nRecord , lRest ) REPLACE idField1 WITH exp1 idField1 := exp1 RESTORE RESTORE SCREEN FROM cScreen restscreen( 0, 0, Maxrow(), Maxcol(), cScreen ) SAVE SAVE SCREEN TO cScreen cScreen := savescreen( 0, 0, maxrow(), maxcol() ) ]←- ]←- nanoBase 1997 user manual 4266 SEEK [SOFTSEEK] expSearch [, lSoftSeek ] SEEK expSearch dbSeek( ) SELECT SELECT xnWorkArea | idAlias | dbSelectArea( nWorkArea cIdAlias ) SET SET ALTERNATE TO xcFile [ADDITIVE] Set( 19, cFile , lAdditive ) SET ALTERNATE ON Set( 18, "ON" SET BELL ON | "OFF" | | OFF | Set( 26, "ON" SET COLOR | OFF | lToggle ) xlToggle | "OFF" | | COLOUR xlToggle lToggle ) TO (cColorString) SetColor( cColorString ) SET CONFIRM ON Set( 27, "ON" | OFF | xlToggle | "OFF" | SET CONSOLE ON | OFF | lToggle ) xlToggle Set( 17, "ON" | "OFF" | SET CURSOR ON | OFF | lToggle ) xlToggle | 0 | iif( lToggle , FORMAT [TO] cDateFormat SetCursor( 1 SET DATE 1, 0 ) ) Set( 4, cDateFormat ) SET DECIMALS TO Set( 3, 0 ) SET DECIMALS TO nDecimals Set( 3, nDecimals ) SET DEFAULT TO Set( 7, "" ) SET DEFAULT TO xcPathspec Set( 7, cPathspec ) SET DELETED ON Set( 11, "ON" | OFF | xlToggle | "OFF" | SET DELIMITERS ON lToggle ) | OFF | | "OFF" | lToggle DELIMITERS TO [DEFAULT] Set( 33, "ON" SET xlToggle Set( 34, "::" ) SET DELIMITERS TO cDelimiters Set( 34, cDelimiters ) ) nanoBase 1997 user manual | PRINTER SET DEVICE TO SCREEN Set( 20, "SCREEN" 4267 | "PRINTER" ) SET EPOCH TO nYear Set( 5, nYear ) SET ESCAPE ON | OFF | Set( 28, "ON" | "OFF" | xlToggle SET EXACT ON | OFF | Set( 1, "ON" | "OFF" | SET EXCLUSIVE ON Set( 8, "ON" lToggle ) xlToggle lToggle ) | OFF | | "OFF" | xlToggle lToggle ) SET FILTER TO dbclearfilter() SET FILTER TO lCondition dbsetfilter( bCondition , cCondition ) SET FIXED ON | OFF | xlToggle | "OFF" | lToggle ) TO [xcIndex [, xcIndex1 ... ] ] Set( 2, "ON" SET INDEX ordListClear() ordListAdd( cIndex ) ordListAdd( cIndex1 ) ... SET INTENSITY ON | OFF | xlToggle | "OFF" | lToggle nInkeyCode [TO] Set( 31, "ON" SET KEY ) SetKey( nInkeyCode , NIL ) SET KEY nInkeyCode TO [idProcedure] SetKey( nInkeyCode , { |p, l, v| idProcedure(p, l, v)} ) SET MARGIN TO Set( 25, 0 ) SET MARGIN TO [nPageOffset ] Set( 25, nPageOffset ) SET MESSAGE TO Set( 36, 0 ) Set( 37, .F. ) SET MESSAGE TO [nRow [CENTER | CENTRE]] Set( 36, nRow ) Set( 37, lCenter ) SET ORDER TO [nIndex ] ordSetFocus( nIndex ) SET PATH TO Set( 6, "" ) [xcPathspec [, cPathspec1 ... ] ] cPathspec [, cPathspec1 ... ] ) SET PATH TO Set( 6, nanoBase 1997 user manual 4268 SET PRINTER ON Set( 23, "ON" | OFF | xlToggle | "OFF" | lToggle ) SET PRINTER TO Set( 24, "" ) SET PRINTER TO [xcDevice|xcFile [ADDITIVE]] | Set( 24, cDevice cFile , lAdditive ) SET RELATION TO dbclearrelation() [ SET RELATION TO expKey1 INTO xcAlias1 , TO expKey2 INTO xcAlias2 ... ADDITIVE [ [ ] [ ] ] ] if !lAdditive dbClearRel() end dbSetRelation( cAlias1 , {|| expKey1}, dbSetRelation( cAlias2 , {|| expKey2}, SET SCOREBOARD ON Set( 32, "ON" Set( 9, "ON" ) ) | OFF | xlToggle | "OFF" | lToggle SET SOFTSEEK ON ["expKey1 "] ["expKey1 "] ) | OFF | xlToggle | "OFF" | lToggle ) SET TYPEAHEAD TO nKeyboardSise Set( 14, nKeyboardSise ) SET UNIQUE ON | OFF | xlToggle Set( 10, "ON" | "OFF" | lToggle SET WRAP ON ) | OFF | xlToggle Set( 35, "ON" | "OFF" | lToggle ) SKIP SKIP [nRecords] [ALIAS [idAlias|nWorkArea -> ]( | idAlias nWorkArea [ ] ] dbSkip( nRecords ) ) STORE STORE value TO variable variable := value SUM [ ] [ ] [FOR lForCondition ]←] [RECORD nRecord] [REST] [ALL] [, idVar2 :=idVar2 +nExp2 ...] },←- SUM nExp1 , nExp2 ... TO idVar1 , idVar2 ... ,→ WHILE lWhileCondition NEXT nNextRecords [ ][ dbeval( {||idVar1 :=idVar1 +nExp1 ,→{||lForCondition }, {||lWhileCondition }, nNextRecords , nRecord , lRest ) UNLOCK UNLOCK dbUnlock() UNLOCK ALL dbUnlockAll() nanoBase 1997 user manual 4269 USE USE dbclosearea() [ ] USE xcDatabase ←,→ INDEX xcIndex1 , xcIndex2 ... [ [ ] [ALIAS ] [VIA cDriver]] dbUseArea( [lNewArea ], [cDriver], [dbSetIndex( cIndex1 )] [dbSetIndex( cIndex2 )] xcAlias ] [EXCLUSIVE|SHARED] [NEW] [ READONLY cDatabase, [cAlias], [lShared], [lReadOnly] ) ... 371.17 nB command substitution functions Inside nB there are many functions made only in substitution to other Clipper commands. GET @ nTop , nLeft GET Var PICTURE cGetPicture COLOR cColorString WHEN lPreExpression VALID lPostExpression [ [ [ [ ] ] ] ] Get( @aGetList , nTop , nLeft , { |x| iif( pcount() > 0, Var := x, Var ) } cGetPicture , cColorString , bPreExpression , bValid ) [ [ [ ] [ ] ] [ ] [ ] ] is the get list array that will be increased with this get(). aGetList SAY @ nTop , nLeft SAY exp PICTURE cSayPicture COLOR cColorString [ Say( nTop , nLeft , ] cVar , [cSayPicture ], [cColorString ] APPEND FROM APPEND FROM xcFile FIELDS idField_list scope WHILE lCondition FOR lCondition VIA xcDriver [ [ [ [ [ ] ] ] ] ] dbApp( cFileName , [acFields], [bForCondition ], [bWhileCondition ], [nNextRecords ], [nRecord], [lRest], [cDriver] ) APPEND FROM xcFile FIELDS idField_list scope WHILE lCondition FOR lCondition DELIMITED xcDelimiter [ [ [ [ ] ] ] ] ) nanoBase 1997 user manual 4270 [ ] [ ] ] [ ] ] dbDelim( .f., cFileName , cDelimiter , acFields , bForCondition , bWhileCondition , nNextRecords , nRecord , lRest ) [ [ ] [ ] [ APPEND FROM xcFile FIELDS idField_list scope WHILE lCondition FOR lCondition SDF [ [ [ [ ] ] ] ] [ ] dbSDF( .f., cFileName , acFields , bForCondition , bWhileCondition , nNextRecords , nRecord , lRest [ [ ] [ ] [ ] ] [ ] ) CONTINUE CONTINUE dbContinue() COPY COPY FILE xcSourceFile TO xcTargetFile |xcDevice CopyFile( cSourceFile , cTargetFile |cDevice ) [ ] COPY STRUCTURE FIELDS idField_list TO xcDatabase dbCopyStruct( cDatabase, [acFields] ) COPY STRUCTURE EXTENDED TO xcExtendedDatabase dbCopyXStruct( cExtendedDatabase ) COPY TO xcFile FIELDS idField_list scope WHILE lCondition FOR lCondition VIA xcDriver [ [ [ [ [ ] ] ] ] ] dbCopy( cFileName , [acFields], [bForCondition ], [bWhileCondition ], [nNextRecords ], [nRecord], [lRest], [cDriver] ) COPY TO xcFile FIELDS idField_list scope WHILE lCondition FOR lCondition DELIMITED xcDelimiter [ [ [ [ ] ] ] ] [ ] [ ] ] [ ] ] dbDelim( .t., cFileName , cDelimiter , acFields , bForCondition , bWhileCondition , nNextRecords , nRecord , lRest ) [ [ ] [ ] [ COPY TO xcFile FIELDS idField_list scope WHILE lCondition FOR lCondition SDF [ [ [ [ ] ] ] ] [ ] dbSDF( .t., cFileName , acFields , bForCondition , bWhileCondition , nNextRecords , nRecord , lRest [ [ ] [ ] [ ] ] [ ] ) nanoBase 1997 user manual 4271 CREATE CREATE xcDatabase FROM xcExtendedDatabase NEW ALIAS cAlias VIA cDriver [ ] [ [ ] ] dbOldCreate( cDatabase, cExtendedDatabase , cDriver , lNew , cAlias ) [ ] [ ] [ ] JOIN JOIN WITH xcAlias TO xcDatabase FOR lCondition FIELDS idField_list [ ][ ] dbJoin( cAlias , cDatabase, acFields , bForCondition [ ] [ ] ) KEYBOARD KEYBOARD cString Keyboard( [cString] ) ⇒ NIL LABEL FORM LABEL FORM xcLabel TO PRINTER TO FILE xcFile NOCONSOLE scope WHILE lCondition FOR lCondition SAMPLE [ [ [ [ [ [ [ ] ] ] ] ] ] ] [ ] [ ] [ ] [ ] ] [ ] [ ] [ dbLabelForm( cLabel , lToPrinter , cFile , lNoConsole , bForCondition , bWhileCondition nNextRecords , nRecord , lRest , lSample [ [ LIST LIST exp_list TO PRINTER TO FILE xcFile scope WHILE lCondition FOR lCondition OFF [ ] [ ] [ ] [ ] [ ] [ ] dbList( [lToDisplay], abListColumns , [lAll], [bForCondition ], [bWhileCondition ], [nNextRecords ], [nRecord], [lRest], [lToPrinter], [cFileName ] ) LOCATE [scope] FOR lCondition [WHILE lCondition] dbLocate( [bForCondition ], [bWhileCondition ], [nNextRecords ], [nRecord], [lRest] ) LOCATE PACK PACK dbPack() ], ]) nanoBase 1997 user manual 4272 PUBLIC PUBLIC idMemvar MemPublic( cMemvarName |acMemvarNames ) QUIT QUIT Quit() RELEASE RELEASE idMemvar MemRelease( cMemvarName |acMemvarNames ) REPORT FORM REPORT FORM xcReport TO PRINTER TO FILE xcFile NOCONSOLE scope WHILE lCondition FOR lCondition PLAIN | HEADING cHeading NOEJECT SUMMARY [ [ [ [ [ [ [ [ ] ] ] ] ] ] ][ ] ] RF( cForm , bForCondition , bWhileCondition , nNext , nRecord , lRest , lPlain , cbHeading , lBeforeEject , lSummary , lDate , acExtra ) ⇒ NIL [ [ [ [ ] [ ] ] [ ] [ ] [ ] [ ] [ ] [ ] ] ] RESTORE FROM [ADDITIVE] cMemFileName , [lAdditive] RESTORE FROM xcMemFile MemRestore( ) RUN RUN xcCommandLine Run( cCommand ) SAVE TO SAVE TO xcMemFile ALL LIKE|EXCEPT skeleton [ MemSave( [ ]] cMemFileName , [cSkeleton ], [lLike ] SET FUNCTION SET FUNCTION nFunctionKey TO cString SetFunction( nFunctionKey , cString ) SORT SORT TO xcDatabase ON idField1 / A|D , idField2 / A|D scope WHILE lCondition FOR lCondition [ [ [ [ [ [ ][C]] [ [ ][C]] ...] ] ] ] dbSort( cDatabase, [acFields], [bForCondition ], [bWhileCondition ], [nNextRecords ], [nRecord], [lRest] ) ) nanoBase 1997 user manual 4273 TOTAL TOTAL ON expKey FIELDS idField_list scope WHILE lCondition FOR lCondition [ [ [ [ ] TO xcDatabase ] ] ] [ dbTotal( cDatabase, bKey, acFields , bForCondition , bWhileCondition , nNextRecords , nRecord , lRest [ [ ] [ ] [ ] ]] [ ] ) UPDATE UPDATE FROM xcAlias ON expKey RANDOM REPLACE idField1 WITH exp , idField2 WITH exp ... [ ] [ dbUpdate( cAlias , bKey, ] [lRandom ], [bReplacement ] ) Example: dbUpdate( "INVOICE", {|| LAST}, .T.,; {|| FIELD->TOTAL1 := INVOICE->SUM1,; FIELD->TOTAL2 := INVOICE->SUM2 } ) ZAP ZAP dbZap() 371.18 RPT: the nB print function The function RPT() helps to print ASCII file containing Memvars, Fields and print commands. RPT() is accessible from the DOC() menu. 371.18.1 Memvars and fields As usual with standard word processors, variables are written delimited with "<" (Alt+174) and ">" (Alt+175). Inside these delimiters can find place character Memvars, character Fields and functions giving a character result. The RPT() function generates a public variable n_Lines that contains the available lines inside the actual sheet. Every time a line is written, this value is reduced, until a new page is reached and then it will start again from the maximum value. It is useful to read this variable to determinate if there is enough space or it is better to change page. 371.18.2 Commands The function RPT() recognise some print commands. These commands starts with the asterisk (*) symbol. This means that "*" is a print command prefix. It follows the command syntax. *COMMAND *COMMAND cStatement cStatement ... *END nanoBase 1997 user manual 4274 The lines contained inside *COMMAND - *END are executed with the nB macro interpreter. *DBSKIP *DBSKIP [nSkip ] It Executes a dbskip() on the active alias. *FOOT *FOOT cFooter cFooter ... *END The lines contained inside *FOOT - *END are printed each time at the bottom of pages. *HEAD *HEAD cHeader cHeader ... *END The lines contained inside *HEAD - *END are printed each time at the top of pages. *IF *IF lCondition ... ... *END If the condition lCondition is true, the lines contained inside *IF - *END are printed. *INSERT *INSERT cFileName Includes the text contained into the file cFileName . *LEFT *LEFT nLeftBorder The nLeftBorder is the number of column to be left blank as a left border. *LPP *LPP nLinesPerPage It determinates the page length expressed in lines. After printing the nLinesPerPage th line, a form feed is sent. *NEED *NEED nLinesNeeded If the available lines are less then nLinesNeeded , the follwing text will be printed on the next page. *PA *PA Jumps to a new page. *REM *REM | *COMMENT [comment_line ] It adds a comment that will not be printed. nanoBase 1997 user manual 4275 *WHILE *WHILE lCondition ... ... *END The lines contained inside *WHILE - *END are printed as long as lCondition is true. 371.18.3 Examples It follows some example of text to be printed with the RPT() function. Example’s lines are numbered. Line numbers must not be part of a real RPT text files. PAGE DEFINITION Margins are defined with *HEAD, *FOOT and *LEFT commands. In the following example is defined: Top 2 lines; Bottom 2 lines; Left 10 characters. The right margin is not defined as it depends on the lines length that will be printed. The only considered page dimension is the height, *LPP (lines per page): Page height 66 lines. Here starts the example: 001 002 003 004 005 006 007 008 009 010 011 012 ... *lpp 66 *head *end *foot *end *left 10 ... text text text ... test text text At line 001 is defined the page height in lines. At line 002 is defined the header; it contains two empty lines (003 and 004) which will be printed at the top of every page. At line 006 starts the footer definition that contains two empty lines (007 and 008) that will be printed at the end of every page. At line 010 is defined the space on the left that will be added to every line printed. From line 011 starts the normal text. HEADER AND FOOTER The commands *HEAD and *FOOT are used to define the top and bottom border if they contains empty lines, it these lines are not empty, they became real head and foot. The dimensions are as it follows: Top 6 lines (should be one inch); Bottom 6 lines; Left 10 characters (should be an inch). Page height 66 lines (should be 11 inch). At position 0.5 in (after 3 lines) a one line header appears. nanoBase 1997 user manual 4276 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 ... *lpp 66 *head ------------------- MYFILE.TXT ------------------- *end *foot *end *left 10 ... text text text ... test text text At line 006 (the fourth header line) a text appears. It will be printed on every page at the absolute fourth page line. CODE INSERTION Pieces of code can be inserted inside *COMMAND - *END. It can be useful to make complicated reports. The following example declares a public variable used to number pages. 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 ... *command mempublic("PageNo") PageNo := 0 *end *lpp 66 *head *command PageNo := PageNo +1 *end *end *foot Page <PageNo> *end *left 10 ... text text text ... test text text At line 001 starts a *COMMAND definition: lines 002 and 003 will be interpreted from the function EX(), the nB interpreter. These lines define a public variable and initialize it at 0. This variable will be use to count pages. At line 007, inside the header (nested), start another *COMMAND definition that contains an increment for the "PageNo" variable. As the header is read and "executed" for every new page, and that before the footer, the variable "PageNo" will contain the right page number. At line 015, inside the footer, a reference to "PageNo" appears. Here will be printed the page number. A more complicated example can be found in ‘ADDRESS.TXT’ the RPT text file used for the ADDRESS.& macro examples. nanoBase 1997 user manual 4277 371.19 How can I... nB is a little bit complicated as it may do many things. Here are some examples. Create a UDF function UDF means User Defined Function. Inside nB there isn’t the possibility to create functions, but there is an alternative: code blocks. Create a big code block A code block cannot be longer than 254 characters, as any other instruction inside nB. So, there is no way to make a bigger code block, but a code block can call another code block, and so on. For example: mempublic( { "first", "second", "third" } ) first := {|| eval( second, "hello" ) } second := {|x| eval( third, x ) } third := {|x| alertbox( x ) } eval( first ) This stupid example simply will show the alert box containing the word "hello". 371.20 The source files The nB source is composed of four files: ‘NB.PRG’ ‘REQUEST.PRG’ ‘STANDARD.PRG’ ‘EXTRA.PRG’ The main source file containing essentially the nB menu. Contains a link to all Clipper standard functions. Contains the most important standard functions. Contains some extra function not absolutely necessary during macro execution. The file ‘REQUEST.PRG’ source file generates some warnings because not all functions listed there are directly called form nB. Don’t worry about that warning message. Different ‘.RMK’ (rmake) files are included to compile nB differently, including/excluding some program parts, for example to obtain a runtime executor. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 4278 nanoBase 1997 user manual Parte lxxviii Sistemi operativi speciali 372 LeeOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4280 4279 Capitolo 372 LeeOS LeeOS 1 è un sistema operativo specifico per i86 realizzato in modo da utilizzare il minimo di risorse necessario. I file binari che compongono il sistema, ovvero il settore di avvio, un programma di inizializzazione, il kernel e la shell, vanno collocati in un dischetto in settori specifici. Per la realizzazione di un dischetto di avvio corretto viene fornito un programma Dos, ‘COPYBOOT.EXE’, che richiede l’indicazione del nome del file da copiare e del settore iniziale in cui collocarlo nel dischetto. In pratica, per la versione 0.0.2 si interviene con i comandi seguenti: C:>COPYBOOT BOOT.BIN 0 C:>COPYBOOT INIT.BIN 1 C:>COPYBOOT KERNEL.BIN 2 C:>COPYBOOT SHELL.BIN 4 Volendo usare ‘dd’ in un sistema Unix, i comandi dovrebbero essere i seguenti, tenendo conto che ‘/dev/fd0’ è inteso essere il file di dispositivo dell’unità a dischetti, come avviene con GNU/Linux: # dd if=boot.bin of=/dev/fd0 obs=512 seek=0 # dd if=init.bin of=/dev/fd0 obs=512 seek=1 # dd if=kernel.bin of=/dev/fd0 obs=512 seek=2 # dd if=shell.bin of=/dev/fd0 obs=512 seek=4 Il dischetto che si ottiene così può essere avviato anche all’interno di DOSEMU: # dos -A Si ottiene un invito come quello seguente: Welcome to LeeOS! Guest / > La shell a disposizione offre qualche comando; in particolare consente l’uso del comando ‘help’: Guest / > help[ Invio ] LeeOS version 0.0.2 Copyright (c) 2001 by Robert Lee The following commands are available: + + + + + + + + help status login run type cls reset shutdown 1 Display this message Display session information Change user Execute machine code on a specified sector Display the contents of a specified sector Clear the screen Restart the system Prepare system for reset LeeOS licenza quasi identica alla Artistic 4280 LeeOS 4281 Nel momento in cui viene scritto questo capitolo introduttivo al sistema LeeOS, il lavoro di sviluppo è appena iniziato e non ci sono applicativi che possano essere utilizzati con tale sistema. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 4282 LeeOS Parte lxxix Braille 373 Introduzione al sistema braille . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4284 373.1 Origini e caratteristiche del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4284 373.2 Codifica semplificata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4285 373.3 Braille a otto punti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4286 373.4 Tabelle di conversione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4286 373.5 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4288 374 Sistemi di interazione per non vedenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4289 374.1 Lettura di ciò che appare sullo schermo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4289 374.2 Terminali braille . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4290 374.3 Brltty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4291 374.4 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4292 4283 Capitolo 373 Introduzione al sistema braille Lo scopo di questo capitolo è quello di descrivere brevemente il codice usato dal sistema braille, in modo di facilitare la comprensione del funzionamento di un terminale per non vedenti. Ciò potrebbe servire per verificare l’installazione e la configurazione corretta di un dispositivo del genere. 373.1 Origini e caratteristiche del sistema Il sistema di scrittura per non vedenti è stato inventato da Louis Braille nel 1829, da cui viene il nome. Luis Braille era francese e in questo senso vanno viste le scelte che possono sembrare insolite, per chi è abituato a convenzioni derivanti dalla lingua inglese. Il sistema codifica 63 simboli rappresentati ognuno da una cella in cui possono essere collocati un massimo di sei punti in rilievo: .----. |* *| |* *| |* *| ‘----’ Tanto per fare un esempio, se si possono immaginare gli asterischi della figura seguente come altrettanti punti in rilievo, la parola «ciao!» si può rappresentare in questo modo: * * * * * * * * * * * Il sistema braille è fatto fondamentalmente per una scrittura manuale, che avviene attraverso l’uso di una tavoletta speciale, come si può vedere nelle figure 373.3 e 373.4. Figura 373.3. Tavoletta di scrittura braille normale. 4284 Introduzione al sistema braille 4285 La scrittura avviene su un foglio di cartoncino bloccato sulla tavoletta, con l’aiuto di un punteruolo, guidato dalle feritoie poste su un regolo mobile (nel caso della tavoletta tascabile, il regolo è fisso). Dal momento che la scrittura avviene attraverso l’incisione del cartoncino, la lettura tattile, in rilievo, potrà avvenire solo sull’altro lato; pertanto, per quanto riguarda le lingue latine, la scrittura avviene da destra verso sinistra e la lettura da sinistra a destra. Figura 373.4. Tavoletta di scrittura braille tascabile. La fase si scrittura avviene incidendo il cartoncino. In questo caso, non si vede la fila superiore, perché rimane coperta dall’ombra. Figura 373.5. Testo inciso da destra verso sinistra. Figura 373.6. Testo in rilievo da sinistra verso destra. Il braille standard è composto da celle con un massimo di sei punti in rilievo, per un massimo di 26-1 segni, più lo spazio; tuttavia, possono esistere anche dispositivi braille predisposti per un massimo di otto punti in rilievo. 373.2 Codifica semplificata La disposizione classica della codifica del braille è sintetizzata dalle figure 373.9 e 373.10. Chi volesse studiare ed esercitarsi con il braille, farebbe bene a copiare le due figure in modo da mettere a sinistra quella dei segni in scrittura e a destra quella dei segni in lettura. Come si può comprendere a livello intuitivo, i 63 simboli non consentono di distinguere le lettere minuscole da quelle maiuscole; in generale si tratta sempre solo di lettere minuscole che diventano maiuscole se precedute dal segno relativo. Per esempio, «Daniele» si scrive così: * * * * * * * * * * * * * * * * * * * Introduzione al sistema braille 4286 Nello stesso modo, come si vede, non sono previsti i numeri. Questi si ottengono indicando il segno di numero davanti alle prime 10 lettere alfabetiche. Per esempio, 123 si indica così: * * * * * * * * * Pertanto, a differenza delle maiuscole, il segno di numero vale per tutta la sequenza di simboli successiva. Esistono naturalmente altri dettagli molto importanti per chi deve usare il braille, che però qui non vengono descritti. Purtroppo, i segni a disposizione sono molto pochi e di conseguenza, tutto quanto ha sempre un valore relativo al contesto. 373.3 Braille a otto punti La codifica a otto punti consente di utilizzare una sola cella per indicare una lettera maiuscola o un numero. Ciò diventa particolarmente importante in un terminale braille, in cui è bene che si possa mantenere una corrispondenza tra celle e caratteri. 373.4 Tabelle di conversione L’abbinamento del braille all’informatica, impone l’introduzione di tabelle di conversione dalla codifica dei caratteri al braille stesso. In pratica, in base alla nazionalità, si utilizza una codifica particolare; oltre a questo, deve essere definito un abbinamento tra codice binario (ASCII, ISO 8859-n , ecc.) e rappresentazione braille. Quando si utilizza un terminale braille o un sistema di stampa braille, occorre stabilire anche questo tipo di conversione. Introduzione al sistema braille 4287 Figura 373.9. La codifica braille per la scrittura da destra verso sinistra, secondo l’ordine classico. j * * . . * . * . . i . * . . * . h * * . * * . g * * . * . . . * * * . . s . * * . * . r * * * * * . q * * * * . . . * * * . * è . * * . * * à * * * * * * é * * * * . * . * . * . * æ . * . . * * ü * * . * * * ï * * . * . * . . * . * . * . . * . . * » . * * . * * t * * . ù * * * w * * * « . * * numero * . * . * * . . * . . . . * * . . . f . * . e * . . * * . d * . . * . . * * * . * . o * . * * * . n * . * * . . * * * . * * z * . * * * * y * . * * . * * * . . * * û * . . * * * ô * . . * . * . * * . . * ? . * . . * * . . * . . * . p ç ë () ! . * * ò * . * * * . . . * maiuscole * . . . * . . * . verso * . * . . * . * . . . . ì * . * * . . corsivo * . * . * . c * . . . . . b * * . . . . a * . . * . * . . . l * * * . . . k * . * * . * . . * v * * * . . * u * . * * . . . . * ê * * . . . * â * . . . * . . . . ; . * * . . . , . * . m x î : lineetta . . . . * * * * . . . . apostrofo . . . . . * * . . . . . Introduzione al sistema braille 4288 Figura 373.10. La codifica braille per la lettura da sinistra verso destra, secondo l’ordine classico. a * . . b . . . * * . . . . * * * . . * * * * . . * * * . . . . . * * k * . * * . * . . * * . * . . * * . . . . . . * . d * . . * . . * . . * . * * . * * . * * . * * . . . * . . * . m * * . * . * * * * * . * * * * * . . : . * * . * . . . . . . . * * . * * . . * . * * * . * * * * * . * * * * . . . * . * * * . . * * * * . * * * * * . * * * . . * . . * * . . . . * . * * . * * . * * * * * * * * * * * * * * . . * * . * * i . * . . * . . * . . * * . * * . * * . * * . * . . . * . . * r é maiuscole . * . . . * * . . . * * * * . * . * . * * * . * . * . . * . . . * . * * . . . . . * t * * . ù æ « ò . * . . * * . * . è ü () j * . . s à ï ! verso . * . * * . h * * . q ë ? corsivo . * . * . * * * . ç û ì * * . . . * g * . . p z . lineetta . . . . * * f . * . o ô apostrofo . . . . * . * . . * . . y î ; e * * . n x ê , . * . . . . v â * . . * . . l u * . * c . . . * * * w * * * * » numero . * . * * * . . . . * * 373.5 Riferimenti • Dottless braille <http://www.dotlessbraille.org/> • A (slightly) different introduction to braille <http://www.dotlessbraille.org/AboutBraille.htm> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 374 Sistemi di interazione per non vedenti I sistemi standard di interazione per non vedenti con un elaboratore sono di due tipi, che si integrano convenientemente assieme: il terminale braille e la lettura automatica di ciò che appare sullo schermo. Il terminale braille è un’unità che si collega generalmente a una porta seriale o parallela e richiede la presenza di un programma in grado di leggere ciò che appare sullo schermo normale; il sistema di lettura automatica richiede naturalmente un programma simile. Un sistema di lettura automatico è apparentemente un problema semplice da risolvere; in pratica le cose non sono così, perché deve anche essere in grado di individuare la struttura del testo (si pensi a un’organizzazione in più colonne). Il sistema che sembra essere più efficace per la lettura sonora del testo è Emacspeach, che comunque qui non viene descritto. Si vedano eventualmente i riferimenti bibliografici alla fine del capitolo. 374.1 Lettura di ciò che appare sullo schermo Qualunque sistema di lettura per non vedenti (braille o audio), deve avere un modo per accedere a ciò che appare sullo schermo. Esistono evidentemente due modi: ciò che appare sullo schermo è controllato direttamente dal programma di lettura, oppure questo programma deve interagire con il sistema operativo per ottenere una copia dello schermo. Un programma che controlla ciò che si deve leggere potrebbe essere una shell, oppure una sorta di navigatore ipertestuale, che eventualmente incorpori anche delle funzionalità per la creazione e la modifica dei documenti (dovrebbe essere questo il caso di Emacspeach). Nel caso di GNU/Linux si accede a una copia di ciò che appare sullo schermo della console attiva attraverso il file di dispositivo ‘/dev/vcsa’ o ‘/dev/vcsa0’. In particolare questi file di dispositivo consentono di ottenere informazioni anche sugli attributi del testo, cosa che permette di localizzare il cursore, per esempio; esistono infatti anche i file di dispositivo ‘/dev/vcs*’ che consentono di ottenere una pura copia testuale delle console virtuali. Questi file di dispositivo sono normalmente inaccessibili a utenti diversi dall’amministratore; pertanto, per consentire una lettura a programmi con privilegi limitati, occorre intervenire nei permessi. Supponendo di dover creare da zero il file di dispositivo ‘/dev/vcsa0’, probabilmente si dovrebbe agire come segue: # mknod /dev/vcsa0 c 7 128[ Invio ] # chown root.tty /dev/vcsa0[ Invio ] # chmod 660 /dev/vcsa0[ Invio ] In pratica, si arriva alla fine a dare i permessi di lettura e scrittura anche al gruppo, supponendo che il programma che deve utilizzarlo funzioni, in questo caso, con i privilegi del gruppo ‘tty’ (SGID-‘tty’). Ciò consente di mantenere un minimo di riservatezza, nonostante il problema contingente da risolvere. Volendo verificare che il file di dispositivo ‘/dev/vcsa0’ consente di accedere al contenuto dello schermo della console virtuale attuale, si può inviarne una copia in una console inattiva o comunque non utilizzata. Per esempio: # cat /dev/vcsa0 > /dev/tty12[ Invio ] Manda una copia alla 12-esima console virtuale e si può verificare facilmente con la combinazione di tasti [ Alt+F12 ]. 4289 Sistemi di interazione per non vedenti 4290 374.2 Terminali braille Il terminale braille è solitamente un componente da collocare al di sotto della tastiera normale, attraverso il quale è possibile leggere una riga di testo, senza allontanare troppo le dita dalla tastiera stessa. Vicino alla barra contenente le celle braille, devono essere disponibili alcuni tasti per il controllo del terminale stesso, per poter navigare sulla superficie di quello che appare sullo schermo. Infatti, di solito di dispone di una sola riga di celle braille, ma anche se potessero essere disponibili più di una, non sarebbero mai quante le righe che si vedono su uno schermo normale; inoltre, anche la quantità di celle è limitata, per cui diventa necessario poter spostare la «visualizzazione» braille anche in orizzontale. Figura 374.1. Collocazione tipica di un terminale braille, sotto la tastiera o sotto un elaboratore portatile. La figura 374.2 mostra in particolare un dettaglio delle celle di un terminale braille a otto punti. Figura 374.2. Dettaglio delle celle di un terminale braille. Sistemi di interazione per non vedenti 4291 374.3 Brltty Brltty 1 è un programma in grado di comunicare con un terminale braille, allo scopo di inviargli ciò che accade sullo schermo della console virtuale attiva di un sistema GNU/Linux. Il funzionamento del programma è relativamente semplice: si tratta di un demone, ‘brltty’, da avviare e fermare automaticamente attraverso la procedura di inizializzazione del sistema, che comunica con il terminale braille seguendo la configurazione relativa al terminale stesso e la configurazione della conversione braille. In pratica, Brltty deve conoscere il tipo di terminale braille utilizzato e deve disporre di una tabella di conversione adatta per quanto riguarda la codifica usata e l’alfabeto braille dell’utilizzatore. 374.3.1 Configurazione Brltty è accompagnato da una serie di file di libreria, per l’adattamento alle caratteristiche del terminale braille e per la conversione finale della codifica in braille. Questi file dovrebbero essere collocati nella directory ‘/etc/brltty/’. Il file di configurazione in cui occorre intervenire dovrebbe essere ‘/etc/brltty.conf’, il cui contenuto potrebbe apparire come nell’esempio seguente: braille-device /dev/ttyS0 braille-driver ec dot-translation text.us.tbl Si comprende intuitivamente il significato delle direttive: il terminale viene connesso alla prima porta seriale, corrispondente al file di dispositivo ‘/dev/ttyS0’; il terminale braille viene gestito attraverso un protocollo definito dalla sigla ‘ec’; la trasformazione della codifica in braille avviene secondo il modello denominato ‘text.us.tbl’, che in pratica è un file contenuto nella directory ‘/etc/brltty/’, facente riferimento a un adattamento per la lingua inglese. Tabella 374.1. Sigle attraverso le quali si abbinano le librerie di controllo del terminale braille. Sigla al b1 b4 cb ec eu md pm ts va Terminale corrispondente Alva (ABT3xx/Delphi) BrailleLite 18 BrailleLite 40 Tieman CombiBraille EcoBraille EuroBraille MDV braille Papenmeier TSI (PowerBraille/Navigator) BAUM Vario Brltty è anche in grado di gestire terminali parlanti. Eventualmente, si può usare la direttiva ‘speech-driver’ per il controllo della sintesi vocale. Di solito, la funzionalità è disabilitata, con la direttiva seguente: speech-driver no 1 Brltty GNU GPL Sistemi di interazione per non vedenti 4292 Tabella 374.2. Sigle relative alla gestione della sintesi vocale. Sigla no al bl cb fv gs tv Sintesi vocale No Speech Alva (Delphi) BrailleLite Tieman CombiBraille Festival Text to Speech Package Generic Say (invia allo standard input di ‘/usr/local/bin/say’) Televox Speech Interface 374.3.2 Accesso alla copia della console virtuale corrente Come già spiegato in precedenza, anche Brltty deve poter accedere a una copia della console virtuale corrente. Ciò avviene precisamente attraverso il file di dispositivo ‘/dev/vcsa0’, che in alcuni sistemi GNU/Linux potrebbe anche essere assente, perché equivalente a ‘/dev/vcsa’. Si riepilogano nuovamente i passi necessari a creare il file e ad attribuirgli i permessi necessari per il funzionamento corretto con Brltty. # mknod /dev/vcsa0 c 7 128[ Invio ] # chown root.root /dev/vcsa0[ Invio ] # chmod 600 /dev/vcsa0[ Invio ] In questo caso, si presume che il demone ‘brltty’ sia avviato attraverso la procedura di inizializzazione del sistema, in modo tale da funzionare con tutti i privilegi dell’utente ‘root’. Diversamente, occorre cambiare strategia per quanto riguarda i permessi e la proprietà del file di dispositivo. 374.4 Riferimenti • BRLTTY - official home <http://dave.mielke.cc/brltty/> • BRLSPEAK: a braille and speech mini-distribution of GNU/Linux <http://www.audiobraille.org/blinux/brlspeak.html> • Blind + Linux = BLINUX <http://leb.net/blinux/> Parte lxxx Aspetti umani 375 Manifesto GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4294 376 Il progetto GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4302 376.1 La prima comunità di condivisione del software . . . . . . . . . . . . . . . . . . . . . . . . . . 4302 376.2 La comunità si dissolve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4302 376.3 Una difficile scelta morale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4304 376.4 "Free" come libero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4305 376.5 Software GNU e il sistema GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4305 376.6 L’inizio del progetto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4306 376.7 I primi passi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4306 376.8 GNU Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4306 376.9 Un programma è libero per tutti? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4307 376.10 Il permesso d’autore (copyleft) e la GNU GPL . . . . . . . . . . . . . . . . . . . . . . . . . . 4307 376.11 La Free Software Foundation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4308 376.12 Il supporto per il software libero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4309 376.13 Obiettivi tecnici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4309 376.14 Donazioni di computer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4309 376.15 L’elenco dei compiti GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4310 376.16 La licenza GNU per le librerie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4310 376.17 Togliersi il prurito? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4311 376.18 Sviluppi inattesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4311 376.19 GNU-Hurd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4312 376.20 Alix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4312 376.21 Linux e GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4312 376.22 Le sfide che ci aspettano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4313 376.23 Hardware segreto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4313 376.24 Librerie non libere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4313 376.25 Brevetti sul software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4314 376.26 Documentazione libera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4314 376.27 Dobbiamo parlare di libertà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4315 376.28 "Open Source" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4316 376.29 Prova! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4316 377 Proprietà del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4317 377.1 Dal copyright al brevetto e conseguenze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4317 377.2 Problemi legati al brevetto sul software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4319 377.3 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4320 378 L’ipotesi del futuro, nel bene e nel male . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4321 378.1 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4322 Indice analitico del volume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4323 4293 Capitolo 375 Manifesto GNU non modificabile Testo originale: <http://www.fsf.org/gnu/manifesto.html> Traduzione originale: <http://www.fsf.org/gnu/manifesto.it.html> Copyright (C) 1985, 1993 Free Software Foundation, Inc. Chiunque è autorizzato a fare o distribuire copie letterali di questo documento, con qualsiasi mezzo, a condizione che siano riprodotte la nota sul copyright e la nota di autorizzazione, e che il distributore conceda al destinatario l’autorizzazione di ridistribuirlo a sua volta alle condizioni permesse da questa nota. Non sono consentite versioni modificate. Il Manifesto GNU Il Manifesto GNU (che appare sotto) venne scritto da Richard Stallman all’inizio del progetto GNU, per sollecitare sostegno e partecipazione. Durante i primi anni il manifesto venne lievemente aggiornato per tener conto degli sviluppi, ma adesso la scelta migliore sembra essere quella di lasciarlo immutato nella forma in cui molti lo hanno visto. Da allora abbiamo preso atto di alcuni fraintendimenti che si potrebbero evitare con una diversa scelta di termini. Le note in calce aggiunte nel 1993 aiutano a chiarire questi punti. Per informazioni aggiornate sulla disponibilità del software GNU, consultate quelle disponibili sul nostro server web, in particolare il nostro elenco del software. Cos’è GNU? Gnu Non è Unix! GNU, che sta per "Gnu’s Not Unix" (Gnu Non è Unix), è il nome del sistema software completo e Unix-compatibile che sto scrivendo per distribuirlo liberamente a chiunque lo possa utilizzare.1 Molti altri volontari mi stanno aiutando. Abbiamo gran necessità di contributi in tempo, denaro, programmi e macchine. Fino ad ora abbiamo un editor Emacs fornito di Lisp per espanderne i comandi, un debugger simbolico, un generatore di parser compatibile con yacc, un linker e circa 35 utility. È quasi pronta una shell (interprete di comandi). Un nuovo compilatore C portabile e ottimizzante ha compilato se stesso e potrebbe essere pubblicato quest’anno. Esiste un inizio di kernel, ma mancano molte delle caratteristiche necessarie per emulare Unix. Una volta terminati il kernel e il compilatore sarà possibile distribuire un sistema GNU utilizzabile per lo sviluppo di programmi. Useremo TeX come formattatore di testi, ma lavoriamo anche su un nroff. Useremo inoltre il sistema a 1 La scelta delle parole è stata poco accurata. L’intenzione era che nessuno dovesse pagare per il *permesso* di usare il sistema GNU. Ma le parole non lo esprimono chiaramente, e la gente le interpreta spesso come asserzione che GNU debba sempre essere distribuito in forma gratuita o a basso prezzo. Non è mai stato questo l’intento; più oltre il manifesto parla della possibile esistenza di aziende che forniscano il servizio di distribuzione a scopo di lucro. Di conseguenza ho imparato a distinguere tra "free" nel senso di libero e "free" nel senso di gratuito. Il software libero è il software che gli utenti sono liberi di distribuire e modificare. Alcuni lo avranno gratuitamente, altri dovranno pagare per ottenere le loro copie, e se dei finanziamenti aiutano a migliorare il software tanto meglio. La cosa importante è che chiunque ne abbia una copia sia libero di cooperare con altri nell’usarlo. 4294 Manifesto GNU 4295 finestre portabile libero X. Dopo di che aggiungeremo un Common Lisp portabile, il gioco Empire, un foglio elettronico e centinaia di altre cose, oltre alla documentazione in linea. Speriamo di fornire, col tempo, tutte le cose utili che normalmente si trovano in un sistema Unix, ed anche di più. GNU sarà in grado di far girare programmi Unix, ma non sarà identico a Unix. Apporteremo tutti i miglioramenti che sarà ragionevole fare basandoci sull’esperienza maturata con altri sistemi operativi. In particolare abbiamo in programma nomi più lunghi per i file, numeri di versione per i file, un filesystem a prova di crash, forse completamento automatico dei nomi dei file, supporto indipendente dal terminale per la visualizzazione e forse col tempo un sistema a finestre basato sul Lisp, attraverso il quale più programmi Lisp e normali programmi Unix siano in grado di condividere lo schermo. Sia C che Lisp saranno linguaggi per la programmazione di sistema. Per le comunicazioni vedremo di supportare UUCP, Chaosnet del MIT ed i protocolli di Internet. GNU è inizialmente orientato alle macchine della classe 68000/16000 con memoria virtuale, perché sono quelle su cui è più facile farlo girare. Lasceremo agli interessati il lavoro necessario a farlo girare su macchine più piccole. Vi preghiamo, per evitare confusioni, di pronunciare la ’G’ nella parola ’GNU’ quando indica il nome di questo progetto. [N.d.T.: questa avvertenza serve ad evitare che in inglese "GNU" sia pronunciato come la parola "new"]. Perché devo scrivere GNU Io credo che il punto fondamentale sia che, se a me piace un programma, io debba condividerlo con altre persone a cui piace. I venditori di software usano il criterio "divide et impera" con gli utenti, facendo sì che non condividano il software con altri. Io mi rifiuto di spezzare così la solidarietà con gli altri utenti. La mia coscienza non mi consente di firmare un accordo per non rivelare informazioni o per una licenza d’uso del software. Ho lavorato per anni presso il laboratorio di intelligenza artificiale per resistere a queste tendenze e ad altri atteggiamenti sgradevoli, ma col tempo queste sono andate troppo oltre: non potevo rimanere in una istituzione dove ciò viene fatto a mio nome contro la mia volontà. Per poter continuare ad usare i computer senza disonore, ho deciso di raccogliere un corpus di software libero in modo da andare avanti senza l’uso di alcun software che non sia libero. Mi sono dimesso dal laboratorio di Intelligenza Artificiale per togliere al MIT ogni scusa legale che mi impedisca di distribuire GNU. Perché GNU sarà compatibile con Unix Unix non è il mio sistema ideale, ma non è poi così male. Le caratteristiche essenziali di Unix paiono essere buone e penso di poter colmare le lacune di Unix senza rovinarne le caratteristiche. E adottare un sistema compatibile con Unix può risultare pratico anche per molti altri. Come sarà reso disponibile GNU GNU non è di pubblico dominio. A tutti sarà permesso di modificare e ridistribuire GNU, ma a nessun distributore sarà concesso di porre restrizioni sulla sua ridistribuzione. Questo vuol dire che non saranno permesse modifiche proprietarie. Voglio essere sicuro che tutte le versioni di GNU rimangano libere. Perché molti altri programmatori desiderano essere d’aiuto Ho trovato molti altri programmatori molto interessati a GNU che vogliono dare una mano. Molti programmatori sono scontenti della commercializzazione del software di sistema. Li può aiutare a far soldi, ma li costringe in generale a sentirsi in conflitto con gli altri programmatori, invece che solidali. L’atto di amicizia fondamentale tra programmatori è condividere programmi; le politiche di commercializzazione attualmente in uso essenzialmente proibiscono ai program- 4296 Manifesto GNU matori di trattare gli altri come amici. Gli acquirenti del software devono decidere tra l’amicizia e l’obbedienza alle leggi. Naturalmente molti decidono che l’amicizia è più importante. Ma quelli che credono nella legge non si sentono a proprio agio con queste scelte. Diventano cinici e pensano che programmare sia solo un modo per fare soldi. Lavorando e utilizzando GNU invece che programmi proprietari, possiamo comportarci amichevolmente con tutti e insieme rispettare la legge. Inoltre GNU è un esempio che ispira gli altri e una bandiera che li chiama a raccolta perché si uniscano a noi nel condividere il software. Questo ci può dare una sensazione di armonia che sarebbe irraggiungibile se usassimo software che non sia libero. Per circa la metà dei programmatori che conosco è una soddisfazione importante, che il denaro non può sostituire. Come si può contribuire Chiedo ai produttori di computer donazioni in denaro e macchine, ed ai privati donazioni in programmi e lavoro. Donare delle macchine può far sì che su di esse giri ben presto GNU. Le macchine devono essere sistemi completi e pronti all’uso approvati per l’utilizzo in aree residenziali e non devono richiedere raffreddamento o alimentazione di tipo sofisticato. Ho conosciuto moltissimi programmatori desiderosi di contribuire a GNU part-time. Per la gran parte dei progetti, un lavoro part-time distribuito risulterebbe troppo difficile da coordinare, perché le varie parti scritte indipendentemente non funzionerebbero insieme. Ma per scrivere un sostituto di Unix questo problema non si pone, perché un sistema Unix completo contiene centinaia di programmi di servizio, ognuno con la propria documentazione separata, e con gran parte delle specifiche di interfaccia date dalla compatibilità con Unix. Se ogni partecipante scrive un solo programma da usare al posto di una utility di Unix, il quale funzioni correttamente al posto dell’originale su un sistema Unix, allora questi programmi funzioneranno bene una volta messi assieme. Anche considerando qualche imprevisto dovuto a Murphy, assemblare tali componenti è un lavoro fattibile. Il kernel invece richiederà una più stretta cooperazione, e verrà sviluppato da un gruppo piccolo e affiatato. Donazioni in denaro possono mettermi in grado di assumere alcune persone a tempo pieno o parttime. Lo stipendio non sarà alto rispetto agli standard dei programmatori, ma io cerco persone per le quali lo spirito della comunità GNU sia importante quanto il denaro. Io lo vedo come un modo di permettere a degli appassionati di dedicare tutte le loro energie al lavoro su GNU senza essere costretti a guadagnarsi da vivere in un altro modo. Perché tutti gli utenti dei computer ne trarranno beneficio Una volta scritto GNU, ognuno potrà avere liberamente del buon software di sistema, così come può avere l’aria.2 Questo significa molto di più che far risparmiare a ciascuno il costo di una licenza Unix: vuol dire evitare l’inutile spreco di ripetere ogni volta lo sforzo della programmazione di sistema. Queste energie possono essere invece impiegate ad avanzare lo stato dell’arte. I sorgenti completi del sistema saranno a disposizione di tutti. Di conseguenza, un utente che abbia necessità di apportare dei cambiamenti al sistema sarà sempre in grado di farlo da solo o di commissionare i cambiamenti ad un programmatore o ad un’impresa. Gli utenti non saranno più in balia di un solo programmatore o di una impresa che, avendo la proprietà esclusiva dei sorgenti, sia la sola a poter fare le modifiche. 2 Questo è un altro punto dove non sono riuscito a distinguere chiaramente tra i due significati di "free". La frase, così com’è, non è falsa, si possono ottenere gratuitamente copie del software GNU, o dagli amici o attraverso la rete. Ma in effetti suggerisce un’idea sbagliata. Manifesto GNU 4297 Le scuole avranno la possibilità di fornire un ambiente molto più educativo, incoraggiando gli studenti a studiare e migliorare il software di sistema. I laboratori di informatica di Harvard avevano una politica per cui nessun programma poteva essere installato nel sistema senza che i sorgenti fossero pubblicamente consultabili, e la praticarono rifiutandosi effettivamente di installare alcuni programmi. Questo comportamento mi è stato di grande ispirazione. Infine, scompariranno le necessità burocratiche di tener conto di chi sia il proprietario del software di sistema e di chi abbia il diritto di farci cosa. Ogni sistema per imporre tariffe d’uso di un programma, comprese le licenze d’uso per le copie, è sempre estremamente costoso in termini sociali a causa del complesso meccanismo necessario per decidere quanto (cioè per quali programmi) ognuno debba pagare, e solo uno stato di polizia può costringere tutti all’obbedienza. Immaginate una stazione spaziale dove l’aria deve essere prodotta artificialmente ad un costo elevato: far pagare ogni litro d’aria consumato può essere giusto, ma indossare la maschera col contatore tutto il giorno e tutta la notte è intollerabile, anche se tutti possono permettersi di pagare la bolletta. E le videocamere poste in ogni dove per controllare che nessuno si tolga mai la maschera sono offensive. Meglio finanziare l’impianto di ossigenazione con una tassa pro capite e buttar via le maschere. Copiare un programma in tutto o in parte è tanto naturale per un programmatore quanto respirare ed è altrettanto produttivo. Dovrebbe essere altrettanto libero. Alcune obiezioni facilmente confutabili agli obiettivi GNU «La gente non lo userà se è gratuito, perché non potrà avere l’assistenza.» «Un programma deve essere a pagamento, per poter fornire supporto adeguato.» Se la gente preferisse pagare per GNU più l’assistenza piuttosto che avere GNU gratis senza assistenza, allora un’impresa che fornisse assistenza a chi si è procurato GNU gratis potrebbe operare con profitto.3 Si deve distinguere tra il supporto sotto forma di lavoro di programmazione e la semplice gestione. Il primo non è ottenibile da un venditore di software. Se il problema non è sentito da un numero sufficiente di clienti allora il venditore dirà al cliente di arrangiarsi. Per chi deve poter contare su questo tipo di supporto l’unica soluzione è di disporre dei sorgenti e degli strumenti necessari, in modo da poter commissionare il lavoro a chi sia disposto a farlo, invece che rimanere in balia di qualcuno. Con Unix il prezzo dei sorgenti rende ciò improponibile per la maggior parte delle imprese. Con GNU questo sarà invece facile. Si darà sempre il caso che non siano disponibili persone competenti, ma questo non potrà essere imputato al sistema di distribuzione. GNU non elimina tutti i problemi del mondo, solo alcuni. Allo stesso tempo, gli utenti che non sanno nulla di computer hanno bisogno di manutenzione, cioè di cose che potrebbero fare facilmente da soli ma che non sono in grado di fare. Servizi di questo genere potrebbero essere forniti da aziende che vendono solo gestione e manutenzione. Se è vero che gli utenti sono disposti a pagare per un prodotto con servizio, allora saranno anche disposti a pagare per il servizio avendo avuto il prodotto gratuitamente. Le aziende di servizi si faranno concorrenza sul prezzo e sulla qualità; gli utenti d’altra parte non saranno legati a nessuna di esse in particolare. Nel frattempo, coloro che non avranno bisogno del servizio saranno sempre in grado di usare il programma senza pagare il servizio. «Non si può raggiungere molta gente senza pubblicità, e per finanziarla si deve far pagare il programma.» «È inutile reclamizzare un programma gratuito.» 3 Adesso esistono effettivamente molte ditte di questo tipo. 4298 Manifesto GNU Ci sono molte forme di pubblicità gratuita o a basso costo che possono essere usate per informare un gran numero di utenti di computer riguardo a cose come GNU. Ma può essere vero che la pubblicità può raggiungere molti più utenti di microcomputer. Se fosse veramente così, una ditta che reclamizzasse il servizio di copia e spedizione per posta di GNU a pagamento dovrebbe aver abbastanza successo commerciale da rientrare dai costi della pubblicità e da guadagnarci. In questo modo, pagano la pubblicità solo gli utenti che ne beneficiano. D’altro canto, se molta gente ottiene GNU da amici e queste aziende non hanno successo, vorrà dire che la pubblicità non era necessaria per diffondere GNU. Perché tutti questi difensori del libero mercato non vogliono lasciare che sia il libero mercato a decidere?4 «La mia azienda ha bisogno di un sistema operativo proprietario per essere più avanti della concorrenza.» Con GNU, i sistemi operativi non rientreranno più fra gli elementi di concorrenza. La vostra azienda non potrà essere concorrenziale in quest’area, ma egualmente non potranno esserlo i concorrenti. Vi farete concorrenza in altre aree, mentre in questa godrete di mutui benefici. Se vendete sistemi operativi non apprezzerete GNU, ma è un problema vostro. Se avete un’attività di altro tipo, GNU vi può evitare di essere spinti nel costoso campo della vendita di sistemi operativi. Mi piacerebbe che lo sviluppo di GNU fosse sostenuto da donazioni da parte di numerosi produttori ed utenti, riducendo così la spesa per tutti.5 «Ma i programmatori non meritano una ricompensa per la loro creatività?» Se qualcosa merita una ricompensa questo è il contribuire al bene sociale. La creatività può essere un contributo al bene sociale, ma solo nella misura in cui la società è libera di usarne i risultati. Se i programmatori meritano una ricompensa per la creazione di programmi innovativi, allora con la stessa logica meritano una punizione se pongono restrizioni all’uso di questi programmi. «Un programmatore non dovrebbe poter chiedere una ricompensa per la sua creatività?» Non c’è niente di male nel chiedere di esser pagati per il proprio lavoro, o mirare ad incrementare le proprie entrate, fintanto che non si utilizzino metodi che siano distruttivi. Ma i metodi comuni nel campo del software, al giorno d’oggi, sono distruttivi. Spremere denaro dagli utenti di un programma imponendo restrizioni sull’uso è distruttivo perché riduce i modi in cui il programma può essere usato. Questo diminuisce la quantità di ricchezza che l’umanità ricava dal programma. Quando c’è una scelta deliberata di porre restrizioni, le conseguenze dannose sono distruzione deliberata. La ragione per cui un buon cittadino non usa questi metodi distruttivi per diventare più ricco è che, se lo facessero tutti, diventeremmo tutti più poveri a causa delle distruzioni reciproche. Questa è etica kantiana, la Regola Aurea: poiché non mi piacciono le conseguenze che risulterebbero se tutti impedissero l’accesso alle informazioni, devo considerare sbagliato che uno lo faccia. In particolare, il desiderio di una ricompensa per la propria creatività non giustifica il privare il mondo nel suo insieme di tutta o parte di questa creatività. «Ma i programmatori non moriranno di fame?» 4 La Free Software Foundation raccoglie la maggior parte dei suoi fondi da un servizio di distribuzione, anche se è più un ente senza fini di lucro che un’azienda. Se *nessuno* sceglie di ottenere copie del software ordinandole alla FSF, questa sarà impossibilitata a proseguire la propria opera. Ma questo non vuole dire che siano giustificate restrizioni proprietarie per costringere gli utenti a pagare. Se una piccola frazione degli utenti ordina le sue copie dalla FSF, questo sarà sufficiente per tenerla a galla. Quindi chiediamo agli utenti di aiutarci in questo modo. Hai fatto la tua parte? 5 Un gruppo di imprese di software ha recentemente costituito dei finanziamenti per sostenere la manutenzione del nostro compilatore C. Manifesto GNU 4299 Potrei rispondere che nessuno è obbligato a fare il programmatore. La maggior parte di noi non è in grado di andare per strada a fare il mimo, ma ciò non vuol dire che siamo condannati a passare la vita per strada a fare i mimi, e morire di fame. Facciamo un altro lavoro. Ma è la risposta sbagliata, perché accetta l’assunzione implicita di chi pone la domanda, e cioè che senza proprietà del software non è possibile pagare ai programmatori il becco di un quattrino. Un’assunzione del tipo tutto o niente. La vera ragione per cui i programmatori non moriranno di fame è che sarà per loro egualmente possibile essere pagati per programmare, solo non pagati così tanto come ora. Porre restrizioni sulle copie non è l’unico modello di affari nel campo del software. È il modello più comune perché è il più redditizio. Se fosse vietato, o rifiutato dagli utenti, l’industria del software si sposterebbe su altri modelli organizzativi, adottandone altri ora meno comuni. Ci sono sempre numerosi modi per organizzare un qualunque tipo di affari. Probabilmente programmare nel nuovo modello organizzativo non sarà più così redditizio come lo è ora. Ma questo non è un argomento contro il cambiamento. Che gli addetti alle vendite ricevano i salari che ora ricevono non è considerata un’ingiustizia. Se i programmatori avessero gli stessi stipendi (in pratica guadagnerebbero molto di più), non sarebbe nemmeno quella un’ingiustizia. «Ma le persone non hanno diritto di controllare come la loro creatività viene usata?» Il "controllo sull’uso delle proprie idee" in realtà costituisce un controllo sulle vite degli altri; e di solito viene usato per rendere più difficili le loro vite. Le persone che hanno studiato con cura i vari aspetti del diritto alla proprietà intellettuale (come gli avvocati) dicono che non c’è alcun diritto intrinseco alla proprietà intellettuale. I tipi dei supposti diritti alla proprietà intellettuale riconosciuti dal governo furono creati da specifici atti legislativi per scopi specifici. Per esempio la legislazione sui brevetti fu introdotta per incoraggiare gli inventori a rivelare i dettagli delle loro invenzioni. Lo scopo era avvantaggiare la società più che avvantaggiare gli inventori. A quel tempo la validità di 17 anni per un brevetto era breve se confrontata con la velocità di avanzamento dello stato dell’arte. Poiché i brevetti riguardano solo i produttori, per i quali il costo e lo sforzo degli accordi di licenza sono piccoli in confronto all’organizzazione della produzione, spesso i brevetti non costituiscono un gran danno. E non ostacolano la gran parte degli individui che usano prodotti coperti da brevetto. L’idea del copyright non esisteva in tempi antichi, quando gli autori copiavano estesamente altri autori in opere non narrative. Questa pratica era utile, ed è il solo modo attraverso cui almeno parte del lavoro di alcuni autori è sopravvissuto. La legislazione sul copyright fu creata espressamente per incoraggiare l’originalità. Nel campo per cui fu inventata, cioè i libri, che potevano essere copiati a basso costo solo con apparecchiature tipografiche, non fece molto danno e non pose ostacoli alla maggior parte dei lettori. Tutti i diritti di proprietà intellettuale sono solo licenze concesse dalla società perché si riteneva, correttamente o meno, che concederle avrebbe giovato alla società nel suo complesso. Ma data una situazione particolare dobbiamo chiederci: facciamo realmente bene a concedere queste licenze? Che atti permettiamo di compiere con esse? Il caso dei programmi ai giorni nostri differisce enormemente da quello dei libri un secolo fa. Il fatto che la via più facile per passare una copia di un programma sia da persona a persona, che il programma abbia un codice sorgente ed un codice oggetto che sono cose distinte, ed infine il fatto che un programma venga usato più che letto e gustato, combinandosi creano una situazione in cui qualcuno che impone un copyright minaccia la società nel suo insieme, sia materialmente che 4300 Manifesto GNU spiritualmente, una situazione in cui quel qualcuno non dovrebbe farlo, che la legge lo permetta o no. «La competizione fa sì che le cose siano fatte meglio.» Il paradigma della competizione è la gara: premiando il vincitore incoraggia ognuno a correre più veloce. Quando veramente il capitalismo funziona in questo modo, fa un buon lavoro; ma chi lo difende ha torto nell’asserire che agisce sempre così. Se i corridori dimenticano il motivo per cui è offerto il premio e si concentrano solo sul vincere non curandosi di come, possono trovare altre strategie, come ad esempio attaccare gli altri concorrenti. Se i corridori si azzuffano, arrivano tutti in ritardo al traguardo. Il software proprietario e segreto è l’equivalente morale dei corridori che si azzuffano. Triste a dirsi, l’unico arbitro che abbiamo pare non muovere alcuna obiezione alle zuffe, al più le regolamenta ("ogni dieci metri puoi tirare un pugno"). Dovrebbe invece dividerli e penalizzarli anche se solo provassero a combattere. «Ma senza un incentivo economico non smetterebbero tutti di programmare?» In realtà molta gente programmerebbe senza alcun incentivo economico. Programmare ha un fascino irresistibile per alcune persone, solitamente per quelli che ci riescono meglio. Non mancano certo i musicisti professionisti che insistono pur non avendo speranza di guadagnarsi da vivere suonando. Ma in realtà questa domanda, benché posta spesso, non è appropriata. La paga per i programmatori non sparirà, semplicemente diminuirà. Quindi la domanda corretta è: «qualcuno si metterà mai a programmare per un minore incentivo economico?». La mia esperienza dice che sì, ci si metterà. Per più di dieci anni molti tra i migliori programmatori del mondo hanno lavorato nel laboratorio di Intelligenza Artificiale per molti meno soldi di quanti ne avrebbero potuti ricevere in ogni altro posto. Hanno avuto soddisfazioni non economiche di moltissimi tipi, ad esempio fama e riconoscenza. E la creatività è anche divertente, un premio di per sé. Poi molti se ne sono andati quando hanno avuto la possibilità di fare lo stesso interessante lavoro per un mucchio di soldi. Ciò che i fatti mostrano è che la gente programma per altre ragioni che non siano il denaro; ma se viene data la possibilità di fare la stessa cosa per un mucchio di soldi, allora cominceranno ad aspettarseli e a richiederli. Le organizzazioni che pagano poco sono svantaggiate in confronto a quelle che pagano molto, ma non sarebbero necessariamente in questa posizione se quelle che pagano molto fossero bandite. «Abbiamo un disperato bisogno dei programmatori. Se ci chiedono di smettere di aiutare i nostri vicini dobbiamo obbedire.» Non si è mai così disperati da dover obbedire a questo genere di pretese. Ricorda: milioni in difesa, ma non un centesimo in tributi [N.d.T.: è una famosa frase di George Washington]. «I programmatori devono guadagnarsi da vivere in qualche modo.» A breve termine è vero. Ma ci sono un’infinità di modi in cui i programmatori possono guadagnarsi da vivere senza vendere i diritti d’uso dei programmi. Questo metodo è comune ai giorni nostri perché porta la maggior quantità di denaro a programmatori e aziende, non perché sia l’unica strada per guadagnarsi da vivere. È facile trovarne altre se se ne vogliono trovare. Ecco una serie di esempi. Un produttore che immette sul mercato un nuovo computer pagherà per il porting dei sistemi operativi sul nuovo hardware. Manifesto GNU 4301 I servizi a pagamento di insegnamento, gestione e manutenzione possono impiegare dei programmatori. Persone con idee nuove possono distribuire i programmi gratuitamente, chiedendo donazioni agli utenti soddisfatti, o vendendo servizi di gestione. Ho incontrato persone che già lavorano con successo in questo modo. Utenti con necessità simili possono formare gruppi e pagare. Un gruppo potrebbe stipulare un contratto con un’impresa di programmazione per scrivere i programmi che i membri del gruppo vorrebbero usare. Tutti i tipi di sviluppo possono essere finanziati da una Tassa per il Software: Supponiamo che chiunque compri un computer debba pagare un x per cento del costo del computer come tassa per il software. Il governo girerebbe questi fondi ad un’agenzia come la NSF [N.d.T.: più o meno l’equivalente del nostro CNR] per impiegarli nello sviluppo del software. Ma se l’acquirente fa lui stesso una donazione per lo sviluppo del software, potrebbe ottenere un credito nei confronti di queste tasse. Potrebbe fare una donazione ad un progetto di sua scelta -- tipicamente scelto perché spera di usarne i risultati quando questo verrà completato. Potrebbe ottenere un credito per ogni donazione fatta, fino al valore totale della tassa che dovrebbe pagare. Il gettito complessivo di questa tassa potrebbe essere deciso dal voto di chi la paga, pesato secondo l’ammontare pagato. Le conseguenze: • La comunità degli utenti di computer sosterrebbe lo sviluppo del software. • La comunità sceglierebbe il livello di sostegno necessario. • Gli utenti che fossero interessati a sapere su che progetto vengano spesi i loro soldi avrebbero la possibilità di gestire personalmente la cosa. Nel lungo periodo, rendere liberi i programmi è un passo verso l’epoca della fine del bisogno, quando nessuno sarà obbligato a lavorare molto duramente solo per guadagnarsi di che vivere. La gente sarà libera di dedicarsi ad attività divertenti, come programmare, dopo aver passato le dieci ore settimanali necessarie in compiti come legiferare, fare consulenza familiare, riparare i robot e prevedere il moto degli asteroidi. Non ci sarà bisogno di guadagnarsi da vivere con la programmazione. Abbiamo già ridotto moltissimo la quantità di lavoro che la società nel suo complesso deve fare per ottenere la sua produttività attuale, ma poco di questo si è tradotto in benessere per i lavoratori perché è necessario accompagnare l’attività produttiva con molta attività non produttiva. Le cause principali sono la burocrazia e gli sforzi a tutto campo contro la concorrenza. Il software libero ridurrà di molto questo drenaggio di risorse nell’area della produzione del software. Dobbiamo farlo affinché i guadagni tecnici in produttività si traducano in meno lavoro per noi. Capitolo 376 Il progetto GNU non modificabile Testo originale: <http://www.fsf.org/gnu/the-gnu-project.html> Traduzione originale: <http://www.fsf.org/gnu/thegnuproject.it.html> Copyright © 1998 Richard Stallman La copia letterale e la distribuzione di questo articolo nella sua integrità sono permesse con ogni mezzo, a patto che questa nota sia riprodotta. 1 376.1 La prima comunità di condivisione del software Quando cominciai a lavorare nel laboratorio di Intelligenza Artificiale del MIT [N.d.T. Massachusset Institute of Technology] nel 1971, entrai a far parte di una comunità in cui ci si scambiavano i programmi, che esisteva già da molti anni. La condivisione del software non si limitava alla nostra comunità; è un cosa vecchia quanto i computer, proprio come condividere le ricette è antico come il cucinare. Ma noi lo facevamo più di quasi chiunque altro. Il laboratorio di Intelligenza Artificiale usava un sistema operativo a partizione di tempo (timesharing) chiamato ITS (Incompatible Timesharing System) che il gruppo di hacker2 del laboratorio aveva progettato e scritto in linguaggio assembler per il Digital PDP-10, uno dei grossi elaboratori di quel periodo. Come membro di questa comunità, hacker di sistema nel gruppo laboratorio, il mio compito era migliorare questo sistema. Non chiamavamo il nostro software "software libero", poiché questa espressione ancora non esisteva, ma si trattava proprio di questo. Quando persone di altre università o di qualche società volevano convertire il nostro programma per il proprio sistema ed utilizzarlo, erano le benvenute. Se si vedeva qualcuno usare un programma sconosciuto ed interessante, si poteva sempre chiedere di vederne il codice sorgente, in modo da poterlo leggere, modificare, o prenderne (cannibalizzarne) alcune parti per creare un nuovo programma. 376.2 La comunità si dissolve La situazione cambiò drasticamente all’inizio degli anni ’80 quando la Digital smise di produrre la serie PDP-10. La sua architettura, elegante e potente negli anni ’60, non poteva essere estesa in modo naturale ai più grandi spazi di indirizzamento che si stavano rendendo possibili negli anni ’80. Questo significò che quasi tutti i programmi che formavano ITS divennero obsoleti. La comunità di hacker del laboratorio di Intelligenza Artificiale si era già dissolta non molto tempo prima. Nel 1981 la Symbolics, nata da una costola del laboratorio stesso, gli aveva sottratto quasi tutti gli hacker; l’ormai esiguo gruppo rimasto fu dunque incapace di sostenersi (il libro "Hackers" di Steve Levy narra questi eventi, oltre a fornire una fedele ricostruzione di questa 1 [NdR: il testo che appare qui è stato ritoccato leggermente per correggere alcuni errori evidenti.] L’uso del termine "hacker" nel senso di "pirata" è una confusione di termini creata dai mezzi di informazione. Noi hacker ci rifiutiamo di riconoscere questo significato, e continuiamo ad utilizzare la parola nel senso di "uno che ami programmare, e a cui piaccia essere bravo a farlo". 2 4302 Il progetto GNU 4303 comunità ai suoi inizi). Quando il laboratorio di Intelligenza Artificiale nel 1982 acquistò un nuovo PDP-10, i sistemisti decisero di utilizzare il sistema timesharing non libero della Digital piuttosto che ITS. I moderni elaboratori di quell’epoca, come il VAX o il 68020, avevano il proprio sistema operativo, ma nessuno di questi era libero: si doveva firmare un accordo di non-diffusione persino per ottenerne una copia eseguibile. Questo significava che il primo passo per usare un computer era promettere di negare aiuto al proprio vicino. Una comunità cooperante era vietata. La regola creata dai proprietari di software proprietario era: «se condividi il software col tuo vicino sei un pirata. Se vuoi modifiche, pregaci di farle». L’idea che la concezione sociale di software proprietario -- cioè il sistema che impone che il software non possa essere condiviso o modificato -- sia antisociale, contraria all’etica, semplicemente sbagliata, può apparire sorprendente a qualche lettore. Ma che altro possiamo dire di un sistema che si basa sul dividere utenti e lasciarli senza aiuto? Quei lettori che trovano sorprendente l’idea possono aver data per scontata la concezione sociale di software proprietario, o averla giudicata utilizzando lo stesso metro suggerito dal mercato del software proprietario. I produttori di software hanno lavorato a lungo e attivamente per diffondere la convinzione che c’è un solo modo di vedere la cosa. Quando i produttori di software parlano di "difendere" i propri "diritti" o di "fermare la pirateria", quello che dicono è in realtà secondario. Il vero messaggio in quelle affermazioni sta nelle assunzioni inespresse, che essi danno per scontate; vogliono che siano accettate acriticamente. Esaminiamole, dunque. Una prima assunzione è che le aziende produttrici di software abbiano il diritto naturale indiscutibile di proprietà sul software, e di conseguenza, abbiano controllo su tutti i suoi utenti. Se questo fosse un diritto naturale, non potremmo sollevare obiezioni, indipendentemente dal danno che possa recare ad altri. È interessante notare che, negli Stati Uniti, sia la costituzione che la giurisprudenza rifiutano questa posizione: il diritto d’autore non è un diritto naturale, ma un monopolio imposto dal governo che limita il diritto naturale degli utenti ad effettuare delle copie. Un’altra assunzione inespressa è che la sola cosa importante del software sia il lavoro che consente di fare -- vale a dire che noi utenti non dobbiamo preoccuparci del tipo di società in cui ci è permesso vivere. Una terza assunzione è che non avremmo software utilizzabile (o meglio, che non potremmo mai avere un programma per fare questo o quell’altro particolare lavoro) se non riconoscessimo ai produttori il controllo sugli utenti di quei programmi. Questa assunzione avrebbe potuto sembrare plausibile, prima che il movimento del software libero dimostrasse che possiamo scrivere quantità di programmi utili senza bisogno di metterci dei catenacci. Se rifiutiamo di accettare queste assunzioni, giudicando queste questioni con comuni criteri di moralità e di buon senso dopo aver messo al primo posto gli interessi degli utenti, tenendo conto che gli utenti vengono prima di tutto, arriviamo a conclusioni del tutto differenti. Chi usa un calcolatore dovrebbe essere libero di modificare i programmi per adattarli alle proprie necessità, ed essere libero di condividere il software, poiché aiutare gli altri è alla base della società. Non c’è modo in questa sede di trattare approfonditamente i ragionamenti che portano a questa conclusione; il lettore interessato può cercare le informazioni in rete a questo indirizzo: <http:// www.gnu.org/philosophy/why-free.html>. Il progetto GNU 4304 376.3 Una difficile scelta morale Una volta che il mio gruppo si fu sciolto, continuare come prima fu impossible. Mi trovai di fronte ad una difficile scelta morale. La scelta facile sarebbe stata quella di unirsi al mondo del software proprietario, firmando accordi di non-diffusione e promettendo di non aiutare i miei compagni hacker. Con ogni probabilità avrei anche sviluppato software che sarebbe stato distribuito secondo accordi di non-diffusione, contribuendo così alla pressione su altri perché a loro volta tradissero i propri compagni. In questo modo avrei potuto guadagnare, e forse mi sarei divertito a programmare. Ma sapevo che al termine della mia carriera mi sarei voltato a guardare indietro, avrei visto anni spesi a costruire muri per dividere le persone, e avrei compreso di aver contribuito a rendere il mondo peggiore. Avevo già sperimentato cosa significasse un accordo di non diffusione per chi lo firmava, quando qualcuno rifiutò a me e al laboratorio AI del MIT il codice sorgente del programma di controllo della nostra stampante; l’assenza di alcune funzionalità nel programma rendeva oltremodo frustrante l’uso della stampante. Per cui non mi potevo dire che gli accordi di non-diffusione fossero innocenti. Ero molto arrabbiato quando quella persona si rifiutò di condividere il programma con noi; non potevo far finta di niente e fare lo stesso con tutti gli altri. Un’altra possibile scelta, semplice ma spiacevole, sarebbe stata quella di abbandonare l’informatica. In tal modo le mie capacità non sarebbero state mal utilizzate, tuttavia sarebbero state sprecate. Non sarei mai stato colpevole di dividere o imporre restrizioni agli utenti di calcolatori, ma queste cose sarebbero comunque successe. Allora cercai un modo in cui un programmatore potesse fare qualcosa di buono. Mi chiesi dunque: c’erano un programma o dei programmi che io potessi scrivere, per rendere nuovamente possibile l’esistenza di una comunità? La risposta era semplice: innanzitutto serviva un sistema operativo. Questo è difatti il software fondamentale per iniziare ad usare un computer. Con un sistema operativo si possono fare molte cose; senza, non è proprio possibile far funzionare il computer. Con un sistema operativo libero, avremmo potuto avere nuovamente una comunità in cui hacker possono cooperare, e invitare chiunque ad unirsi al gruppo. E chiunque sarebbe stato in grado di usare un calcolatore, senza dover cospirare fin dall’inizio per sottrarre qualcosa ai propri amici. Essendo un programmatore di sistemi, possedevo le competenze adeguate per questo lavoro. Così, anche se non davo il successo per scontato, mi resi conto di essere la persona giusta per farlo. Scelsi di rendere il sistema compatibile con Unix, in modo che fosse portabile, e che gli utenti Unix potessero passare facilmente ad esso. Il nome GNU fu scelto secondo una tradizione hacker, come acronimo ricorsivo che significa "GNU’s Not Unix" [N.d.T. GNU non è Unix]. Un sistema operativo non si limita solo al suo nucleo, che è proprio il minimo per eseguire altri programmi. Negli anni ’70, qualsiasi sistema operativo degno di questo nome includeva interpreti di comandi, assemblatori, compilatori, interpreti di linguaggi, debugger, editor di testo, programmi per la posta e molto altro. ITS li aveva, Multics li aveva, VMS li aveva e Unix li aveva. Anche il sistema operativo GNU li avrebbe avuti. Tempo dopo venni a conoscenza di questa massima, attribuita a Hillel: 3 Se non sono per me stesso, chi sarà per me? 3 Essendo ateo, non seguo alcuna guida religiosa, ma a volte mi trovo ad ammirare qualcosa che qualcuno di loro ha detto. Il progetto GNU 4305 E se sono solo per me stesso, che cosa sono? E se non ora, quando? La decisione di iniziare il progetto GNU si basò su uno spirito simile. 376.4 "Free" come libero Il termine "free software" [N.d.T. il termine free in inglese significa sia gratuito che libero] a volte è mal interpretato: non ha niente a che vedere col prezzo del software; si tratta di libertà. Ecco, dunque, la definizione di software libero: un programma è software libero per un dato utente se: • l’utente ha la libertà di eseguire il programma per qualsiasi scopo; • l’utente ha la libertà di modificare il programma secondo i propri bisogni (perché questa libertà abbia qualche effetto in pratica, è necessario avere accesso al codice sorgente del programma, poiché apportare modifiche ad un programma senza disporre del codice sorgente è estremamente difficile); • l’utente ha la libertà di distribuire copie del programma, gratuitamente o dietro compenso; • l’utente ha la libertà di distribuire versioni modificate del programma, così che la comunità possa fruire dei miglioramenti apportati. Poiché "free" si riferisce alla libertà e non al prezzo, vendere copie di un programma non contraddice il concetto di software libero. In effetti, la libertà di vendere copie di programmi è essenziale: raccolte di software libero vendute su CD-ROM sono importanti per la comunità, e la loro vendita è un modo di raccogliere fondi importante per lo sviluppo del software libero. Di conseguenza, un programma che non può essere liberamente incluso in tali raccolte non è software libero. A causa dell’ambiguità del termine "free", si è cercata a lungo un’alternativa, ma nessuno ne ha trovata una valida. La lingua inglese ha più termini e sfumature di ogni altra, ma non ha una parola semplice e non ambigua che significhi libero; "unfettered" è la parola più vicina come significato [NdT: unfettered è una parola di tono aulico o arcaico che significa libero da ceppi, vincoli o inibizioni]. Alternative come "liberated", "freedom" e "open" hanno altri significati o non sono adatte per altri motivi [NdT: rispettivamente, liberato, libertà, aperto]. 376.5 Software GNU e il sistema GNU Sviluppare un intero sistema è un progetto considerevole. Per raggiungere l’obiettivo decisi di adattare e usare parti di software libero tutte le volte che fosse possibile. Per esempio, decisi fin dall’inizio di usare TeX come il principale programma di formattazione di testo; qualche anno più tardi, decisi di usare l’X Window System piuttosto che scrivere un altro sistema a finestre per GNU. A causa di questa decisione, il sistema GNU e la raccolta di tutto il software GNU non sono la stessa cosa. Il sistema GNU comprende programmi che non sono GNU, sviluppati da altre persone o gruppi di progetto per i propri scopi, ma che possiamo usare in quanto software libero. 4306 Il progetto GNU 376.6 L’inizio del progetto Nel gennaio 1984 lasciai il mio posto al MIT e cominciai a scrivere software GNU. Dovetti lasciare il MIT, per evitare che potesse interferire con la distribuzione di GNU come software libero. Se fossi rimasto, il MIT avrebbe potuto rivendicare la proprietà del lavoro, ed avrebbe potuto imporre i propri termini di distribuzione, o anche farne un pacchetto proprietario. Non avevo alcuna intenzione di fare tanto lavoro solo per vederlo reso inutilizzabile per il suo scopo originario: creare una nuova comunità di condivisione di software. Ad ogni buon conto, il professor Winston -- allora responsabile del laboratorio AI del MIT -- mi propose gentilmente di continuare ad utilizzare le attrezzature del laboratorio stesso. 376.7 I primi passi Poco dopo aver iniziato il progetto GNU, venni a sapere del Free University Compiler Kit, noto anche come VUCK (la parola olandese che sta per "free" inizia con la V). Era un compilatore progettato per trattare più linguaggi, fra cui C e Pascal, e per generare codice binario per diverse architetture. Scrissi al suo autore chiedendo se GNU avesse potuto usarlo. Rispose in modo canzonatorio, dicendo che l’università era sì libera, ma non il compilatore. Decisi allora che il mio primo programma per il progetto GNU sarebbe stato un compilatore multilinguaggio e multipiattaforma. Sperando di evitare di dover scrivere da me l’intero compilatore, ottenni il codice sorgente del Pastel, un compilatore multipiattaforma sviluppato ai Laboratori Lawrence Livermore. Il linguaggio supportato da Pastel, in cui il Pastel stesso era scritto, era una versione estesa del Pascal, pensata come linguaggio di programmazione di sistemi. Io vi aggiunsi un frontend per il C, e cominciai il porting per il processore Motorola 68000, ma fui costretto a rinunciare quando scoprii che il compilatore richiedeva diversi megabyte di memoria sullo stack, mentre il sistema Unix disponibile per il processore 68000 ne permetteva solo 64K. Mi resi conto allora che il compilatore Pastel interpretava tutto il file di ingresso creandone un albero sintattico, convertiva questo in una catena di "istruzioni", e quindi generava l’intero file di uscita senza mai liberare memoria. A questo punto, conclusi che avei dovuto scrivere un nuovo compilatore da zero. Quel nuovo compilatore è ora noto come Gcc; non utilizza niente del compilatore Pastel, ma riuscii ad adattare e riutilizzare il frontend per il C che avevo scritto. Questo però avvenne qualche anno dopo; prima, lavorai su GNU Emacs. 376.8 GNU Emacs Cominciai a lavorare su GNU Emacs nel settembre 1984, e all’inizio del 1985 cominciava ad essere utilizzabile. Così potei iniziare ad usare sistemi Unix per scrivere; fino ad allora, avevo scritto sempre su altri tipi di macchine, non avendo nessun interesse ad imparare vi né ed. A questo punto alcuni cominciarono a voler usare GNU Emacs, il che pose il problema di come distribuirlo. Naturalmente lo misi sul server ftp anonimo del computer che usavo al MIT (questo computer, prep.ai.mit.edu, divenne così il sito ftp primario di distribuzione di GNU; quando alcuni anni dopo andò fuori servizio, trasferimmo il nome sul nostro nuovo ftp server). Ma allora molte delle persone interessate non erano su Internet e non potevano ottenere una copia via ftp, così mi si pose il problema di cosa dir loro. Avrei potuto dire: «trova un amico che è in rete disposto a farti una copia». Oppure avrei potuto fare quel che feci con l’originario Emacs su PDP-10, e cioè dir loro: «spediscimi una busta affrancata ed un nastro, ed io te lo rispedisco con sopra Emacs». Ma ero senza lavoro, e cercavo un modo di far soldi con il software libero. E così feci sapere che avrei spedito un nastro a chi lo Il progetto GNU 4307 voleva per 150 dollari. In questo modo, creai un’impresa di distribuzione di software libero, che anticipava le compagnie che oggi distribuiscono interi sistemi GNU basati su Linux. 376.9 Un programma è libero per tutti? Se un programma è software libero quando esce dalle mani del suo autore, non significa necessariamente che sarà software libero per chiunque ne abbia una copia. Per esempio, il software di pubblico dominio (software senza copyright) è software libero, ma chiunque può farne una versione modificata proprietaria. Analogamente, molti programmi liberi sono protetti da diritto d’autore, ma vengono distribuiti con semplici licenze permissive che permettono di farne versioni modificate proprietarie. L’esempio emblematico della questione è l’X Window System. Sviluppato al MIT, e pubblicato come software libero con una licenza permissiva, fu rapidamente adottato da diverse società informatiche. Queste aggiunsero X ai loro sistemi Unix proprietari, solo in forma binaria, e coperto dello stesso accordo di non-diffusione. Queste copie di X non erano software più libero di quanto lo fosse Unix. Gli autori dell’X Window System non ritenevano che questo fosse un problema, anzi se lo aspettavano ed era loro intenzione che accadesse. Il loro scopo non era la libertà, ma semplicemente il "successo", definito come "avere tanti utenti". Non erano interessati che questi utenti fossero liberi, ma solo che fossero numerosi. Questo sfociò in una situazione paradossale, in cui due modi diversi di misurare la quantità di libertà risultavano in risposte diverse alla domanda «questo programma è libero»? Giudicando sulla base della libertà offerta dai termini distributivi usati dal MIT, si sarebbe dovuto dire che X era software libero. Ma misurando la libertà dell’utente medio di X, si sarebbe dovuto dire che X era software proprietario. La maggior parte degli utenti di X usavano le versioni proprietarie fornite con i sistemi Unix, non la versione libera. 376.10 Il permesso d’autore (copyleft) e la GNU GPL Lo scopo di GNU consisteva nell’offrire libertà agli utenti, non solo nell’ottenere ampia diffusione. Avevamo quindi bisogno di termini di distribuzione che evitassero che il software GNU fosse trasformato in software proprietario. Il metodo che usammo si chiama "permesso d’autore". 4 Il permesso d’autore (copyleft)5 usa le leggi sul diritto d’autore (copyright), ma le capovolge per ottenere lo scopo opposto: invece che un metodo per privatizzare il software, diventa infatti un mezzo per mantenerlo libero. Il succo dell’idea di permesso d’autore consiste nel dare a chiunque il permesso di eseguire il programma, copiare il programma, modificare il programma, e distribuirne versioni modificate, ma senza dare il permesso di aggiungere restrizioni. In tal modo, le libertà essenziali che definiscono il "free software" (software libero) sono garantite a chiunque ne abbia una copia, e diventano diritti inalienabili. Perché un permesso d’autore sia efficace, anche le versioni modificate devono essere libere. Ciò assicura che ogni lavoro basato sul nostro sia reso disponibile per la nostra comunità, se pubblicato. Quando dei programmatori professionisti lavorano su software GNU come volontari, è 4 Nel 1984 o 1985, Don Hopkins, persona molto creativa, mi mandò una lettera. Sulla busta aveva scritto diverse frasi argute, fra cui questa: "Permesso d’autore--tutti i diritti rovesciati". Utilizzai l’espressione "permesso d’autore" per battezzare il concetto di distribuzione che allora andavo elaborando. 5 [NdT: si tratta di un gioco di parole, che qui viene reso con "permesso di autore": copyright (diritto di autore) è formato dalle parola "copy" (copia) e "right" (diritto, ma anche destra), opposto di "left" (sinistra, ma anche lasciato).] 4308 Il progetto GNU il permesso d’autore che impedisce ai loro datori di lavoro di dire: «non puoi distribuire quei cambiamenti, perché abbiamo intenzione di usarli per creare la nostra versione proprietaria del programma». La clausola che i cambiamenti debbano essere liberi è essenziale se vogliamo garantire libertà a tutti gli utenti del programma. Le aziende che privatizzarono l’X Window System di solito avevano apportato qualche modifica per per portare il programma sui loro sistemi e sulle loro macchine. Si trattava di modifiche piccole rispetto alla mole di X, ma non banali. Se apportare modifiche fosse una scusa per negare libertà agli utenti, sarebbe facile per chiunque approfittare di questa scusa. Una problematica correlata è quella della combinazione di un programma libero con codice non libero. Una tale combinazione sarebbe inevitabilmente non libera; ogni libertà che manchi dalla parte non libera mancherebbe anche dall’intero programma. Permettere tali combinazioni aprirebbe non uno spiraglio, ma un buco grosso come una casa. Quindi un requisito essenziale per il permesso d’autore è tappare il buco: tutto ciò che venga aggiunto o combinato con un programma protetto da permesso d’autore dev’essere tale che il programma risultante sia anch’esso libero e protetto da permesso d’autore. La specifica implementazione di permesso d’autore che utilizziamo per la maggior parte del software GNU è la GNU General Public License (licenza pubblica generica GNU), abbreviata in GNU GPL. Abbiamo altri tipi di permesso d’autore che sono utilizzati in circostanze specifiche. I manuali GNU sono anch’essi protetti da permesso d’autore, ma ne usano una versione molto più semplice, perché per i manuali non è necessaria la complessità della GPL. 376.11 La Free Software Foundation Man mano che l’interesse per Emacs aumentava, altre persone parteciparono al progetto GNU, e decidemmo che era di nuovo ora di cercare finanziamenti. Così nel 1985 fondammo la Free Software Foundation (Fondazione per il software libero), una organizzazione senza fini di lucro per lo sviluppo di software libero. La FSF fra l’altro si prese carico della distribuzione dei nastri di Emacs; più tardi estese l’attività aggiungendo sul nastro altro software libero (sia GNU che non GNU) e vendendo manuali liberi. La FSF accetta donazioni, ma gran parte delle sue entrate è sempre stata costituita dalle vendite: copie di software libero e servizi correlati. Oggi vende CD-ROM di codice sorgente, CD-ROM di programmi compilati, manuali stampati professionalmente (tutti con libertà di ridistribuzione e modifica), e distribuzioni Deluxe (nelle quali compiliamo l’intera scelta di software per una piattaforma a richiesta). I dipendenti della Free Software Foundation hanno scritto e curato la manutenzione di diversi pacchetti GNU. Fra questi spiccano la libreria C e la shell. La libreria C di GNU è utilizzata da ogni programma che gira su sistemi GNU/Linux per comunicare con Linux. È stata sviluppata da un membro della squadra della Free Software Foundation, Roland McGrath. La shell usata sulla maggior parte dei sistemi GNU/Linux è Bash, la Bourne Again Shell6 , che è stata sviluppata da Brian Fox, dipendente della FSF. Finanziammo lo sviluppo di questi programmi perché il progetto GNU non riguardava solo strumenti di lavoro o un ambiente di sviluppo: il nostro obiettivo era un sistema operativo completo, e questi programmi erano necessari per raggiungere quell’obiettivo. 6 "Bourne Again Shell" è un gioco di parole sul nome "Bourne Shell", che era la normale shell di Unix [NdT: "Bourne again" richiama l’espressione cristiana "born again", "rinato" (in Cristo)]. Il progetto GNU 4309 376.12 Il supporto per il software libero La filosofia del software libero rigetta una diffusa pratica commerciale in particolare, ma non è contro il commercio. Quando un’impresa rispetta la libertà dell’utente, c’è da augurarle ogni successo. La vendita di copie di Emacs esemplifica un modo di condurre affari col software libero. Quando la FSF prese in carico quest’attività, dovetti trovare un’altra fonte di sostentamento. La trovai nella vendita di servizi relativi al software libero che avevo sviluppato, come insegnare argomenti quali programmazione di Emacs e personalizzazione di GCC, oppure sviluppare software, soprattutto adattamento di GCC a nuove architetture. Oggi tutte queste attività collegate al software libero sono esercitate da svariate aziende. Alcune distribuiscono raccolte di software libero su CD-ROM, altre offrono consulenza a diversi livelli, dall’aiutare gli utenti in difficoltà, alla correzione di errori, all’aggiunta di funzionalità non banali. Si cominciano anche a vedere aziende di software che si fondano sul lancio di nuovi programmi liberi. Attenzione, però: diverse aziende che si fregiano del marchio "open source" (software aperto) in realtà fondano le loro attività su software non libero che funziona insieme con software libero. Queste non sono aziende di software libero, sono aziende di software proprietario i cui prodotti attirano gli utenti lontano dalla libertà. Loro li chiamano "a valore aggiunto", il che riflette i valori che a loro farebbe comodo che adottassimo: la convenienza prima della libertà. Se noi riteniamo che la libertà abbia più valore, li dovremmo chiamare prodotti "a libertà sottratta". 376.13 Obiettivi tecnici L’obiettivo principale di GNU era essere software libero. Anche se GNU non avesse avuto alcun vantaggio tecnico su Unix, avrebbe avuto sia un vantaggio sociale, permettendo agli utenti di cooperare, sia un vantaggio etico, rispettando la loro libertà. Tuttavia risultò naturale applicare al lavoro le regole classiche di buona programmazione; per esempio, allocare le strutture dati dinamicamente per evitare limitazioni arbitrarie sulla dimensione dei dati, o gestire tutti i possibili codici a 8 bit in tutti i casi ragionevoli. Inoltre, al contrario di Unix che era pensato per piccole dimensioni di memoria, decidemmo di non supportare le macchine a 16 bit (era chiaro che le macchine a 32 bit sarebbero state la norma quando il sistema GNU sarebbe stato completo), e di non preoccuparci di ridurre l’occupazione di memoria a meno che eccedesse il megabyte. In programmi per i quali non era essenziale la gestione di file molto grandi, spingemmo i programmatori a leggere in memoria l’intero file di ingresso per poi analizzare il file senza doversi preoccupare delle operazioni di I/O. Queste decisioni fecero sì che molti programmi GNU superassero i loro equivalenti Unix sia in affidabilità che in velocità di esecuzione. 376.14 Donazioni di computer Man mano che la reputazione del progetto GNU andava crescendo, alcune persone iniziarono a donare macchine su cui girava Unix. Queste macchine erano molto utili, perché il modo più semplice di sviluppare componenti per GNU era di farlo su di un sistema Unix così da sostituire pezzo per pezzo i componenti di quel sistema. Ma queste macchine sollevavano anche una questione etica: se fosse giusto per noi anche solo possedere una copia di Unix. Unix era (ed è) software proprietario, e la filosofia del progetto GNU diceva che non avremmo dovuto usare software proprietario. Ma, applicando lo stesso ragionamento per cui la violenza 4310 Il progetto GNU è ammessa per autodifesa, conclusi che fosse legittimo usare un pacchetto proprietario, se ciò fosse stato importante nel crearne un sostituto libero che permettesse ad altri di smettere di usare quello proprietario. Tuttavia, benchè fosse un male giustificabile, era pur sempre un male. Oggi non abbiamo più alcuna copia di Unix, perché le abbiamo sostituite con sistemi operativi liberi. Quando non fu possibile sostituire il sistema operativo di una macchina con uno libero, sostituimmo la macchina. 376.15 L’elenco dei compiti GNU Mentre il progetto GNU avanzava, ed un numero sempre maggiore di componenti di sistema venivano trovati o sviluppati, diventò utile stilare un elenco delle parti ancora mancanti. Usammo questo elenco per ingaggiare programmatori che scrivessero tali parti, e l’elenco prese il nome di elenco dei compiti GNU. In aggiunta ai componenti Unix mancanti inserimmo nell’elenco svariati progetti utili di programmazione o di documentazione che a nostro parere non dovrebbero mancare in un sistema operativo veramente completo. Oggi non compare quasi nessun componente Unix nell’elenco dei compiti GNU; tutti questi lavori, a parte qualcuno non essenziale, sono già stati svolti. D’altro canto l’elenco è pieno di quei progetti che qualcuno chiamerebbe "applicazioni": ogni programma che interessi ad una fetta non trascurabile di utenti sarebbe un’utile aggiunta ad un sistema operativo. L’elenco comprende anche dei giochi, e così è stato fin dall’inizio: Unix comprendeva dei giochi, perciò era naturale che così fosse anche per GNU. Ma poiché non c’erano esigenze di compatibilità per i giochi, non ci attenemmo alla scelta di giochi presenti in Unix, preferendo piuttosto fornire un elenco di diversi tipi di giochi potenzialmente graditi agli utenti. 376.16 La licenza GNU per le librerie La libreria C del sistema GNU utilizza un tipo speciale di permesso d’autore, la "Licenza Pubblica GNU per le Librerie"7 , che permette l’uso della libreria da parte di software proprietario. Perché quest’eccezione? Non si tratta di questioni di principio: non c’è nessun principio che dica che i prodotti software proprietari abbiano il diritto di includere il nostro codice (perché contribuire ad un progetto fondato sul rifiuto di condividere con noi?). L’uso della licenza LGPL per la libreria C, o per qualsiasi altra libreria, è una questione di strategia. La libreria C svolge una funzione generica: ogni sistema operativo proprietario ed ogni compilatore includono una libreria C. Di conseguenza, rendere disponibile la nostra libreria C solo per i programmi liberi non avrebbe dato nessun vantaggio a tali programmi liberi, avrebbe solo disincentivato l’uso della nostra libreria. C’è un’eccezione a questa situazione: sul sistema GNU (termine che include GNU/Linux) l’unica libreria C disponibile è quella GNU. Quindi i termini di distribuzione della nostra libreria C determinano se sia possibile o meno compilare un programma proprietario per il sistema GNU. Non ci sono ragioni etiche per permettere l’uso di applicazioni proprietarie sul sistema GNU, ma strategicamente sembra che impedirne l’uso servirebbe più a scoraggiare l’uso del sistema GNU che non a incoraggiare lo sviluppo di applicazioni libere. Ecco perché l’uso della licenza LGPL è una buona scelta strategica per la libreria C, mentre per le altre librerie la strategia va valutata caso per caso. Quando una libreria svolge una funzione 7 [NdT: nel 1999 la FSF ha cambiato nome alla licenza LGPL che ora si chiama "Lesser GPL", GPL attenuata, per non suggerire che si tratti della forma di licenza preferenziale per le librerie.] Il progetto GNU 4311 particolare che può aiutare a scrivere certi tipi di programmi, distribuirla secondo la GPL, quindi limitandone l’uso ai soli programmi liberi, è un modo per aiutare gli altri autori di software libero, dando loro un vantaggio nei confronti del software proprietario. Prendiamo come esempio GNU-Readline, una libreria scritta per fornire a Bash la modificabilità della linea di comando: Readline è distribuita secondo la normale licenza GPL, non la LGPL. Ciò probabilmente riduce l’uso di Readline, ma questo non rappresenta una perdita per noi; d’altra parte almeno una applicazione utile è stata resa software libero proprio al fine di usare Readline, e questo è un guadagno tangibile per la comunità. Chi sviluppa software proprietario ha vantaggi economici, gli autori di programmi liberi hanno bisogno di avvantaggiarsi a vicenda. Spero che un giorno possiamo avere una grande raccolta di librerie coperte dalla licenza GPL senza che esista una raccolta equivalente per chi scrive software proprietario. Tale libreria fornirebbe utili moduli da usare come i mattoni per costruire nuovi programmi liberi, e costituendo un sostanziale vantaggio per la scrittura di ulteriori programmi liberi. 376.17 Togliersi il prurito? Eric Raymond afferma che «ogni buon programma nasce dall’iniziativa di un programmatore che si vuole togliere un suo personale prurito». È probabile che talvolta succeda così, ma molte parti essenziali del software GNU sono state sviluppate al fine di completare un sistema operativo libero. Derivano quindi da una idea e da un progetto, non da una necessità contingente. Per esempio, abbiamo sviluppato la libreria C di GNU perché un sistema di tipo Unix ha bisogno di una libreria C, la Bourne-Again Shell (bash) perché un sistema di tipo Unix ha bisogno di una shell, e GNU tar perché un sistema di tipo Unix ha bisogno un programma tar. Lo stesso vale per i miei programmi: il compilatore GNU, GNU Emacs, GDB, GNU Make. Alcuni programmi GNU sono stati sviluppati per fronteggiare specifiche minacce alla nostra libertà: ecco perché abbiamo sviluppato gzip come sostituto per il programma Compress, che la comunità aveva perduto a causa dei brevetti sull’algoritmo LZW. Abbiamo trovato persone che sviluppassero LessTif, e più recentemente abbiamo dato vita ai progetti GNOME e Harmony per affrontare i problemi causati da alcune librerie proprietarie (come descritto più avanti). Stiamo sviluppando la GNU Privacy Guard per sostituire i diffusi programmi di crittografia non liberi, perché gli utenti non siano costretti a scegliere tra riservatezza e libertà. Naturalmente, i redattori di questi programmi sono coinvolti nel loro lavoro, e varie persone vi hanno aggiunto diverse funzionalità secondo le loro personali necessità ed i loro interessi. Tuttavia non è questa la ragione dell’esistenza di tali programmi. 376.18 Sviluppi inattesi All’inizio del progetto GNU pensavo che avremmo sviluppato l’intero sistema GNU e poi lo avremmo reso disponibile tutto insieme, ma le cose non andarono così. Poiché i componenti del sistema GNU sono stati implementati su un sistema Unix, ognuno di essi poteva girare su sistemi Unix molto prima che esistesse un sistema GNU completo. Alcuni di questi programmi divennero diffusi e gli utenti iniziarono ad estenderli e a renderli utilizzabili su nuovi sistemi: sulle varie versioni di Unix, incompatibili tra loro, e talvolta anche su altri sistemi. Questo processo rese tali programmi molto più potenti e attirò finanziamenti e collaboratori al progetto GNU; tuttavia probabilmente ritardò di alcuni anni la realizzazione di un sistema minimo funzionante, perché il tempo degli autori GNU veniva impiegato a curare la compatibilità di 4312 Il progetto GNU questi programmi con altri sistemi e ad aggiungere nuove funzionalità ai componenti esistenti, piuttosto che a proseguire nella scrittura di nuovi componenti. 376.19 GNU-Hurd Nel 1990 il sistema GNU era quasi completo, l’unica parte significativa ancora mancante era il kernel. Avevamo deciso di implementare il nostro kernel come un gruppo di processi server che girassero sul sistema Mach. Mach è un microkernel sviluppato alla Carnegie Mellon University e successivamente all’Università dello Utah; GNU Hurd è un gruppo di server (o "herd of gnus": mandria di gnu) che gira su Mach svolgendo le funzioni del kernel Unix. L’inizio dello sviluppo fu ritardato nell’attesa che Mach fosse reso disponibile come software libero, come era stato promesso. Una ragione di questa scelta progettuale fu di evitare quella che sembrava la parte più complessa del lavoro: effettuare il debugging del kernel senza un debugger a livello sorgente. Questo lavoro era già stato fatto, appunto in Mach, e avevamo previsto di effettuare il debugging dei server Hurd come programmi utente, con GDB. Ma questa fase si rivelò molto lunga, ed il debugging dei server multi-thread che si scambiano messaggi si è rivelato estremamente complesso. Per rendere Hurd robusto furono così necessari molti anni. 376.20 Alix Originariamente il kernel GNU non avrebbe dovuto chiamarsi Hurd; il suo nome originale era Alix, come la donna di cui ero innamorato in quel periodo. Alix, che era amministratrice di sistemi Unix, aveva sottolineato come il suo nome corrispondesse ad un comune schema usato per battezzare le versioni del sistema Unix: scherzosamente diceva ai suoi amici: «qualcuno dovrebbe chiamare un kernel come me». Io non dissi nulla ma decisi di farle una sorpresa scrivendo un kernel chiamato Alix. Le cose non andarono così. Michael Bushnell (ora Thomas), principale autore del kernel, preferì il nome Hurd, e chiamò Alix una parte del kernel, quella che serviva a intercettare le chiamate di sistema e a gestirle inviando messaggi ai server che compongono HURD. Infine io e Alix ci lasciammo e lei cambiò nome; contemporaneamente la struttura di Hurd veniva cambiata in modo che la libreria C mandasse messaggi direttamente ai server, e così il componente Alix scomparve dal progetto. Prima che questo accadesse, però, un amico di Alix si accorse della presenza del suo nome nel codice sorgente di Hurd e glielo disse. Così il nome raggiunse il suo scopo. 376.21 Linux e GNU/Linux GNU Hurd non è pronto per un uso non sperimentale, ma per fortuna è disponibile un altro kernel: nel 1991 Linus Torvalds sviluppò un Kernel compatibile con Unix e lo chiamò Linux. Attorno al 1992, la combinazione di Linux con il sistema GNU ancora incompleto produsse un sistema operativo libero completo (naturalmente combinarli fu un notevole lavoro di per sé). È grazie a Linux che oggi possiamo utilizzare una versione del sistema GNU. Chiamiamo GNU/Linux questa versione del sistema, per indicare la sua composizione come una combinazione del sistema GNU col kernel Linux. Il progetto GNU 4313 376.22 Le sfide che ci aspettano Abbiamo dimostrato la nostra capacità di sviluppare un’ampia gamma di software libero, ma questo non significa che siamo invincibili e inarrestabili. Diverse sfide rendono incerto il futuro del software libero, e affrontarle richiederà perseveranza e sforzi costanti, talvolta per anni. Sarà necessaria quella determinazione che le persone sanno dimostrare quando danno valore alla propria libertà e non permettono a nessuno di sottrargliela. Le quattro sezioni seguenti parlano di queste sfide. 376.23 Hardware segreto Sempre più spesso, i costruttori di hardware tendono a mantenere segrete le specifiche delle loro apparecchiature; questo rende difficile la scrittura di driver liberi che permettano a Linux e XFree86 di supportare nuove periferiche. Anche se oggi abbiamo sistemi completamente liberi, potremmo non averli domani se non saremo in grado di supportare i calcolatori di domani. Esistono due modi per affrontare il problema. Un programmatore può ricostruire le specifiche dell’hardware usando tecniche di reverse engineering. Oppure si può scegliere hardware supportato dai programmi liberi: man mano che il nostro numero aumenta, la segretezza delle specifiche diventerà una pratica controproducente. Il reverse engineering è difficile: avremo programmatori sufficientemente determinati da dedicarvisi? Sì, se avremo costruito una forte consapevolezza che avere programmi liberi sia una questione di principio e che i driver non liberi non sono accettabili. E succederà che molti di noi accettino di spendere un po’ di più o perdere un po’ più di tempo per poter usare driver liberi? Sì, se il desiderio di libertà e la determinazione ad ottenerla saranno diffusi. 376.24 Librerie non libere Una libreria non libera che giri su sistemi operativi liberi funziona come una trappola per i creatori di programmi liberi. Le funzionalità attraenti della libreria fungono da esca; chi usa la libreria cade nella trappola, perché il programma che crea è inutile come parte di un sistema operativo libero (a rigore, il programma potrebbe esservi incluso, ma non funzionerebbe, visto che manca la libreria). Peggio ancora, se un programma che usa la libreria proprietaria diventa diffuso, può attirare altri ignari programmatori nella trappola. Il problema si concretizzò per la prima volta con la libreria Motif, negli anni ’80. Sebbene non ci fossero ancora sistemi operativi liberi, i problemi che Motif avrebbe causato loro erano già chiari. Il progetto GNU reagì in due modi: interessandosi presso diversi progetti di software libero perché supportassero gli strumenti grafici X liberi in aggiunta a Motif, e cercando qualcuno che scrivesse un sostituto libero di Motif. Il lavoro richiese molti anni: solo nel 1997 LessTif, sviluppato dagli "Hungry Programmers", divenne abbastanza potente da supportare la maggior parte delle applicazioni Motif. Tra il 1996 e il 1998 un’altra libreria non libera di strumenti grafici, chiamata Qt, veniva usata in una significativa raccolta di software libero: l’ambiente grafico KDE. I sistemi liberi GNU/Linux non potevano usare KDE, perché non potevamo usare la libreria; tuttavia, alcuni distributori commerciali di sistemi GNU/Linux, non scrupolosi nell’attenersi solo ai programmi liberi, aggiunsero KDE ai loro sistemi, ottenendo così sistemi che offrivano più funzionalità, ma meno libertà. Il gruppo che sviluppava KDE incoraggiava esplicitamente altri programmatori ad usare Qt, e milioni di nuovi "utenti Linux" non sospettavano minimamente che questo potesse costituire un problema. La situazione si faceva pericolosa. 4314 Il progetto GNU La comunità del software libero affrontò il problema in due modi: GNOME e Harmony. GNOME (GNU Network Object Model Environment, modello di ambiente per oggetti di rete) è il progetto GNU per l’ambiente grafico (desktop). Intrapreso nel 1997 da Miguel de Icaza e sviluppato con il supporto di Red Hat Software, GNOME si ripromise di fornire funzionalità grafiche simili a quelle di KDE, ma usando esclusivamente software libero. GNOME offre anche dei vantaggi tecnici, come il supporto per svariati linguaggi di programmazione, non solo il C++. Ma il suo scopo principale era la libertà: non richiedere l’uso di alcun programma che non fosse libero. Harmony è una libreria compatibile con Qt, progettata per rendere possibile l’uso del software KDE senza dover usare Qt. Nel novembre 1998 gli autori di Qt annunciarono un cambiamento di licenza che, una volta operativo, avrebbe reso Qt software libero. Non c’è modo di esserne certi, ma credo che questo fu in parte dovuto alla decisa risposta della comunità al problema posto da Qt quando non era libero (la nuova licenza è scomoda ed iniqua, per cui rimane comunque preferibile evitare l’uso di Qt). Come risponderemo alla prossima allettante libreria non libera? Riuscirà la comunità in toto a comprendere l’importanza di evitare la trappola? Oppure molti di noi preferiranno la convenienza alla libertà, creando così ancora un grave problema? Il nostro futuro dipende dalla nostra filosofia. 376.25 Brevetti sul software Il maggior pericolo a cui ci troviamo di fronte è quello dei brevetti sul software, che possono rendere inaccessibili al software libero algoritmi e funzionalità per un tempo che può estendersi fino a vent’anni. I brevetti sugli algoritmi di compressione LZW furono depositati nel 1983, e ancor oggi non possiamo distribuire programmi liberi che producano immagini GIF compresse. Nel 1998 un programma libero per produrre audio compresso MP3 venne ritirato sotto minaccia di una causa per violazione di brevetto. Ci sono modi per affrontare la questione brevetti: possiamo cercare prove che un brevetto non sia valido oppure possiamo cercare modi alternativi per ottenere lo stesso risultato. Ognuna di queste tecniche, però, funziona solo in certe circostanze; quando entrambe falliscono un brevetto può obbligare tutto il software libero a rinunciare a qualche funzionalità che gli utenti desiderano. Cosa dobbiamo fare quando ciò accade? Chi fra noi apprezza il software libero per il valore della libertà rimarrà comunque dalla parte dei programmi liberi; saremo in grado di svolgere il nostro lavoro senza le funzionalità coperte da brevetto. Ma coloro che apprezzano il software libero perché si aspettano che sia tecnicamente superiore probabilmente grideranno al fallimento quando un brevetto ne impedisce lo sviluppo. Perciò, nonostante sia utile parlare dell’efficacia pratica del modello di sviluppo "a cattedrale", e dell’affidabilità e della potenza di un dato programma libero, non ci dobbiamo fermare qui; dobbiamo parlare di libertà e di principi. 376.26 Documentazione libera La più grande carenza nei nostri sistemi operativi liberi non è nel software, quanto nella carenza di buoni manuali liberi da includere nei nostri sistemi. La documentazione è una parte essenziale di qualunque pacchetto software; quando un importante pacchetto software libero non viene accompagnato da un buon manuale libero si tratta di una grossa lacuna. E di queste lacune attualmente ne abbiamo molte. Il progetto GNU 4315 La documentazione libera, come il software libero, è una questione di libertà, non di prezzo. Il criterio per definire libero un manuale è fondamentalmente lo stesso che per definire libero un programma: si tratta di offrire certe libertà a tutti gli utenti. Deve essere permessa la redistribuzione (compresa la vendita commerciale), sia in formato elettronico che cartaceo, in modo che il manuale possa accompagnare ogni copia del programma. Autorizzare la modifica è anch’esso un aspetto cruciale; in generale, non credo sia essenziale permettere alle persone di modificare articoli e libri di qualsiasi tipo. Per esempio, non credo che voi o io dobbiamo sentirci in dovere di autorizzare la modifica di articoli come questo, articoli che descrivono le nostre azioni e il nostro punto di vista. Ma c’è una ragione particolare per cui la libertà di modifica è cruciale per la documentazione dei programmi liberi. Quando qualcuno esercita il proprio diritto di modificare il programma, aumentandone o alterandone le funzionalità, se è coscienzioso modificherà anche il manuale, in modo da poter fornire una documentazione utile e accurata insieme al programma modificato. Un manuale che non permetta ai programmatori di essere coscienziosi e completare il loro lavoro non soddisfa i bisogni della nostra comunità. Alcuni limiti sulla modificabilità non pongono alcun problema; per esempio, le richieste di conservare la nota di copyright dell’autore originale, i termini di distribuzione e la lista degli autori vanno bene. Non ci sono problemi nemmeno nel richiedere che le versioni modificate dichiarino esplicitamente di essere tali, così pure che intere sezioni non possano essere rimosse o modificate, finché queste sezioni vertono su questioni non tecniche. Restrizioni di questo tipo non creano problemi perché non impediscono al programmatore coscienzioso di adattare il manuale perché rispecchi il programma modificato. In altre parole, non impediscono alla comunità del software libero di beneficiare appieno dal manuale. D’altro canto, deve essere possibile modificare tutto il contenuto tecnico del manuale e poter distribuire il risultato in tutti i formati usuali, attraverso tutti i normali canali di distribuzione; diversamente, le restrizioni creerebbero un ostacolo per la comunità, il manuale non sarebbe libero e avremmo bisogno di un altro manuale. Gli sviluppatori di software libero avranno la consapevolezza e la determinazione necessarie a produrre un’intera gamma di manuali liberi? Ancora una volta, il nostro futuro dipende dalla nostra filosofia. 376.27 Dobbiamo parlare di libertà Stime recenti valutano in dieci milioni il numero di utenti di sistemi GNU/Linux quali Debian GNU/Linux e Red Hat Linux. Il software libero ha creato tali vantaggi pratici che gli utenti stanno approdando ad esso per pure ragioni pratiche. Gli effetti positivi di questa situazione sono evidenti: maggior interesse a sviluppare software libero, più clienti per le imprese di software libero e una migliore capacità di incoraggiare le aziende a sviluppare software commerciale libero invece che prodotti software proprietari. L’interesse per il software, però, sta crescendo più in fretta della coscienza della filosofia su cui è basato, e questa disparità causa problemi. La nostra capacità di fronteggiare le sfide e le minacce descritte in precedenza dipende dalla determinazione nell’essere impegnati per la libertà. Per essere sicuri che la nostra comunità abbia tale determinazione, dobbiamo diffondere l’idea presso i nuovi utenti man mano che entrano a far parte della comunità. Ma in questo stiamo fallendo: gli sforzi per attrarre nuovi utenti nella comunità sono di gran lunga maggiori degli sforzi per l’educazione civica della comunità stessa. Dobbiamo fare entrambe le cose, e dobbiamo mantenere un equilibrio fra i due impegni. 4316 Il progetto GNU 376.28 "Open Source" Parlare di libertà ai nuovi utenti è diventato più difficile dal 1998, quando una parte della comunità decise di smettere di usare il termine "free software" e usare al suo posto "open source". Alcune delle persone che suggerirono questo termine intendevano evitare che si confondesse "free" con "gratis", un valido obiettivo. D’altra parte, altre persone intendevano mettere da parte lo spirito del principio che aveva dato la spinta al movimento del software libero e al progetto GNU, puntando invece ad attrarre i dirigenti e gli utenti commerciali, molti dei quali afferiscono ad una ideologia che pone il profitto al di sopra della libertà, della comunità, dei principi. Perciò la retorica di "open source" si focalizza sul possibilità di creare software di buona qualità e potente ma evita deliberatamente le idee di libertà, comunità, principio. Le riviste che si chiamano "Linux..." sono un chiaro esempio di ciò: sono piene di pubblicità di software proprietario che gira sotto GNU/Linux; quando ci sarà il prossimo Motif o Qt, queste riviste avvertiranno i programmatori di starne lontano o accetteranno la sua pubblicità? L’appoggio delle aziende può contribuire alla comunità in molti modi; a parità di tutto il resto è una cosa utile. Ma ottenere questo appoggio parlando ancor meno di libertà e principi può essere disastroso; rende ancora peggiore lo sbilanciamento descritto tra diffusione ed educazione civica. "Software libero" (free software) e "sorgente aperto" (open source) descrivono più o meno la stessa categoria di software, ma dicono cose differenti sul software e sui valori. Il progetto GNU continua ad usare il termine "software libero" per esprimere l’idea che la libertà sia importante, non solo la tecnologia. 376.29 Prova! La filosofia di Yoda ("Non c’è provare") suona bene, ma per me non funziona. Ho fatto la maggior parte del mio lavoro angustiato dal timore di non essere in grado di svolgere il mio compito e nel dubbio, se fossi riuscito, che non fosse sufficiente per raggiungere l’obiettivo. Ma ci ho provato in ogni caso perché nessuno tranne me si poneva tra il nemico e la mia città. Sorprendendo me stesso, qualche volta sono riuscito. A volte ho fallito, alcune delle mie città sono cadute; poi ho trovato un’altra città minacciata e mi sono preparato ad un’altra battaglia. Con l’andar del tempo ho imparato a cercare le possibili minacce e a mettermi tra loro e la mia città, facendo appello ad altri hacker perché venissero e si unissero a me. Oggigiorno spesso non sono da solo. È un sollievo ed una gioia quando vedo un reggimento di hacker che scavano trincee per difendere il confine e quando mi rendo conto che questa città può sopravvivere; per ora. Ma i pericoli diventano più grandi ogni anno, ed ora Microsoft ha esplicitamente preso di mira la nostra comunità. Non possiamo dare per scontato il futuro della libertà; non diamolo per scontato! Se volete mantenere la vostra libertà dovete essere pronti a difenderla. Capitolo 377 Proprietà del software L’esistenza del software libero, soprattutto nei termini intesi dalla Free Software Foundation, mette in discussione la fondatezza dei principi che difendono la «proprietà» del software stesso. Su questa controversia sono state scritte tante cose, ed è difficile avere qualcosa di nuovo da dire. In questo capitolo vengono raccolte alcune citazioni che riguardano in particolare il problema del brevetto sul software e le conseguenze a cui può portare questa politica. 377.1 Dal copyright al brevetto e conseguenze Il testo seguente è un estratto da Cenni di storia del software (e dell’hardware), scritto da Giulio Mazzolini.1 L’idea che si debbano dare dei privilegi agli stampatori nasce alla fine del ’400 a Venezia. Si danno semplicemente dei privilegi, non esiste ancora una legislazione in merito. Non esiste nessun diritto per gli autori, forse anche perché molti libri sono riproduzioni di testi di autori antichi. L’idea è semplice, stampare un libro costa, quindi lo stampatore deve avere una protezione che lo protegga da un altro stampatore che intenda stampare lo stesso libro. Nel 1709 appare la prima legge sul copyright con la costituzione della Regina Anna in Inghilterra. I diritti dell’autore non sono ancora ben considerati, interessa maggiormente lo stampatore. Bisogna aspettare il Romanticismo e il prevalere dei diritti della persona per trovare interesse all’autore. Nel 1791, in piena Rivoluzione Francese, viene scritta una legge fondamentale sul diritto d’autore, che sancisce i diritti dell’autore, legge che per la sua chiarezza è restata in vigore in Francia sino a questo secolo. Vi si riconosce la figura dell’autore e se ne tutelano i diritti. L’autore dell’opera possiede tutti i diritti per il semplice fatto di esserne l’autore. Può, se vuole, cedere alcuni o tutti i diritti a terzi con un patto esplicito. Se si tratta di un testo, in genere i diritti sono quelli di riprodurre il testo in un libro, eventualmente di farne delle traduzioni e poi delle ristampe. Se l’opera è un quadro, l’autore può cedere il diritto di copia dell’opera, per esempio per farne una copertina, o un manifesto. Un autore può tutelare la sua opera anche se ha ceduto i diritti di riproduzione. Può esigere che l’opera resti integra, che non subisca modificazioni. Hanno quindi ragione i registi che pretendono che i loro film passino senza interruzioni pubblicitarie, o senza essere censurati in alcune scene. Quindi se comperate un quadro, con il possesso e la proprietà legittima dello stesso, non avete automaticamente il diritto di copiarlo. L’autore poi potrebbe impedirvi di tenerlo in un posto che svilisca o oltraggi l’opera. Non sempre però l’autore è certo, un’opera può essere fatta da più persone, un’opera collettiva, quindi potrebbe non essere agevole riconoscere l’autore o gli autori o la quota di partecipazione degli stessi all’opera. I diritti d’autore sono ereditari, per cui gli eredi potranno godere dei vantaggi economici derivanti dai diritti d’autore anche dopo la morte dell’autore. [...] In Europa a seguito del dibattito tenutosi dopo la Rivoluzione Francese, venne formata nel 1884 a Berna l’Associazione per il Diritto d’Autore, dove viene data adeguata protezione alla figura dell’autore. 1 Nel testo sono state apportate alcune piccole correzioni con il consenso di Giulio Mazzolini. 4317 Proprietà del software 4318 Quando il legislatore dice Autore intende «di opera artistica o assimilata». Negli USA il concetto di copyright tende a venir esteso anche in mancanza di un’opera artistica. Per alcuni, anche una lettera commerciale può venire considerata soggetta a copyright. [...] La protezione del software non è oggi data solo dalla legislazione sul copyright. Negli USA è oramai prassi brevettare pezzi il software, algoritmi, trovate varie. È brevettato il cestino dell’Apple, l’algoritmo di compressione usato dal programma zip, l’exor del puntatore grafico. L’IBM deposita migliaia di brevetti all’anno e così pure le grandi case. Oggi nessuno può seriamente pensare di scrivere del software commerciale se non ha capitali molto grandi. Infatti deve mettere degli avvocati a tempo pieno per assistere chi scrive, affinché non incorra in infrazioni di brevetti. Non solo, poiché è impossibile che uno studio di avvocati conosca «tutti» i brevetti di software, c’è la certezza di incappare in qualche azione legale fatta da terzi che ritengono lesi i loro diritti. Cause che costano molto o si chiudono con costosi accordi. Quindi di fatto oggi tutto il «corpus» di protezioni al software deve essere visto soprattutto come strumento di conservazione di posizioni di monopolio o dominanti. [...] L’avv. Pamela Samuelson ha così voluto riassumere i sei punti principali della rivoluzione digitale: 1. è molto facile duplicare, si fa presto, costa poco, le copie sono dei duplicati perfetti dell’originale; 2. è facilissimo trasmettere i dati e si trasmettono quasi istantaneamente, si trasmettono in tutto il mondo scavalcando barriere nazionali, doganali, censorie; 3. il dato digitale è malleabile, si può trasformare facilmente, si può deformare quanto si vuole, un originale ne diventa facilmente un altro deformato o rielaborato; 4. le opere letterarie, le opere sonore, le opere grafiche, una volta messe in forma digitale, subiscono la stessa sorte, sono indistinguibili nel supporto, non sono più differenziate tra libro, quadro e disco, mettendo in crisi i concetti di copyright che sono diversi se si tratta appunto di quadro, disco o libro; 5. il dato digitale è compatto, è piccolo si trasporta facilmente; 6. il dato digitale non si visita più linearmente come si fa con un libro, ma in modo non lineare. Tutti coloro che hanno visitato un sito in Internet non hanno letto pagina dopo pagina, ma sono saltati da una pagina ad un altro sito, creandosi percorsi individuali di esplorazione del mondo digitale. Ciascuna delle caratteristiche precedenti è sufficiente a causare una rottura delle dottrine esistenti sulla proprietà intellettuale. Tutte e sei assieme sicuramente costringeranno i legislatori ad una modifica radicale del concetto di copyright e di proprietà intellettuale. Proprietà del software 4319 377.2 Problemi legati al brevetto sul software Nel seguito sono riportate alcune citazioni di articoli e altri documenti sul problema del brevetto sul software. • Bryan Pfaffenberger, The Coming Software Patent Crisis: Will Linux Survive?, Linux Journal, 10 agosto 1999 Non puoi scrivere alcun tipo di software senza violare qualche brevetto altrui; anche «Ciao mondo!» sarebbe in violazione. Eh sì, giacché comprende una procedura di output tramite un display a mappa di bit (sì, questa procedura è brevettata). E se i detentori di questi brevetti decidono di denunciarti, sei fregato. Non ti sarà possibile difenderti: il costo medio di una causa processuale è di $500.000. Se un numero sufficiente di autori open-source ricevono lettere di questo genere, potremo dire addio a Linux. I brevetti sono legittimi, ma solo fino a un certo punto. I fondatori della Costituzione hanno inteso bilanciare il diritto conferito da un brevetto contro il bene del pubblico. 2 • Richard M. Stallman, Saving Europe from Software Patents, Linux Today, 16 maggio 1999 Immaginate che ogni qualvolta avete preso una decisione riguardante il software e in particolare quando avete usato un algoritmo letto in una pubblicazione o realizzato una funzionalità richiesta dai vostri utenti, avete corso il rischio di essere denunciati. 3 • Donald E. Knuth, Letter to the Patent Office from Professor Donald Knuth, Programming Freedom, n. 11, febbraio 1995 Quando penso ai programmi che utilizzo quotidianamente per lavorare, mi rendo conto che nessuno di questi esisterebbe se i brevetti sul software fossero stati comuni negli anni 60 e 70. Gli algoritmi sono fondamentali per il software come lo sono le parole per gli scrittori, perché costituiscono le mattonelle con cui si costruiscono prodotti interessanti. Cosa accadrebbe se gli avvocati potessero brevettare i loro metodi di difesa o se i giudici della Corte Suprema potessero brevettare le loro decisioni precedenti? Ci sono modi migliori di proteggere la proprietà intellettuale degli sviluppatori software invece di togliere loro il diritto di utilizzare le mattonelle fondamentali per costruire i loro prodotti. 4 • Richard M. Stallman, Patent Reform Is Not Enough, GNU’s Bullettin, vol. 1, n. 13, giugno 1992 Insegnare all’Ufficio Brevetti come esaminare meglio una domanda di brevetto per determinarne la «novità» e l’«attività inventiva» può prevenire alcuni errori clamorosi. Non aiuterà però a eliminare il problema più grave: il fatto che si 2 <http://www.linuxjournal.com/article.php/?sid=5079> <http://features.linuxtoday.com/news_story.php3?ltsn=1999-05-16-003-05-NW-LF> 4 <http://www.pluto.linux.it/meeting/meeting1999/atti/no-patents/brevetti/docs/knuth_letter_en.html> 3 Proprietà del software 4320 sta brevettando ogni nuova caratteristica riguardante l’uso dei computer. Anche un programma innovativo tipicamente fa uso di dozzine di tecniche e caratteristiche che non sono nuove, ognuna delle quali è potenzialmente già brevettata. La nostra capacità di utilizzare ogni caratteristica dipenderà dalla fortuna, e se saremo sfortunati metà del tempo, pochi programmi sfuggiranno dal violare un grande numero di brevetti. Navigare nel labirinto di brevetti sarà più difficile che scrivere programmi. 5 377.3 Riferimenti • Giulio Mazzolini, Software e copyright • Alessandro Rubini, Verso un’etica del software <http://www.prosa.it/philosophy/etica-sw.html> • Protecting competition against the abuse of software patents <http://www.freepatents.org/> • Gordon Irlam, Examples of Software Patents <http://www.base.com/software-patents/examples.html> 5 <http://www.gnu.org/philosophy/patent-reform-is-not-enough.html> Capitolo 378 L’ipotesi del futuro, nel bene e nel male di Anna Rambelli non modificabile Il modo di comunicare nel futuro sarà sempre più tecnologico. L’informatica è il futuro. Non serviranno più le vie telefoniche. Il telefono diventerà un sistema poco usato. Si farà tutto attraverso la via telematica. Il futuro dell’informatica è talmente veloce che i cambiamenti sono presenti ogni giorno. Il veicolo informativo sarà pieno di sorprese, non sempre piacevoli. La situazione diventa spiacevole quando il mezzo di informazione è usato malamente, contro l’umanità e il benessere. Se l’essere umano saprà usare bene la tecnologia, ci saranno delle trasformazioni sorprendenti in ogni campo, specialmente nella medicina e nelle comunicazioni cibernetiche. La cibernetica funzionerà come funzionò a suo tempo il telegrafo senza fili di Marconi: rivoluzionerà tutti gli avvenimenti della Terra. L’uomo non sarà più in grado di sopportare i cambiamenti così mutevoli e spesso si verificheranno delle situazioni di eccessiva confusione , o meglio dire, eccessive distorsioni mentali che potranno influenzare i comportamenti, soprattutto dei giovani. Il giovane vivrà la macchina come una calamita da cui non riuscirà a staccarsi. Questo è il male della trasformazione così veloce: la mente non riuscirà a stare ai tempi. Si potrà creare una dipendenza talmente esagerata da esasperare le situazioni e da bloccare molti meccanismi meccanografici, per cui il commercio e gli scambi andranno in crisi e l’economia mondiale subirà dei tracolli così gravi da lasciare l’umanità sconvolta e interdetta. Il secolo che è appena iniziato, racchiude delle aspettative e delle speranze che l’uomo è in grado di sviluppare. Si avvereranno delle profezie legate alle tecnologie più avanzate. Non serviranno più i soldi, perché tutto verrà acquistato tramite le vie informatiche. Anche il negozio e il supermercato subiranno uno sconvolgimento unico, il sistema della compravendita come è improntato ora, scomparirà in breve tempo. La manodopera servirà a ben poco. La figura della massaia non esisterà più. Esisteranno anche le chiamate via Internet per curare e guarire certe malattie. Non dovrai più andare tu dal medico, ma sarà lui che entrerà nella tua casa attraverso la via telematica. Quindi, anche la figura del medico e dell’ospedale, verrà completamente cambiata. Il tuo bambino avrà sempre meno bisogno di essere custodito perché tu potrai visualizzarlo sempre, in ogni istante, costantemente. Tutto questo, però, se l’essere umano non riuscirà a usarlo bene, servirà a inaridire i rapporti umani e a sconvolgere anche la mente umana. Tutto questo dovrà essere usato con intelligenza e comunque sempre con un sentimento di correttezza e coscienza. L’elaboratore allegerisce molti ostacoli, ma dall’altra parte, come già detto, può impoverire i rapporti umani e le relazioni interpersonali. Ma l’impulso, ormai scaturito, per questo mezzo di comunicazione, è talmente forte, talmente violento, che niente e nessuno potrà mai più fermarlo. Il rischio che questa forza travolgente impoverisca e distrugga la mente umana è grande. Non vorremmo che la macchina prendesse il sopravvento assoluto sulle questioni, non solo mondiali, economiche e politiche, ma soprattutto sull’autonomia e sul libero arbitrio dell’uomo. 4321 L’ipotesi del futuro, nel bene e nel male 4322 378.1 Riferimenti • Anna Rambelli, Abbi cura di te <http://a2.swlibero.org/~daniele/anima/nfr/> Indice analitico del volume /dev/boot255, 3953 /dev/cdrom, 3858 /dev/dsp, 3858 /dev/sg*, 3858 /dev/vcsa*, 4289 /dev/vcs*, 4289 /etc/brltty.conf, 4291 /etc/brltty/, 4291 /etc/dosemu.conf, 3878 /etc/dosemu.users, 3877 /etc/exports, 3960 /etc/gpm.conf, 3997 /etc/hostname, 3999 /etc/init.d/keymaps.sh, 3996 /etc/kbd/default.kmap.gz, 3996 /etc/magicfilter/, 3998 /etc/mailname, 3999 /etc/papersize, 3999 /etc/printcap, 3998 /etc/suid.conf, 4000 /etc/xcdroast/xcdroast.conf, 3858 /tftpboot/, 3955 antiword, 3874 audio stream, 3837 Aumix, 3813 backup, 3904 Barcode, 3979 braille, 4284 catdoc, 3873 CD audio, 3846 Cdcd, 3803 CDDA, 3807 CDDB, 3806 Cdparanoia, 3809 Cdrdao, 3847 Cdrecord, 3854 chkconfig, 4019 Code 128, 3972 Code 3 of 9, 3971 Code 39, 3971 Code 39 esteso, 3972 codice a barre, 3964, 3979 configurazione: Debian, 3990 configurazione: Red Hat, 4014 copia di sicurezza, 3904 copia di sicurezza: generazioni, 3906 copia di sicurezza: livelli, 3907 dbf2pg, 3871 dbview, 3870 Dcd, 3801 4323 Debian, 3990, 4001 Debian: /etc/init.d/*, 3993 Debian: /etc/rc?.d, 3994 dischetto di emergenza, 3915 dischetto di emergenza: Slackware, 3918 diskless, 3951 DOS, 3876 DOS: APPEND, 4089 DOS: ASSIGN, 4087 DOS: ATTRIB, 4089 DOS: AUTOEXEC.BAT, 4096 DOS: BREAK, 4092 DOS: BUFFERS, 4092 DOS: CALL, 4099 DOS: CH, 4075 DOS: CHCP, 4097 DOS: CHDIR, 4075 DOS: CHKDSK, 4086 DOS: CHOICE, 4103 DOS: CLS, 4103 DOS: COMP, 4091 DOS: CONFIG.SYS, 4092 DOS: COPY, 4079 DOS: COUNTRY, 4093 DOS: DATE, 4098 DOS: DEL, 4079 DOS: DELTREE, 4089 DOS: DEVICE, 4094 DOS: DEVICEHIGH, 4094 DOS: DIR, 4078 DOS: DISKCOPY, 4086 DOS: DOS, 4094 DOS: DRIVEPARM, 4094 DOS: ECHO, 4102 DOS: ERASE, 4079 DOS: FC, 4091 DOS: FCBS, 4095 DOS: FILES, 4095 DOS: FIND, 4090 DOS: FOR, 4100 DOS: FORMAT, 4084 DOS: GOTO, 4101 DOS: GRAFTABL, 4098 DOS: IF, 4100 DOS: INSTALL, 4095 DOS: JOIN, 4088 DOS: KEYB, 4097 DOS: LABEL, 4085 DOS: LASTDRIVE, 4095 DOS: LH, 4105 DOS: LOADHIGH, 4105 DOS: MD, 4076 4324 DOS: MEM, 4106 DOS: MKDIR, 4076 DOS: MORE, 4082 DOS: MOVE, 4090 DOS: PAUSE, 4103 DOS: REM, 4102 DOS: REN, 4080 DOS: RENAME, 4080 DOS: RM, 4078 DOS: RMDIR, 4078 DOS: SET, 4080 DOS: SHELL, 4096 DOS: SHIFT, 4099 DOS: SORT, 4082 DOS: STACK, 4096 DOS: SUBST, 4088 DOS: SYS, 4087 DOS: TIME, 4098 DOS: TREE, 4091 DOS: TYPE, 4081 DOS: VERIFY, 4089 DOS: VOL, 4085 DOS: XCOPY, 4086 DOSEMU, 3876 dpkg-scanpackages, 4005, 4008 EAN: European Article Number, 3966 EAN-13, 3965 EAN-8, 3965 elaboratore senza disco, 3951 ELKS, 4064 esempio: rpmdoppi, 4029 Ethernet, 3921 file DBF, 3870 filmato, 3844 FreeAmp, 3834 Gcd, 3805 GNU: Manifesto, 4294 Gnuplot, 4110 Grip, 3810 gtcd, 3802 GTV, 3844 i25, 3976 Icecast, 3841 interfogliata due su cinque, 3976 Interleaved two of five, 3976 ISBN, 3969 Ispell, 4111 ISSN, 3970 ITF, 3976 LAME, 3827 listen, 3843 MI/X, 3884 4325 Minix, 4044 Motif, 3887 MP3, 3810, 3823, 3830, 3838 MP3blaster, 3830 MP3info, 3825 MPEG, 3844 mswordview, 3873 MS-Word: conversione, 3873, 3873, 3874 Mtools, 3882 nanoLinux, 3923 Netscape, 3896 NetStreamer, 3837 nodo senza disco, 3951 ntsysv, 4019 Perl, 4111 PlayMPEG, 3844 PLIP, 3921 recode, 3868 Red Hat, 4014, 4029 Red Hat: /etc/bashrc, 4023 Red Hat: /etc/profile, 4023 Red Hat: /etc/profile.d/, 4025 Red Hat: /etc/rc.d/init.d/*, 4017 Red Hat: /etc/rc.d/rc?.d, 4018 Red Hat: /etc/sysconfig/clock, 4022 Red Hat: /etc/sysconfig/keyboard, 4022 Red Hat: /etc/sysconfig/mouse, 4022 Red Hat: /etc/sysconfig/network, 4020 Red Hat: /etc/sysconfig/network-scripts/ifcfg-*, 4021 Red Hat: /etc/sysconfig/static-routes, 4021 Red Hat: /var/spool/lpd/*/, 4027 Red Hat: ~/.bashrc, 4023 Red Hat: ~/.bash_profile, 4023 RIFF WAV, 3809, 3810, 3818 rpmdoppi, 4029 SC, 4111 shout, 3842 Slackware, 3918 sndconfig, 3799 software proprietario, 3887 Sox, 3819 Spreadsheet Calculator, 4111 StarOffice, 3887, 3893, 3895 start-stop-daemon, 3993 stazione senza disco, 3951 stream audio, 3837 streaming video, 3844 tcd, 3802 TCD, 3802 UCC/EAN 128, 3976 UCC: Uniform Code Council, 3966 UPC-A, 3965 4326 UPC-E, 3965 update-rc.d, 3995 USS Code 128, 3972 utenti, 3944, 3946, 3998, 4025 video, 3844 Wav2cdr, 3855 Wavtools, 3818 WAV-RIFF, 3809, 3810, 3818 Winword: conversione, 3873, 3873, 3874 Word: conversione, 3873, 3873, 3874 X, 3884 Xcdrdao, 3851 xcdroast, 3858 xdos, 3882 Xmms, 3832 XV, 3898 Xwave, 3818 X-CD-Roast, 3858 X-Win32, 3886 ~/.xcdroast/xcdroast.conf, 3858 4327 4328 Appunti di informatica libera 2003.01.01 Volume IX Informazioni obsolete 4329 Appunti Linux Copyright © 1997-2000 Daniele Giacomini Appunti di informatica libera Copyright © 2000-2003 Daniele Giacomini Via Morganella Est, 21 -- I-31050 Ponzano Veneto (TV) -- daniele @ swlibero.org Le informazioni contenute in questa opera possono essere diffuse e riutilizzate in base alle condizioni poste dalla licenza GNU General Public License, come pubblicato dalla Free Software Foundation. In caso di modifica dell’opera e/o di riutilizzo parziale della stessa, secondo i termini della licenza, le annotazioni riferite a queste modifiche e i riferimenti all’origine di questa opera, devono risultare evidenti e apportate secondo modalità appropriate alle caratteristiche dell’opera stessa. In nessun caso è consentita la modifica di quanto, in modo evidente, esprime il pensiero, l’opinione o i sentimenti del suo autore. L’opera è priva di garanzie di qualunque tipo, come spiegato nella stessa licenza GNU General Public License. Queste condizioni e questo copyright si applicano all’opera nel suo complesso, salvo ove indicato espressamente in modo diverso. The informations contained inside this work can be spread and reused under the terms of the GNU General Public License as published by the Free Software Foundation. If you modify this work and/or reuse it partially, under the terms of the license, the notices about these changes and the references about the original work, must be evidenced conforming to the work characteristics. IN NO EVENT IS ALLOWED TO MODIFY WHAT ARE CLEARLY THE THOUGHTS, THE OPINIONS AND/OR THE FEELINGS OF THE AUTHOR. This work 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. See the GNU General Public License for more details. These conditions and this copyright apply to the whole work, except where clearly stated in a different way. Una copia della licenza GNU General Public License, versione 2, si trova nell’appendice A. A copy of GNU General Public License, version 2, is available in appendix A. 4330 The main distribution for Appunti di informatica libera is described below. For every distribution channel the maintainer’s name and address is also reported. Internet • direct reading: <http://a2.swlibero.org/> download: <ftp://a2.swlibero.org/a2/> and <http://a2.swlibero.org/ftp/> Michele Dalla Silvestra, mds @ swlibero.org • direct reading: <http://appuntilinux.torino.linux.it/> download: <ftp://ftp.torino.linux.it/appunti-linux/> Carlo Perassi, carlo @ linux.it • direct reading: <http://sansone.crema.unimi.it/linux/a2/HTML/> download: <http://sansone.crema.unimi.it/linux/a2/> Fabrizio Zeno Cornelli, zeno @ filibusta.crema.unimi.it • direct reading: <http://www.pctime.it/servizi/appunti-linux/> download: <http://www.pctime.it/servizi/appunti-linux/a2-prelievo/> Franco Lazzero, PCTIME, pctime @ pctime.net • direct reading: <http://www.a2.prosa.it/> download: <ftp://ftp.a2.prosa.it/> Davide Barbieri, paci @ prosa.it • direct reading: <http://linux.pueste.it/> download: <http://linux.pueste.it/filearea/AppuntiLinux/> David Pisa, david @ iglu.cc.uniud.it • direct reading: <http://www.informasiti.com/Appunti/HTML/> download: <http://www.informasiti.com/Appunti/> Claudio Neri, Sincro Consulting, neri.c @ sincroconsulting.com GNU distributions • GNU/Linux Debian <http://packages.debian.org/appunti-informatica-libera> Massimo Dal Zotto, dz @ cs.unitn.it Italian magazine’s CD-ROM • inter-punto-net <http://www.interpuntonet.it> Michele Dalla Silvestra, mds @ swlibero.org • Internet News <http://inews.tecnet.it> Francesco Facconi, francescofacconi @ libero.it Fabio Ferrazzo, fabio.fr @ tiscalinet.it • Linux Magazine <http://www.edmaster.it/prodotti/linux/ult-riv.html> Emmanuele Somma, esomma @ ieee.org La diffusione di questa opera è incoraggiata in base ai termini della licenza. The spread of this work is encouraged under the terms of the license. 4331 Parte lxxxi Distribuzioni GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4333 379 Monkey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4334 380 Configurazione di una distribuzione Slackware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4336 381 Script per la gestione dei pacchetti software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4341 Parte lxxxii Informazioni varie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4353 382 Emulatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4354 383 nanoRouter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4358 384 X-ISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4362 385 Introduzione a SMB con GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4366 386 Applicazioni multimediali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4381 387 Acua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4386 Indice analitico del volume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4407 4332 Parte lxxxi Distribuzioni GNU/Linux 379 Monkey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4334 379.1 Installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4334 379.2 Avvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4334 379.3 Conclusione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4334 379.4 Installazione dei pacchetti addizionali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4335 379.5 Configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4335 380 Configurazione di una distribuzione Slackware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4336 380.1 Procedura di inizializzazione del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4336 380.2 Configurazione della rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4338 380.3 Configurazione di shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4339 380.4 Utenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4339 381 Script per la gestione dei pacchetti software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4341 381.1 Un sistema per gestire le installazioni tradizionali nella distribuzione Slackware 4341 381.2 Fare da sé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4346 4333 Capitolo 379 Monkey Monkey è una mini distribuzione realizzata da Milan Kerslager allo scopo di ottenere un sistema in grado di gestire il TCP/IP e la grafica attraverso X. È molto limitata, ma nel suo piccolo è fatta con cura, compresi dei piccoli accorgimenti per il riutilizzo dei file di scambio della memoria gestiti da MS-Windows. Nella sua limitatezza è comunque estremamente semplice da installare. Si compone di un gruppo di file compressi con ‘arj’, che costituiscono l’installazione base, assieme ad altri in formato tar+gzip che possono essere installati successivamente se lo si ritiene necessario. Volendo, con questi pacchetti aggiuntivi si arriva a un’installazione quasi completa. La distribuzione Monkey è raggiungibile a partire da <http://www.ibiblio.org/pub/Linux/distributions/ e dai suoi vari siti speculari. monkey/> 379.1 Installazione Per installare la distribuzione Monkey occorrono almeno i file compressi denominati ‘mlinux06. ’ e il programma di estrazione ‘ARJ.EXE’. I file possono essere copiati all’interno * di dischetti Dos, oppure risiedere in una directory del disco fisso. Negli esempi che seguono si suppone di avere copiato i file compressi nel disco fisso, nella directory ‘C:\INST\’. Per prima cosa viene creata la directory ‘C:\LINUX\’ che conterrà i file della distribuzione. C:\> MD C:\LINUX Quindi si passa nella directory in cui sono stati copiati i file compressi e da lì vengono estratti. C:\> CD C:\INST C:\INST> ARJ x -v -y MLINUX06 C:\LINUX Generalmente è tutto finito. 379.2 Avvio L’avvio della distribuzione Monkey installata in questo modo è molto semplice: basta avviare ‘LINUX.BAT’ che si trova in ‘C:\LINUX\’. C:\> CD C:\LINUX C:\LINUX> LINUX.BAT Se tutto è andato nel modo giusto, il sistema si avvia e si può accedere inizialmente come utente ‘root’, senza alcuna parola d’ordine. 379.3 Conclusione GNU/Linux non è come il Dos, anche quando risiede fisicamente in una partizione FAT. Prima di spegnere occorre eseguire la procedura necessaria, richiamandola attraverso il comando ‘shutdown’; questo deve essere fatto con i privilegi dell’utente ‘root’. # shutdown -h now 4334 Monkey 4335 379.4 Installazione dei pacchetti addizionali I pacchetti addizionali sono in formato tar+gzip (‘.tgz’), ma l’installazione è automatica: basta creare la directory ‘C:\LINUX\INSTALL\’ e copiarvi all’interno i pacchetti da installare. Al riavvio del sistema, questi vengono installati. 379.5 Configurazione Il sistema ottenuto dall’installazione della distribuzione Monkey non deve essere configurato. In pratica: o funziona così com’è o non serve. Questo significa che non si può pretendere di utilizzare questa mini distribuzione su un elaboratore che non corrisponde agli standard normali. In pratica si presuppone che l’elaboratore disponga di: • un microprocessore i386 o superiore; • un disco fisso ATA utilizzato senza compressione; • un eventuale lettore CD-ROM ATA/ATAPI; • memoria RAM per almeno 4 Mibyte; • un mouse seriale (compatibile Microsoft) connesso alla prima porta seriale; • un adattatore grafico VGA per l’uso del sistema grafico X. È in grado di individuare le schede di rete ISA più comuni: ‘3C5x9’, ‘3c59x’, ‘3c90x’, ‘NE2000/NE1000’, ‘WD80x3’. Le limitazioni che possono essere avvertite sono l’impossibilità di gestire unità SCSI (dischi fissi o lettori CD-ROM) e di accedere a lettori CD-ROM che utilizzano interfacce proprietarie. Per risolvere questi problemi occorrerebbe ricompilare il kernel oppure aggiungere dei moduli. Capitolo 380 Configurazione di una distribuzione Slackware La distribuzione Slackware è quella che utilizza il sistema di configurazione più semplice. Spesso si ha la necessità di modificare direttamente gli script. 380.1 Procedura di inizializzazione del sistema Si tratta di una serie di script di shell eseguiti direttamente o indirettamente attraverso le indicazioni contenute nel file ‘/etc/inittab’. La prima cosa da notare sono i livelli di esecuzione: • 0 arresto del sistema; • 1 singolo utente; • 3 multiutente; • 4 multiutente con login grafico; • 6 riavvio. Segue l’elenco dei file e delle directory che compongono la procedura di inizializzazione del sistema. • ‘/etc/rc.d/’ È la directory che raccoglie gli script utilizzati nella fase di avvio del sistema e in quella di arresto. • ‘/etc/rc.d/rc.S’ È lo script di inizializzazione del sistema. In particolare: – attiva lo scambio della memoria (solo sulle partizioni), in base al contenuto del file ‘/etc/fstab’; – avvia ‘update’ per automatizzare lo scarico periodico della memoria cache dei dischi; – avvia ‘kerneld’ per automatizzare il caricamento dei moduli del kernel; – verifica che il file system principale sia inizialmente in sola lettura; – se il file system principale è in sola lettura, ne esegue il controllo; – se vengono incontrati errori, attiva una shell su di una sola console (se si esce dalla shell, si riprende l’esecuzione dello script; – se è il caso, rimonta il file system principale in lettura-scrittura; – esegue il montaggio degli altri file system in base al contenuto di ‘/etc/fstab’, esclusi eventuali file system di rete, o NFS, perché la rete viene attivata più avanti; – configura l’orologio del sistema; – crea i file ‘/etc/issue’ (vedere ‘agetty’) e ‘/etc/motd’ in modo che rispecchino la versione in funzione del kernel Linux; – eventualmente esegue ‘/etc/rc.d/rc.modules’ per l’attivazione di moduli del kernel; – eventualmente esegue ‘/etc/rc.d/rc.pcmcia’ per l’attivazione di periferiche connesse attraverso porte PCMCIA; 4336 Configurazione di una distribuzione Slackware 4337 – eventualmente esegue ‘/etc/rc.d/rc.serial’ per l’attivazione della porta seriale. Lo script ‘/etc/rc.d/rc.S’ utilizza a sua volta altri file; quelli elencati di seguito. – ‘/etc/rc.d/rc.modules’ Script utilizzato da ‘/etc/rc.d/rc.S’ per caricare automaticamente i moduli del kernel necessari al proprio sistema. – ‘/etc/rc.d/rc.pcmcia’ Script utilizzato da ‘/etc/rc.d/rc.S’ per l’attivazione delle periferiche connesse attraverso porte PCMCIA. – ‘/etc/rc.d/rc.serial’ Script utilizzato da ‘/etc/rc.d/rc.S’ per l’attivazione delle porte seriali, in caso di utilizzo di terminali connessi con queste. • ‘/etc/rc.d/rc.0’ --> ‘/etc/rc.d/rc.6’ È lo script che viene eseguito quando si passa a un livello di esecuzione pari a ‘0’ (system halt) o ‘6’ (reboot). Elimina tutti i processi in esecuzione, esegue lo smontaggio di tutti i dischi e quindi ferma il sistema o lo riavvia a seconda che si tratti del livello di esecuzione ‘0’ o ‘6’. • ‘/etc/rc.d/rc.K’ È lo script che viene eseguito quando si passa a un livello di esecuzione pari a ‘1’: singolo utente, ovvero, livello amministrativo. Elimina tutti i processi dei demoni (la lettera ‘K’ sta per Kill) e mette il sistema in modalità monoutente. Di conseguenza, non viene eseguito alcun distacco di dischi. • ‘/etc/rc.d/rc.M’ È lo script che viene eseguito quando si passa a un livello di esecuzione da ‘2’ a ‘5’: multi utente. Fondamentalmente si occupa di eseguire altri script per il montaggio di dischi aggiuntivi, per l’attivazione della rete,... In particolare: – avvia ‘setterm’ in modo da definire l’oscuramento dello schermo dopo alcuni minuti di inattività; – esegue ‘/etc/rc.d/rc.cdrom’ per il montaggio del CD-ROM; – se manca il file ‘/etc/HOSTNAME’, lo crea, inserendovi un nome di dominio corrispondente a quello predefinito per la distribuzione; – assegna il nome all’elaboratore in base al contenuto di ‘/etc/HOSTNAME’; – esegue ‘/etc/rc.d/rc.inet1’ e ‘/etc/rc.d/rc.inet2’ per l’attivazione della rete; – avvia ‘/usr/sbin/crond’; – elimina i file di lock; – risistema i permessi delle directory più importanti; – esegue ‘ldconfig’ in modo da aggiornare il file ‘/etc/ld.so.cache’ con i collegamenti corretti alle librerie installate; – avvia il servente SMTP per la gestione della posta; – esegue eventualmente ‘/etc/rc.d/rc.font’ per la gestione dei caratteri del video; – esegue eventualmente ‘/etc/rc.d/rc.ibcs2’ per l’emulazione iBCS (Intel binary compatibility Specification); Configurazione di una distribuzione Slackware 4338 – esegue ‘/etc/rc.d/rc.keymap’ per cambiare la configurazione della tastiera in base alla nazionalità; – esegue eventualmente ‘/etc/rc.d/rc.httpd’ per l’avvio del servente HTTP; – esegue ‘/etc/rc.d/rc.local’ che è in pratica lo script finale lasciato alla configurazione personale; di solito contiene già l’attivazione del programma ‘gpm’ in background, per la gestione del mouse. Lo script ‘/etc/rc.d/rc.M’ utilizza a sua volta altri file, elencati di seguito. – ‘/etc/rc.d/rc.cdrom’ Script utilizzato da ‘/etc/rc.d/rc.M’ per eseguire automaticamente il montaggio del CD-ROM. Può creare più problemi che benefici. Al massimo è necessario quando si utilizza un file system ‘/usr’ da CD-ROM. – ‘/etc/rc.d/rc.inet1’ Permette di definire le caratteristiche della connessione in rete, oltre ad attivare le interfacce e definire gli instradamenti. Occorre modificare questo script per cambiare la configurazione di rete. – ‘/etc/rc.d/rc.inet2’ Attiva tutti i servizi di rete. Può essere modificato per eliminare o aggiungere servizi. – ‘/etc/rc.d/rc.local’ È lo script che viene eseguito per ultimo e può essere modificato per qualunque scopo, legato alla personalizzazione del proprio sistema. • ‘/etc/rc.d/rc.4’ È lo script che viene eseguito quando si passa a un livello di esecuzione pari a ‘4’: avvia ‘xdm’ in modo da ottenere una procedura di accesso grafica all’interno di X. • ‘/etc/rc.d/rc.n ’ Volendo definire delle modalità di funzionamento differenti da quelle predefiniti, si può creare un file ‘rc’ a partire da ‘rc.M’ o ‘rc.4’ e abbinandolo a un livello di esecuzione non utilizzato (due o cinque) all’interno del file ‘/etc/inittab’. 380.2 Configurazione della rete La distribuzione Slackware non utilizza file di configurazione per definire l’impostazione della rete. Questo obbliga praticamente alla modifica diretta degli script che si occupano di definire gli indirizzi, gli instradamenti e l’attivazione dei servizi. Si tratta di ‘/etc/rc.d/rc.inet1’ e ‘/etc/rc.d/rc.inet2’. Per la configurazione della rete viene fornito lo script ‘netconfig’ che crea ogni volta un nuovo file ‘/etc/rc.d/rc.inet1’. Questo però può andare bene solo per le situazioni normali, quando si ha una sola interfaccia di rete e un solo router. Se si decide di modificare direttamente il file ‘/etc/rc.d/rc.inet1’, è meglio fare sparire ‘netconfig’. Il file ‘/etc/HOSTNAME’ serve a contenere il nome dell’elaboratore (nome di dominio completo) in modo da poter definire questo nome per mezzo di ‘hostname’ durante la fase di inizializzazione del sistema. Naturalmente, un elaboratore può avere più nomi, tanti quante sono le interfacce di rete: se ne deve scegliere uno solo. Configurazione di una distribuzione Slackware 4339 380.3 Configurazione di shell Questa distribuzione fornisce solo i file di configurazione principali per le shell che permette di installare; non sono previste impostazioni predefinite per gli utenti. Per quanto riguarda la shell Bourne e quelle derivate, è disponibile il file ‘/etc/profile’ un po’ complicato a causa della necessità, in certi casi, di determinare il tipo di shell utilizzato effettivamente per stabilire l’azione corretta. 380.4 Utenti Utenti e gruppi vengono gestiti nel modo tradizionale, per cui la maschera dei permessi utilizzata normalmente è 0228. Per quanto riguarda l’utente e il gruppo ‘nobody’, è il caso di osservare che 65534 e -2 sono la stessa cosa. Lo script ‘adduser’ inserisce gli utenti a partire dal numero 500 in poi. 380.4.1 /etc/passwd halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/bin/bash root:x:0:0::/root:/bin/bash shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown sync:x:5:0:sync:/sbin:/bin/sync bin:x:1:1:bin:/bin: ftp:x:404:1::/home/ftp:/bin/bash daemon:x:2:2:daemon:/sbin: adm:x:3:4:adm:/var/adm: lp:x:4:7:lp:/var/spool/lpd: mail:x:8:12:mail:/var/mail: postmaster:x:14:12:postmaster:/var/mail:/bin/bash news:x:9:13:news:/usr/lib/news: uucp:x:10:14:uucp:/var/spool/uucppublic: man:x:13:15:man:/usr/man: games:x:12:100:games:/usr/games: guest:x:405:100:guest:/dev/null:/dev/null nobody:x:65534:100:nobody:/dev/null: 380.4.2 /etc/group root::0:root bin::1:root,bin,daemon daemon::2:root,bin,daemon sys::3:root,bin,adm adm::4:root,adm,daemon tty::5: disk::6:root,adm lp::7:lp mem::8: kmem::9: wheel::10:root floppy::11:root mail::12:mail news::13:news uucp::14:uucp man::15:man users::100:games nogroup::-2: 4340 Configurazione di una distribuzione Slackware Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 381 Script per la gestione dei pacchetti software 381.1 Un sistema per gestire le installazioni tradizionali nella distribuzione Slackware Quando si installa un programma distribuito in forma originale, quando cioè lo si deve prima compilare e poi installare nel modo previsto dall’autore, di solito non si ha la possibilità di disinstallarlo in un secondo momento. Gli strumenti forniti dalle distribuzioni Slackware permettono di installare e disinstallare in modo spartano i programmi, purché siano rispettate certe condizioni. Quando si installa un programma che prima deve essere compilato e poi installato attraverso uno script o un file-make fatti dall’autore, non è possibile fare in modo che il meccanismo dell’installazione Slackware ne diventi consapevole. Perché il programma installato possa essere disinstallabile attraverso gli strumenti Slackware, occorre creare per lui un file all’interno di ‘/var/log/packages/’ contenente l’elenco dei file che lo compongono. In questa sezione viene mostrato uno script da utilizzare per avviare le operazioni di installazione di un programma distribuito in forma normale, ovvero non nel modo previsto dalla distribuzione Slackware. Quando lo script viene avviato, memorizza la situazione del file system globale, quindi permette all’utente di svolgere le operazioni necessarie a compiere l’installazione e al termine confronta la nuova situazione del file system con quella precedente per determinare quali file siano stati aggiunti. In questo modo, viene poi aggiunta la descrizione di un nuovo pacchetto all’interno di ‘/var/log/packages/’. Lo script può essere utilizzato solo dall’utente ‘root’ ed è opportuno che durante il suo funzionamento non siano in corso altre attività, soprattutto, nessun’altra applicazione deve creare dei file. #!/bin/bash #====================================================================== # SlackwareTrace #====================================================================== #====================================================================== # Variabili. #====================================================================== #-----------------------------------------------------------------# Nome per un file temporaneo utilizzato per ricevere le risposte # all’esecuzione del comando «dialog --inputbox». #-----------------------------------------------------------------RISPOSTA="/tmp/risposta" #-----------------------------------------------------------------# Nome per un file temporaneo contenente l’elenco dei file presenti # nel file system PRIMA. #-----------------------------------------------------------------ELENCO_FILE_PRIMA="/tmp/elenco_PRIMA" #-----------------------------------------------------------------# Nome per un file temporaneo contenente l’elenco dei file presenti # nel file system DOPO. #-----------------------------------------------------------------ELENCO_FILE_DOPO="/tmp/elenco_DOPO" #-----------------------------------------------------------------# Nome per un file temporaneo contenente l’elenco dei file aggiunti # nel file system dopo le operazioni di installazione. #-----------------------------------------------------------------ELENCO_FILE_AGGIUNTI="/tmp/elenco_AGGIUNTI" 4341 4342 Script per la gestione dei pacchetti software #-----------------------------------------------------------------# Variabile utilizzata per ricevere i comandi. #-----------------------------------------------------------------COMANDO="" #-----------------------------------------------------------------# Variabile utilizzata per ricevere il nome del pacchetto. #-----------------------------------------------------------------PACCHETTO="" #-----------------------------------------------------------------# Variabile utilizzata per ricevere la descrizione del pacchetto. #-----------------------------------------------------------------DESCRIZIONE="" #-----------------------------------------------------------------# Variabile utilizzata per salvare il prompt. #-----------------------------------------------------------------SALVA_PROMPT=$PS1 #====================================================================== # Inizio. #====================================================================== #-----------------------------------------------------------------# Verifica la quantità di argomenti. #-----------------------------------------------------------------if [ $# != 0 ] then echo "Questo script è completamente interattivo e quindi non \ utilizza alcun argomento." exit 1 fi #-----------------------------------------------------------------# Verifica che l’utente sia ’root’. #-----------------------------------------------------------------if [ $UID != 0 ] then echo "Questo script può essere utilizzato solo dall’utente \ ’root’." exit 1 fi #-----------------------------------------------------------------# Salva la situazione del file system PRIMA. # Sono esclusi i percorsi «/tmp», «/proc» e «/mnt». #-----------------------------------------------------------------reset echo "---------------------------------------------------" echo "È in corso la scansione del file system per " echo "determinare la situazione iniziale dei file esistenti." echo "" echo "Attendere prego..." echo "---------------------------------------------------" find \ / -path "/proc" -prune -o -path "/tmp" -prune -o -path "/mnt" -prune \ -o -print | sort > $ELENCO_FILE_PRIMA #-----------------------------------------------------------------# Avvia una subshell per l’esecuzione dei comandi necessari # all’installazione. Si comincia dall’avvisare l’utente. #-----------------------------------------------------------------reset dialog --msgbox \ "Attenzione! Sta per essere avviata una subshell per\ \n\ l’esecuzione dei comandi necessari all’installazione\ \n\ del software.\ \n\ Di solito si tratta di eseguire qualcosa di molto simile\ Script per la gestione dei pacchetti software \n\ a ’make install’.\ \n\ \n\ Al termine si dovrà tornare allo script utilizzando\ \n\ il comando exit." \ 18 70 #-----------------------------------------------------------------# Modifica il prompt. #-----------------------------------------------------------------PS1=\ "Eseguire i comandi necessari a compiere l’installazione \ quindi utilizzare il comando exit per tornare allo script.\ \n\ $0>" export PS1 #-----------------------------------------------------------------# Avvia la subshell. #-----------------------------------------------------------------/bin/sh #-----------------------------------------------------------------# Ripristina il prompt. #-----------------------------------------------------------------PS1=$SALVA_PROMPT export PS1 #-----------------------------------------------------------------# Salva la situazione del file system DOPO. # Sono esclusi i percorsi «/tmp», «/proc» e «/mnt». #-----------------------------------------------------------------reset echo "---------------------------------------------------" echo "È in corso la scansione del file system per " echo "determinare la nuova situazione dei file esistenti." echo "" echo "Attendere prego..." echo "---------------------------------------------------" find \ / -path "/proc" -prune -o -path "/tmp" -prune -o -path "/mnt" -prune \ -print | sort > $ELENCO_FILE_DOPO #-----------------------------------------------------------------# Confronta i due file ed emette solo le righe del secondo elenco # che non appaiono nel primo. # Salva il risultato in un altro file temporaneo. #-----------------------------------------------------------------comm -13 \ $ELENCO_FILE_PRIMA $ELENCO_FILE_DOPO > $ELENCO_FILE_AGGIUNTI #-----------------------------------------------------------------# Verifica che il file generato non sia vuoto. #-----------------------------------------------------------------if [ -z "‘cat $ELENCO_FILE_AGGIUNTI‘" ] then #-------------------------------------------------------------# Non ha trovato alcun file in più rispetto alla # situazione precedente. Lo script avvisa e termina. #-------------------------------------------------------------reset dialog --msgbox \ "Non è stato aggiunto alcun file.\ \n\ Non verrà fatta alcuna registrazione di questa installazione." \ 7 70 exit 2 fi #-----------------------------------------------------------------# Richiede il nome del pacchetto. 4343 4344 Script per la gestione dei pacchetti software #-----------------------------------------------------------------while [ 0 ] # FOREVER do reset dialog --inputbox \ "Inserisci il nome da usare per identificare questo pacchetto.\ \n\ Per seguire la convenzione usata dalla procedura di installazione\ \n\ Slackware, si possono usare solo otto caratteri.\ \n\ Il nome del pacchetto servirà per creare un file contenere le\ \n\ informazioni sul pacchetto, di conseguenza, occorre rispettare le\ \n\ regole per i nomi dei file.\ \n\ \n\ \n\ <Ok> prosegue,\ \n\ <Cancel> ripete la richiesta." \ 17 70 2> $RISPOSTA #-------------------------------------------------------------# Controlla la risposta data dall’utente. #-------------------------------------------------------------if [ $? = 0 ] then #---------------------------------------------------------# La risposta è stata un OK e quindi prosegue. #---------------------------------------------------------PACCHETTO=‘cat $RISPOSTA‘ else #---------------------------------------------------------# La risposta è stata un CANCEL e quindi ripete il loop. #---------------------------------------------------------continue fi #-------------------------------------------------------------# Controlla che il nome non sia già utilizzato. #-------------------------------------------------------------if [ -e "/var/log/packages/$PACCHETTO" ] then #---------------------------------------------------------# Il nome esiste già. Ripete il loop. #---------------------------------------------------------reset dialog --msgbox \ "Attenzione! il nome $PACCHETTO è già stato usato.\ \n\ Se ne deve inserire un altro."\ 6 70 continue fi #-------------------------------------------------------------# Controlla che il nome sia accettabile tentando di creare # un file con quello. #-------------------------------------------------------------rm "/tmp/$PACCHETTO" echo "prova" > "/tmp/$PACCHETTO" #-------------------------------------------------------------# Se è riuscito a creare il file, tutto dovrebbe # essere in ordine. #-------------------------------------------------------------if [ -e "/tmp/$PACCHETTO" ] then Script per la gestione dei pacchetti software #---------------------------------------------------------# Il nome è valido. #---------------------------------------------------------echo "ok" > /dev/null else #---------------------------------------------------------# Il nome non è valido. Ripete il loop. #---------------------------------------------------------reset dialog --msgbox \ "Attenzione! il nome $PACCHETTO non è valido.\ \n\ Se ne deve inserire un altro." \ 7 70 continue fi #-------------------------------------------------------------# Se sono stati superati tutti gli ostacoli, il loop viene # interrotto. #-------------------------------------------------------------break done #-----------------------------------------------------------------# Finalmente è stato inserito il nome del pacchetto. # Si passa ora alla sua descrizione. #-----------------------------------------------------------------while [ 0 ] # FOREVER do reset dialog --inputbox \ "Inserisci una breve descrizione del pacchetto.\ \n\ \n\ \n\ <Ok> prosegue,\ \n\ <Cancel> ripete la richiesta." \ 12 70 2> $RISPOSTA #-------------------------------------------------------------# Controlla la risposta data dall’utente. #-------------------------------------------------------------if [ $? = 0 ] then #---------------------------------------------------------# La risposta è stata un OK e quindi prosegue. #---------------------------------------------------------DESCRIZIONE=‘cat $RISPOSTA‘ else #---------------------------------------------------------# La risposta è stata un CANCEL e quindi ripete il loop. #---------------------------------------------------------continue fi #-------------------------------------------------------------# Se sono stati superati tutti gli ostacoli, il loop viene # interrotto. #-------------------------------------------------------------break done #-----------------------------------------------------------------# Scrive il file del pacchetto. #-----------------------------------------------------------------echo "PACKAGE NAME: $PACCHETTO" > /var/log/packages/$PACCHETTO echo "COMPRESSED PACKAGE SIZE:" >> /var/log/packages/$PACCHETTO echo "UNCOMPRESSED PACKAGE SIZE:" >> /var/log/packages/$PACCHETTO echo "PACKAGE LOCATION:" >> /var/log/packages/$PACCHETTO 4345 4346 Script per la gestione dei pacchetti software echo "PACKAGE DESCRIPTION:" >> /var/log/packages/$PACCHETTO echo "$PACCHETTO: $DESCRIZIONE" >> /var/log/packages/$PACCHETTO echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO echo "FILE LIST:" >> /var/log/packages/$PACCHETTO cat $ELENCO_FILE_AGGIUNTI >> /var/log/packages/$PACCHETTO #-----------------------------------------------------------------# Avvisa l’utente della conclusione dell’operazione. #-----------------------------------------------------------------reset dialog --msgbox \ "La registrazione del pacchetto $PACCHETTO è terminata." \ 5 70 #====================================================================== # Fine. #====================================================================== Prima di poter eseguire uno script è importante attribuirgli i permessi di esecuzione necessari. chmod +x nome_del_file 381.2 Fare da sé Quando si utilizza una distribuzione GNU/Linux ben organizzata è un peccato pasticciarla con programmi o altri file installati nel modo tradizionale (‘make install’). In questa sezione si propone un semplice script fatto per tenere traccia di queste installazioni. Quando lo script viene avviato, memorizza la situazione del file system, quindi permette all’utente di svolgere le operazioni necessarie a compiere l’installazione e al termine confronta la nuova situazione del file system con quella precedente per determinare quali file siano stati aggiunti. In questo modo, viene poi aggiunta la descrizione di un nuovo pacchetto all’interno di ‘/var/ state/mypackages/’. Lo script può essere utilizzato solo dall’utente ‘root’ ed è opportuno che durante il suo utilizzo non siano in corso altre attività, soprattutto, nessun’altra applicazione deve creare dei file. #!/bin/bash #====================================================================== # traccia #====================================================================== #====================================================================== # Variabili. #====================================================================== #-----------------------------------------------------------------# Nome per un file temporaneo utilizzato per ricevere le risposte # all’esecuzione del comando «dialog --inputbox». #-----------------------------------------------------------------RISPOSTA="/tmp/risposta" #-----------------------------------------------------------------# Nome per un file temporaneo contenente l’elenco dei file presenti # nel file system PRIMA. #-----------------------------------------------------------------ELENCO_FILE_PRIMA="/tmp/elenco_PRIMA" #-----------------------------------------------------------------# Nome per un file temporaneo contenente l’elenco dei file presenti # nel file system DOPO. #------------------------------------------------------------------ Script per la gestione dei pacchetti software ELENCO_FILE_DOPO="/tmp/elenco_DOPO" #-----------------------------------------------------------------# Nome per un file temporaneo contenente l’elenco dei file aggiunti # nel file system dopo le operazioni di installazione. #-----------------------------------------------------------------ELENCO_FILE_AGGIUNTI="/tmp/elenco_AGGIUNTI" #-----------------------------------------------------------------# Variabile utilizzata per ricevere i comandi. #-----------------------------------------------------------------COMANDO="" #-----------------------------------------------------------------# Variabile utilizzata per ricevere il nome del pacchetto. #-----------------------------------------------------------------PACCHETTO="" #-----------------------------------------------------------------# Variabile utilizzata per ricevere la descrizione del pacchetto. #-----------------------------------------------------------------DESCRIZIONE="" #-----------------------------------------------------------------# Variabile utilizzata per salvare il prompt. #-----------------------------------------------------------------SALVA_PROMPT=$PS1 #====================================================================== # Inizio. #====================================================================== #-----------------------------------------------------------------# Verifica la quantità di argomenti. #-----------------------------------------------------------------if [ $# != 0 ] then dialog --msgbox \ "Questo script è completamente interattivo e quindi non \ \n\ utilizza alcun argomento." \ 6 70 exit 1 fi #-----------------------------------------------------------------# Verifica che l’utente sia ’root’. #-----------------------------------------------------------------if [ $UID != 0 ] then dialog --msgbox \ "Questo script può essere utilizzato solo dall’utente \ \n\ ’root’." \ 6 70 exit 1 fi #-----------------------------------------------------------------# Salva la situazione del file system PRIMA. # Sono esclusi i percorsi «/tmp», «/proc» e «/mnt». #-----------------------------------------------------------------reset dialog --infobox \ "È in corso la scansione del file system per \ \n\ determinare la situazione iniziale dei file esistenti. \ \n\ \n\ Attendere prego... \ " \ 6 70 find \ 4347 4348 Script per la gestione dei pacchetti software / -path "/proc" -prune -o -path "/tmp" -prune -o -path "/mnt" -prune \ -o -print | sort > $ELENCO_FILE_PRIMA #-----------------------------------------------------------------# Avvia una subshell per l’esecuzione dei comandi necessari # all’installazione. Si comincia dall’avvisare l’utente. #-----------------------------------------------------------------reset dialog --msgbox \ "Attenzione! Sta per essere avviata una subshell per\ \n\ l’esecuzione dei comandi necessari all’installazione\ \n\ del software.\ \n\ Di solito si tratta di eseguire qualcosa di molto simile\ \n\ a ’make install’.\ \n\ \n\ Al termine si dovrà tornare allo script utilizzando\ \n\ il comando exit." \ 12 70 #-----------------------------------------------------------------# Modifica il prompt. #-----------------------------------------------------------------PS1=\ "Eseguire i comandi necessari a compiere l’installazione \ quindi utilizzare il comando exit per tornare allo script.\ \n\ \w>" export PS1 #-----------------------------------------------------------------# Avvia la subshell. #-----------------------------------------------------------------/bin/sh #-----------------------------------------------------------------# Ripristina il prompt. #-----------------------------------------------------------------PS1=$SALVA_PROMPT export PS1 #-----------------------------------------------------------------# Salva la situazione del file system DOPO. # Sono esclusi i percorsi «/tmp», «/proc» e «/mnt». #-----------------------------------------------------------------reset dialog --infobox \ "È in corso la scansione del file system per \ \n\ determinare la nuova situazione dei file esistenti. \ \n\ \n\ Attendere prego... \ " \ 6 70 find \ / -path "/proc" -prune -o -path "/tmp" -prune -o -path "/mnt" -prune \ -o -print | sort > $ELENCO_FILE_DOPO #-----------------------------------------------------------------# Confronta i due file ed emette solo le righe del secondo elenco # che non appaiono nel primo. # Salva il risultato in un altro file temporaneo. #-----------------------------------------------------------------comm -13 \ $ELENCO_FILE_PRIMA $ELENCO_FILE_DOPO > $ELENCO_FILE_AGGIUNTI #------------------------------------------------------------------ Script per la gestione dei pacchetti software # Verifica che il file generato non sia vuoto. #-----------------------------------------------------------------if [ -z "‘cat $ELENCO_FILE_AGGIUNTI‘" ] then #-------------------------------------------------------------# Non ha trovato alcun file in più rispetto alla # situazione precedente. Lo script avvisa e termina. #-------------------------------------------------------------reset dialog --msgbox \ "Non è stato aggiunto alcun file.\ \n\ Non verrà fatta alcuna registrazione di questa installazione." \ 6 70 exit 2 fi #-----------------------------------------------------------------# Richiede il nome del pacchetto. #-----------------------------------------------------------------while [ 0 ] # FOREVER do reset dialog --inputbox \ "Inserisci il nome da usare per identificare questo pacchetto.\ \n\ \n\ Il nome del pacchetto servirà per creare un file contenere le\ \n\ informazioni sul pacchetto, di conseguenza, occorre rispettare le\ \n\ regole per i nomi dei file.\ \n\ \n\ \n\ <Ok> prosegue,\ \n\ <Cancel> ripete la richiesta." \ 16 70 2> $RISPOSTA #-------------------------------------------------------------# Controlla la risposta data dall’utente. #-------------------------------------------------------------if [ $? = 0 ] then #---------------------------------------------------------# La risposta è stata un OK e quindi prosegue. #---------------------------------------------------------PACCHETTO=‘cat $RISPOSTA‘ else #---------------------------------------------------------# La risposta è stata un CANCEL e quindi ripete il loop. #---------------------------------------------------------continue fi #-------------------------------------------------------------# Controlla che il nome non sia già utilizzato. #-------------------------------------------------------------if [ -e "/var/state/mypackages/$PACCHETTO" ] then #---------------------------------------------------------# Il nome esiste già. Ripete il loop. #---------------------------------------------------------reset dialog --msgbox \ "Attenzione! il nome $PACCHETTO è già stato usato.\ \n\ Se ne deve inserire un altro." \ 4349 4350 Script per la gestione dei pacchetti software 6 70 continue fi #-------------------------------------------------------------# Controlla che il nome sia accettabile tentando di creare # un file con quello. #-------------------------------------------------------------rm "/tmp/$PACCHETTO" touch "/tmp/$PACCHETTO" #-------------------------------------------------------------# Se è riuscito a creare il file, tutto dovrebbe # essere in ordine. #-------------------------------------------------------------if [ -e "/tmp/$PACCHETTO" ] then #---------------------------------------------------------# Il nome è valido. #---------------------------------------------------------echo "ok" > /dev/null else #---------------------------------------------------------# Il nome non è valido. Ripete il loop. #---------------------------------------------------------reset dialog --msgbox \ "Attenzione! il nome $PACCHETTO non è valido.\ \n\ Se ne deve inserire un altro." \ 6 70 continue fi #-------------------------------------------------------------# Se sono stati superati tutti gli ostacoli, il loop viene # interrotto. #-------------------------------------------------------------break done #-----------------------------------------------------------------# Finalmente è stato inserito il nome del pacchetto. # Si passa ora alla sua descrizione. #-----------------------------------------------------------------while [ 0 ] # FOREVER do reset dialog --inputbox \ "Inserisci una breve descrizione del pacchetto.\ \n\ \n\ \n\ <Ok> prosegue,\ \n\ <Cancel> ripete la richiesta." \ 12 70 2> $RISPOSTA #-------------------------------------------------------------# Controlla la risposta data dall’utente. #-------------------------------------------------------------if [ $? = 0 ] then #---------------------------------------------------------# La risposta è stata un OK e quindi prosegue. #---------------------------------------------------------DESCRIZIONE=‘cat $RISPOSTA‘ else #---------------------------------------------------------# La risposta è stata un CANCEL e quindi ripete il loop. #---------------------------------------------------------- Script per la gestione dei pacchetti software 4351 continue fi #-------------------------------------------------------------# Se sono stati superati tutti gli ostacoli, il loop viene # interrotto. #-------------------------------------------------------------break done #-----------------------------------------------------------------# Scrive i file del pacchetto. #-----------------------------------------------------------------echo "$DESCRIZIONE" > /var/state/mypackages/$PACCHETTO.descr cat $ELENCO_FILE_AGGIUNTI > /var/state/mypackages/$PACCHETTO #-----------------------------------------------------------------# Avvisa l’utente della conclusione dell’operazione. #-----------------------------------------------------------------reset dialog --msgbox \ "La registrazione del pacchetto \ \n\ $PACCHETTO \ \n\ è terminata." \ 7 70 #====================================================================== # Fine. #====================================================================== Prima di poter eseguire uno script è importante ricordare di attribuirgli i permessi di esecuzione necessari. chmod +x nome_del_file Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 4352 Script per la gestione dei pacchetti software Parte lxxxii Informazioni varie 382 Emulatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4354 382.1 WINE: l’emulatore MS-Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4354 382.2 Twin: un altro emulatore MS-Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4356 383 nanoRouter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4358 383.1 Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4358 383.2 Lo stretto indispensabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4358 383.3 Dimensioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4361 383.4 File system in sola lettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4361 384 X-ISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4362 385 Introduzione a SMB con GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4366 385.1 Nomi NetBIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4366 385.2 Trasporto TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4367 385.3 Servente SMB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4367 385.4 Cliente SMB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4372 385.5 Connessione con una rete NetBIOS-TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4374 385.6 Stampa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4377 385.7 Montare una risorsa di condivisione dei file nel file system GNU/Linux . . . . 4378 385.8 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4380 386 Applicazioni multimediali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4381 386.1 Wavplay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4381 386.2 Mpg123 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4383 386.3 8Hz-mp3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4383 386.4 Xanim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4384 387 Acua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4386 387.1 Organizzazione generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4386 387.2 Preparazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4389 387.3 Gestione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4395 387.4 Funzionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4403 387.5 Altra configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4406 Indice analitico del volume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4407 4353 Capitolo 382 Emulatori Su una piattaforma GNU/Linux è possibile utilizzare programmi realizzati per altri sistemi operativi, attraverso vari tipi di emulatori. In generale, questa emulazione può avvenire in due modi fondamentali: riproducendo il funzionamento dell’hardware di un tipo di elaboratore, oppure riproducendo interamente il funzionamento di un altro sistema operativo. La prima delle due scelte implica l’utilizzo successivo di un sistema operativo in grado di utilizzare l’emulatore hardware e con il quale si possono poi utilizzare altri programmi. La seconda, permette di utilizzare direttamente i programmi adatti al tipo di sistema operativo che viene emulato. Le implicazioni sulla differenza tra l’emulazione dell’hardware e quella di un sistema operativo sono sia tecniche che giuridiche. Se si emula l’hardware occorre poi procurarsi il sistema operativo e soprattutto la licenza di questo. Se si emula l’hardware spesso è necessario copiare da qualche parte il contenuto del firmware (programma su ROM) utilizzato nell’elaboratore da emulare. Ma questo, nella maggior parte dei casi, è un’azione illegale (anche se non si sente parlare di cause contro azioni di questo genere). 382.1 WINE: l’emulatore MS-Windows WINE è un programma che permette di eseguire programmi realizzati per MS-Windows all’interno dell’ambiente grafico X. WINE è quindi un emulatore di MS-Windows. Nel momento in cui si scriveva questo capitolo, WINE era in grado di fare funzionare (senza però alcuna sicurezza) solo alcuni programmi realizzati per MS-Windows 3.1. Per poter utilizzare WINE potrebbero essere necessari alcuni componenti di MS-Windows 3.1 (delle librerie). In tal caso, oltre che esserci bisogno di una copia di MS-Windows 3.1 è necessaria anche una licenza d’uso. Lo sviluppo di WINE può essere seguito presso l’URI <http://www.linpro.no/wine/>. 382.1.1 Predisporre un ambiente adatto ai programmi per WINE Dal momento che i programmi realizzati per MS-Windows sono stati pensati per lo più per funzionare su un file system di tipo FAT, sarebbe consigliabile di riservare loro una partizione di questo tipo. Tuttavia, potrebbe essere molto più affascinante l’idea di incorporare tutto all’interno del file system di GNU/Linux e in questo senso sono realizzati gli esempi seguenti. 382.1.2 Un disco C: virtuale In questa fase conviene preparare una directory che servirà per definire l’inizio (la radice) del disco ‘C:’ virtuale utilizzato dai programmi per MS-Windows. Stabiliamo che questo sia ‘/var/ emul/windows/’. Da questo punto in poi, ‘C:\’ è equivalente a ‘/var/emul/windows/’. 4354 Emulatori 4355 382.1.3 La struttura essenziale del disco C: virtuale Il disco ‘C:’ virtuale dovrebbe contenere alcune directory che riproducono in pratica il classico ambiente DOS-Windows: • ‘C:\TEMP\’ equivalente a ‘/var/emul/windows/temp/’; • ‘C:\WINDOWS\’ equivalente a ‘/var/emul/windows/windows/’; • ‘C:\WINDOWS\SYSTEM\’ equivalente a ‘/var/emul/windows/windows/system/’. Per evitare la proliferazione di directory temporanee, è possibile utilizzare al posto di ‘/var/ emul/windows/temp/’ un collegamento simbolico che punti a ‘/tmp/’. # ln -s /tmp /var/emul/windows/temp Una volta preparata la struttura essenziale occorre inserire alcuni file. All’interno di ‘/var/emul/windows/windows/’ (‘C:\WINDOWS\’) si devono preparare alcuni file ‘.INI’ vuoti. Si tratta di ‘WIN.INI’ e di ‘SYSTEM.INI’. # touch /var/emul/windows/windows/win.ini # touch /var/emul/windows/windows/system.ini All’interno di ‘/var/emul/windows/windows/system/’ (‘C:\WINDOWS\SYSTEM\’) potrebbe essere necessario collocare alcuni file di libreria provenienti da una versione originale di MSWindows 3.1 (come già spiegato, questo implica la necessità di avere una licenza d’uso per MS-Windows 3.1). Probabilmente, i file seguenti sono indispensabili. • ‘COMMDLG.DLL’ • ‘CTL3DV2.DLL’ • ‘DDEML.DLL’ • ‘LZEXPAND.DLL’ • ‘OLECLI.DLL’ • ‘VBRUN300.DLL’ 382.1.4 La configurazione di WINE Il file ‘/etc/wine.conf’ deve essere predisposto prima di poter eseguire alcuna emulazione. L’esempio seguente fa riferimento alla struttura di directory vista in precedenza. In particolare, all’interno di GNU/Linux, il dischetto viene montato nella directory ‘/mnt/a/’. [Drive A] Path=/mnt/a Type=floppy [Drive C] Emulatori 4356 Path=/var/emul/windows Label=ext2fs [Drive D] Path=${HOME} [wine] windows=c:\windows system=c:\windows\system temp=c:\temp path=c:\windows;c:\windows\system symboltablefile=./wine.sym [serialports] com1=/dev/cua1 com2=/dev/cua2 [parallelports] lpt1=/dev/lp1 [spy] ;File=CON ;File=spy.log Exclude=WM_TIMER;WM_SETCURSOR;WM_MOUSEMOVE;WM_NCHITTEST; Include=WM_COMMAND; 382.1.5 L’esecuzione di un programma Per mettere in esecuzione un programma attraverso WINE è necessario avviare prima l’ambiente grafico (di solito attraverso ‘startx’), quindi aprire una finestra di terminale e da lì eseguire il comando seguente: wine [opzioni] programma_completo_di_percorso Per esempio, per avviare il file ‘PFE.EXE’ che si trova all’interno di ‘C:\PFE\’ si eseguirà: $ wine "c:\pfe\pfe" oppure la riga seguente: $ wine /var/emul/windows/pfe/pfe.exe 382.1.6 Implicazioni sulla gestione dei permessi WINE si comporta in maniera analoga a DOSEMU per quanto riguarda il problema della gestione dei permessi dei file e delle directory. Valgono quindi le stesse considerazioni fatte a questo proposito nella sezione 343.3.7. 382.2 Twin: un altro emulatore MS-Windows Twin, ovvero Willows Twin Libraries, è un sistema di emulazione che permette di eseguire programmi realizzati per MS-Windows all’interno dell’ambiente grafico X. Si tratta di un progetto parallelo a WINE; Twin, in particolare, ha il vantaggio di fornire al programma utilizzato un livello di astrazione superiore rispetto a quanto fatto da WINE, per cui i programmi funzionano in finestre normali di X. La cosa più importante è che non serve alcun componente originale di MS-Windows: tutte le librerie principali sono emulate. Emulatori <http://www.willows.com> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 4357 Capitolo 383 nanoRouter nanoRouter è un lavoro che riguarda la prima edizione di nanoLinux e non è più curato. Questo capitolo è obsoleto e viene lasciato per documentare il funzionamento di questo dischetto che viene ancora distribuito con Appunti di informatica libera. L’inoltro dei pacchetti da un’interfaccia di rete a un’altra, in un router, è compito del kernel: è sufficiente che gli venga fornita la configurazione delle interfacce e la tabella di instradamento. Teoricamente dovrebbe essere possibile compilare un kernel con questi valori già registrati al suo interno, in pratica conviene utilizzare il modo tradizionale di configurazione attraverso i programmi ‘ifconfig’ e ‘route’. Un dischetto di emergenza, in grado di accedere alle interfacce di rete, con un kernel adatto e con questi due programmi, è in grado di funzionare come router. Ciò vale quindi sia per nanoLinux che per i dischetti di emergenza della distribuzione Slackware. In questo capitolo si descrive in che modo ottenere un sistema estremamente ridotto in grado di eseguire l’inoltro di pacchetti da un’interfaccia di rete a un’altra. 383.1 Kernel Come già accennato, il kernel deve consentire l’inoltro dei pacchetti. Per le altre caratteristiche valgono tutte le considerazioni già fatte al riguardo dei dischetti di emergenza. 383.2 Lo stretto indispensabile La funzione di inoltro è svolta dal kernel e, a meno di essere abili programmatori, è necessario utilizzare ‘ifconfig’ e ‘route’ per configurare le interfacce e definire gli instradamenti. Questi programmi, a loro volta, hanno bisogno di librerie. I programmi, per essere avviati hanno bisogno dell’eseguibile ‘init’, oppure, in alternativa, di una shell che possa eseguire uno script. Nell’esempio proposto non si fa uso di ‘init’: con un piccolo trucco si avvia direttamente la shell ‘ash’ in modo interattivo, così da leggere ed eseguire il file ‘/etc/profile’ contenente le istruzioni per la configurazione delle interfacce e la definizione degli instradamenti. Rispetto ai dischetti di emergenza normali si pone un nuovo problema: l’identificazione delle interfacce di rete quando queste sono più di una. Infatti, il kernel smette di cercare altre interfacce dopo che ne ha trovata una. Ciò costringe in pratica a utilizzare LILO, attraverso il quale si possono definire le istruzioni che il kernel deve ricevere all’avvio (attraverso queste istruzioni può essere informato della presenza di altre schede di rete). L’esempio mostrato è stato realizzato con file binari e librerie di una vecchia distribuzione Slackware 3.1. Le restrizioni che si impongono allo scopo di realizzare un dischetto unico, non compresso, in sola lettura, rendono praticamente impossibile l’utilizzo di programmi e librerie più recenti. 4358 nanoRouter 4359 383.2.1 Struttura di nanoRouter Il dischetto nanoRouter si ottiene partendo da nanoLinux I eliminando molte cose e aggiungendone poche altre. In particolare, si nota subito l’utilizzo di ‘ash’ al posto di ‘bash’ e la totale assenza della procedura di inizializzazione del sistema. Il programma ‘/sbin/init’ è scomparso, al suo posto c’è un collegamento simbolico speciale che avvia ‘ash’ con l’opzione ‘-i’: in questo modo, quando il kernel tenta di avviare ‘init’, avvia invece una shell interattiva che, come tale, esegue il contenuto di ‘/etc/profile’. Anche ‘/sbin/ldconfig’ è un collegamento simbolico: avvia uno script che restituisce semplicemente il valore Vero. Questo programma viene avviato automaticamente e non può mancare (anche se di fatto non serve). I file di dispositivo contenuti all’interno di ‘/dev/’ sono ridotti al minimo, in pratica ci sono i dispositivi di gestione della console e poco altro. L’ultima cosa da notare è la presenza della directory ‘/boot/’ contenente il kernel e i file di avvio di LILO. / |-| | | | |-| | | | | |-| | | | | | | | | | |-| | | | |-| | | | | | | | | |-|-|-| | | bin |-- ash |-- ping |-- sh -> ash ‘-- sync boot |-- .config |-- boot.0200 |-- boot.b |-- map ‘-- vmlinuz dev |-- log |-- null |-- systty |-- tty |-- tty0 |-- tty1 |-- tty2 |-- tty3 |-- tty4 ‘-- zero etc |-- ld.so.cache |-- lilo.conf |-- profile ‘-- protocols lib |-- ld-linux.so -> ld-linux.so.1 |-- ld-linux.so.1 -> ld-linux.so.1.8.2 |-- ld-linux.so.1.8.2 |-- libc.so.5 -> libc.so.5.3.12 |-- libc.so.5.3.12 |-- libcom_err.so.2 -> libcom_err.so.2.0 |-- libcom_err.so.2.0 |-- libtermcap.so.2 -> libtermcap.so.2.0.8 ‘-- libtermcap.so.2.0.8 mnt proc sbin |-- ifconfig |-- init -> ../bin/ash -i |-- ldconfig -> true 4360 | | | |-|-‘-- nanoRouter |-- route |-- true ‘-- update tmp usr var 383.2.2 Collegamento con argomento Creare un collegamento simbolico con un argomento non è possibile attraverso il solito programma ‘ln’. Se non si riesce, si può creare un collegamento simbolico normale, ma poi, occorre avviare manualmente l’esecuzione del file ‘profile’. Attraverso ‘mc’ (Midnight Commander) è possibile modificare un collegamento simbolico scrivendoci quello che si vuole. Basta richiamare la voce edit sYmlink dal menù File, oppure utilizzare la sequenza [ Ctrl+x ][ Ctrl+s ]. 383.2.3 /etc/profile Il file ‘/etc/profile’, in questo tipo di impostazione, è l’unico mezzo di configurazione. La configurazione delle interfacce di rete e la definizione degli instradamenti avvengono all’interno di questo file. PATH="/sbin:/bin:." TERM=linux PS1=’# ’ PS2=’> ’ ignoreeof=10 export PATH TERM PS1 PS2 ignoreeof umask 022 /sbin/ifconfig eth0 192.168.1.254 netmask 255.255.255.0 /sbin/ifconfig plip1 192.168.2.254 pointopoint 192.168.2.1 /sbin/route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0 /sbin/route add -host 192.168.2.1 dev plip1 ifconfig 383.2.4 /boot/ Come già accennato, esiste l’esigenza di comunicare al kernel l’esistenza di diverse schede di rete (altrimenti si può forse usare solo la porta parallela come seconda interfaccia di rete). Serve quindi il sistema di avvio LILO. Il modo con cui è possibile ottenere un dischetto contenente LILO è descritto nella sezione 18.4. Il contenuto del file di esempio si riferisce in particolare ai parametri delle schede NE2000. # /etc/lilo.conf boot=/dev/fd0 map=/boot/map install=/boot/boot.b image=/boot/vmlinuz label=router root=/dev/fd0 read-only append="ether=0,0x300,eth0 ether=0,0x320,eth1 ether=0,0x340,eth2" Vale la pena di notare che il file system principale viene attivato in sola lettura e non viene mai riportato in lettura-scrittura. nanoRouter 4361 383.3 Dimensioni Tutto quanto, compreso il kernel, dovrebbe essere contenibile all’interno di un dischetto da 1440 Kibyte, senza alcuna compressione. In questo modo non c’è la necessità di utilizzare un disco RAM e anche un elaboratore con poca memoria potrebbe svolgere degnamente questo compito (senza bisogno di una laboriosa configurazione). 383.4 File system in sola lettura Il fatto che si riesca a operare senza eseguire scritture sul disco, pur non utilizzando un disco RAM, permette di non dover temere cadute di tensione o errori umani: Quando non serve più, basta spegnere. Resta un problema dovuto al fatto che il kernel, una volta caricato in memoria, richiede la pressione del tasto [ Invio ] prima di attivare il file system principale. Ciò impedisce un avvio automatico. Utilizzando una piccola partizione di un disco fisso, la richiesta di scambiare i dischetti non viene più fatta. 383.4.1 File system /proc Il fatto di utilizzare il dischetto in sola lettura impedisce il montaggio del file system ‘/proc/’ e di conseguenza i programmi ne risentono. Questo è il motivo principale per cui non si riesce a realizzare questo dischetto con programmi derivanti da distribuzioni GNU/Linux recenti. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 384 X-ISP X-ISP a utilizza la libreria grafica XForms appartiene al «software libero». a b b (‘libforms.so.*’). Questa libreria non X-ISP GNU GPL, ma usa una libreria non libera XForms software non libero, gratuito per uso «non commerciale» X-ISP è un programma frontale (front-end) per la connessione PPP attraverso un modem, utilizzando in pratica il demone ‘pppd’. È facile da configurare ed è particolarmente adatto a chi si trova impacciato nella realizzazione di uno script per questo scopo. xisp [opzioni] Generalmente deve essere avviato con i privilegi dell’utente ‘root’. Se si vuole raggirare il problema, a discapito della sicurezza, per permettere il suo utilizzo anche agli utenti comuni, occorre intervenire su alcuni file, dando i permessi di esecuzione per tutti i tipi di utente e attivando il bit SUID. I file sono: • ‘xisp’, collocato normalmente in ‘/usr/X11R6/bin/’; • ‘xispdial’, collocato normalmente in ‘/usr/sbin/’. Naturalmente, occorre intervenire anche su ‘/usr/sbin/pppd’, come era già stato descritto in precedenza. chmod a+x file chmod u+s file X-ISP permette di definire configurazioni differenti anche in funzione di possibili diversi ISP a cui ci si collega. La configurazione avviene attraverso finestre di dialogo e non c’è la necessità di agire manualmente all’interno di file. La figura 384.1 mostra la maschera principale attraverso cui si controlla la connessione. Figura 384.1. La maschera principale di X-ISP. La configurazione del programma avviene attraverso le funzioni contenute nel menù Options. La prima cosa da fare è dare un nome a una configurazione; la funzione si chiama ISP Selection e 4362 X-ISP 4363 in pratica si tratta di definire il nome dell’ISP a cui si abbinano le scelte che vengono fatte con le voci successive. La figura 384.2 mostra la maschera della funzione ‘Account Information’. In questa fase viene indicato solo il modo con cui l’utente accede (il numero di telefono) e si fa riconoscere dall’elaboratore remoto. Attraverso X-ISP è possibile anche definire i segreti per un’autenticazione PAP e CHAP (anche se non si vede dalle figure). Negli esempio si mostra l’uso di X-ISP per un’autenticazione tradizionale, manuale, attraverso l’uso di un terminale. Figura 384.2. La maschera di definizione dell’accesso presso l’elaboratore remoto. In questo caso, l’autenticazione PAP è disabilitata. Se si usa un’autenticazione tradizionale, è possibile definire le coppie di attesa e invio per automatizzare l’accesso, come si vede nella figura 384.3, dove viene mostrata la maschera Dialing and Login con cui si possono determinare il numero di tentativi (in caso di mancata risposta o di segnale di occupato) e il tipo di procedura di accesso: automatica o attraverso una finestra di terminale. Figura 384.3. La procedura di accesso può essere automatica, attraverso coppie di attesa e invio, o manuale con una finestra di terminale. In questo caso si utilizza una procedura di accesso manuale. La maschera Communication Options permette di definire le caratteristiche della connessione per quanto riguarda il rapporto tra l’elaboratore e il modem e tra il modem locale e quello remoto. In particolare, la stringa di inizializzazione facoltativa dovrebbe contenere solo comandi ritenuti essenziali, come nell’esempio mostrato in figura 384.4 in cui ci si limita a indicare ATX3. È importante evitare di indicare comandi più drastici come sarebbe nel caso di ATZ, o peggio X-ISP 4364 AT&F, perché ciò potrebbe annullare altre impostazioni particolari già definite da X-ISP. Figura 384.4. La configurazione del modem. Infine, restano da definire le opzioni della connessione TCP/IP. Difficilmente si riesce a ottenere dal proprio ISP un indirizzo IP statico, di conseguenza, l’indirizzo locale e quello remoto restano azzerati in modo da permettere l’assegnazione dinamica. Generalmente, in una connessione punto-punto, la maschera di rete dovrebbe essere 255.255.255.255. È importante ricordare di fare in modo che l’instradamento verso l’elaboratore remoto diventi anche quello predefinito (defaultroute), altrimenti si resterebbe bloccati all’ambito della coppia costituita dall’elaboratore locale e dall’elaboratore dell’ISP. Figura 384.5. L’impostazione riferita alla connessione TCP/IP. Probabilmente è più corretta una maschera di rete 255.255.255.255. Con questo tipo di configurazione, quando ci si connette all’ISP, si ottiene una finestra di terminale, come nella figura 384.6, successivamente, al termine dell’autenticazione si deve fare un clic sul pulsante di continuazione. Da quel momento la connessione è attivata fino a quando non si conclude selezionando il pulsante D I S C O N N E C T dalla finestra di dialogo principale. X-ISP 4365 Figura 384.6. Il terminale di X-ISP per la procedura di accesso manuale. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 385 Introduzione a SMB con GNU/Linux Questo capitolo nasce da esperienze dell’autore fatte nel 1997 e, oltre che essere obsoleti, gli esempi mostrati ignorano completamente i problemi legati alla sicurezza. In tal senso, eventualmente, questo capitolo può essere utile solo come punto di inizio per lo studio del protocollo SMB. SMB, o Session message block, è il protocollo di condivisione di risorse conosciuto normalmente come NetBIOS o LanManager. Il protocollo NetBIOS può utilizzare diversi tipi di protocolli di trasporto: NetBEUI, IPX/SPX e TCP/IP. In pratica, viene incapsulato all’interno di uno di questi. È importante non confondere NetBIOS con NetBEUI: il primo è il protocollo di condivisione di risorse, il secondo è un protocollo di trasporto. GNU/Linux è in grado di offrire servizi NetBIOS attraverso il protocollo di trasporto TCP/IP e questo per mezzo del gruppo di programmi denominato Samba. 1 La limitazione di GNU/Linux nell’utilizzo del trasporto TCP/IP per questo scopo, deve essere tenuta presente nella configurazione degli elaboratori con cui si vuole comunicare attraverso NetBIOS (il trasporto NetBEUI non va bene). Samba fa ormai parte della maggior parte delle distribuzioni GNU/Linux. In questo capitolo si fa riferimento a una versione di Samba installata attraverso una distribuzione, in modo tale che la collocazione dei file sia conforme alle indicazioni del file system standard di GNU/Linux. 385.1 Nomi NetBIOS Il protocollo NetBIOS viene usato per la condivisione di risorse. Quando lo si utilizza, è necessario identificare l’elaboratore che offre il servizio e la particolare risorsa desiderata. Sotto questo aspetto, con NetBIOS non si parla di nodi, ma direttamente di serventi, clienti o peer. Il nome che identifica una risorsa di un servente particolare, ha il formato seguente: \\servente \risorsa Il nome del servente e quello della risorsa non tengono conto della differenza tra lettere maiuscole e minuscole. Per esempio, ‘\\TIZIO\VARIE’ rappresenta la risorsa ‘VARIE’ dell’elaboratore ‘TIZIO’. Quando si utilizza un servente SMB, come Samba, all’interno di un sistema Unix, i nomi di dominio utilizzati per il trasporto IP non hanno niente a che vedere con i nomi NetBIOS, anche se normalmente coincidono. Quando si deve indicare un indirizzo del genere con una shell Unix, si ha quasi sempre la necessità di proteggere le barre oblique inverse da una diversa interpretazione. Lo si vedrà meglio negli esempi descritti più avanti. 1 Samba GNU GPL 4366 Introduzione a SMB con GNU/Linux 4367 385.2 Trasporto TCP/IP Come accennato, Samba comunica con NetBIOS attraverso il protocollo TCP/IP. Per questo, il file ‘/etc/services’ deve contenere le righe seguenti. netbios-ns netbios-ns netbios-dgm netbios-dgm netbios-ssn 137/tcp 137/udp 138/tcp 138/udp 139/tcp nbns nbns nbdgm nbdgm nbssn # NetBIOS Name Service # NetBIOS Datagram Service # NetBIOS session service 385.3 Servente SMB Un servente SMB (o NetBIOS) permette di offrire la condivisione di parte del proprio file system, come avviene con il protocollo NFS, e dei propri servizi di stampa. In pratica, esattamente quello che si può fare con MS-Windows 3.11 e con le edizioni successive. I servizi sono forniti da due demoni: ‘smbd’ e ‘nmbd’. Questi utilizzano il file ‘smb.conf’, collocato normalmente nella directory ‘/etc/’, per la loro configurazione. ‘smbd’ e ‘nmbd’ possono essere avviati direttamente dalla procedura di inizializzazione del sistema (Init), oppure possono essere messi sotto il controllo del supervisore dei servizi di rete. Nel primo caso, possono essere avviati nel modo seguente: # smbd -D # nmbd -D Se invece si intende utilizzare il controllo del supervisore dei servizi di rete, devono essere presenti le righe seguenti nel file ‘/etc/inetd.conf’. netbios-ssn netbios-ns stream dgram tcp udp nowait wait root root /usr/sbin/smbd smbd /usr/sbin/nmbd nmbd 385.3.1 # nmbd nmbd [opzioni] È il demone del servizio necessario per la gestione del name server ‘netbios’, per le connessioni SMB (Samba). A seconda di come è gestita la distribuzione GNU/Linux che si utilizza, potrebbe essere avviato direttamente dalla procedura di inizializzazione del sistema, oppure dal supervisore dei servizi di rete (capitolo 135). Alcune opzioni -D Viene avviato come demone. Se non si usa questa opzione, il programma ‘nmbd’ funziona in modo normale. Quando si utilizza ‘nmbd’ in uno script della procedura di inizializzazione del sistema, si utilizza questa opzione. Introduzione a SMB con GNU/Linux 4368 385.3.2 # smbd smbd [opzioni] È il demone del servizio necessario per ricevere connessioni SMB (Samba). A seconda di come è gestita la particolare distribuzione GNU/Linux che si utilizza, potrebbe essere avviato direttamente dalla procedura di inizializzazione del sistema, oppure dal supervisore dei servizi di rete (capitolo 135). Alcune opzioni -D Viene avviato come demone. Se non si usa questa opzione, il programma ‘smbd’ funziona in modo normale. Quando si utilizza ‘smbd’ in uno script della procedura di inizializzazione del sistema, si utilizza questa opzione. 385.3.3 Utente generico Il protocollo NetBIOS viene usato spesso per condividere dischi e stampanti senza alcun controllo sugli utenti. Perché possa esistere questa possibilità anche con Samba, è necessario definire un utente fittizio che verrà utilizzato come riferimento quando l’accesso avviene per servizi pubblici, o anonimi. Per questo, conviene aggiungere manualmente al file ‘/etc/passwd’ una riga simile a quella seguente: guestpc::499:100::/dev/null:/dev/null Come si può vedere, si tratta di un utente senza parola d’ordine, senza directory personale e senza shell. È bene tenere presente che questa situazione, eventualmente, potrebbe essere pericolosa per la sicurezza del sistema in generale e, comunque, il fatto di mettere a disposizione un accesso del genere manifesta l’intenzione di non curarsi di questi problemi. Il nome ‘guestpc’ è scelto in base al valore predefinito da Samba per questo scopo. In altre situazioni potrebbe anche corrispondere al tipico utente ‘nobody’. Il numero usato come UID va scelto in modo che non coincida con altri contenuti all’interno del file ‘/etc/passwd’ (a meno che si sappia ciò che si intende fare); per quanto riguarda la scelta del GID (il numero del gruppo), questo dipende dalle particolari strategie adottate nella gestione degli utenti.2 385.3.4 Directory condivisa Così come si utilizza un utente particolare per gli accessi non controllati, è opportuno predisporre una directory a disposizione di tutti, attribuendole tutti i permessi necessari. Trattandosi di uno spazio nel file system abbinato a un utente, anche se fittizio, è ragionevole collocare i file e le directory da condividere pubblicamente a partire da ‘/home/samba/’. # mkdir /home/samba # chmod a+rwx /home/samba 2 Per esempio, potrebbe essere abbinato a un gruppo omonimo ‘guestpc’, o simile. Introduzione a SMB con GNU/Linux 4369 385.3.5 Coda di stampa Per soddisfare le richieste di stampa, è necessaria la presenza di una coda, costituita da una directory. Normalmente si tratta di ‘/var/spool/samba/’. Anche in questo caso, non si devono porre restrizione nei permessi. # mkdir /var/spool/samba # chmod a+rwx /var/spool/samba 385.3.6 /etc/smb.conf La configurazione attraverso ‘/etc/smb.conf’ è delicata. Negli esempi seguenti si propone il minimo necessario a condividere pubblicamente uno spazio su disco e una stampante. Solitamente, le distribuzioni propongono un file più completo e ben commentato. ; ===================================================================== ; /etc/smb.conf ; ===================================================================== ; [global] allow hosts = 192.168.1.0/255.255.255.0 workgroup = UFFICIO guest account = guestpc printing = bsd printcap name = /etc/printcap [public] comment = directory pubblica path = /home/samba public = yes writable = yes printable = no browseable = yes [lp] comment = stampante pubblica path = /var/spool/samba public = yes writable = no printable = yes browseable = yes [global] La sezione ‘global’ è speciale e serve per stabilire i valori predefiniti per tutte le altre sezioni. allow hosts = indirizzo_ip /maschera Permette di definire i nodi che possono accedere ai servizi di Samba. In questo caso si concede a tutta la sottorete 192.168.1.0 di accedere. workgroup = nome_del_gruppo Permette di definire il nome del gruppo di lavoro. Il valore predefinito, nel caso non sia indicato, dovrebbe essere ‘WORKGROUP’ a seconda di come è stato compilato il sorgente. guest account = utente_guest Permette di definire il nome di un utente generico, al quale è consentito utilizzare i servizi pubblici. Questo utente era stato aggiunto al file ‘/etc/passwd’ (385.3.3). Introduzione a SMB con GNU/Linux 4370 printing = bsd Assegnando a questa variabile il valore ‘bsd’ si informa Samba che il sistema di stampa utilizza il programma ‘lpr’. printcap name = file_printcap Il nome del file ‘/etc/printcap’, completo del percorso. [public] Si tratta della definizione di un servizio denomianto ‘public’ creato per permettere l’accesso indiscriminato alla directory ‘/home/samba’. comment = commento Si tratta della descrizione del servizio. path = percorso_della_directory È il percorso della directory pubblica. Perché possa essere disponibile veramente a tutti, occorre che i suoi permessi di accesso consentano tutte le operazioni a tutti gli utenti. public = {yes|no} Permette di definire se si tratta o meno di un servizio pubblico. writable = {yes|no} Permette di definire se gli utenti di questo servizio possono accedere anche in scrittura. printable = {yes|no} Permette di definire se si tratta di un servizio di stampa. In questo caso, evidentemente no. [lp] Si tratta della definizione di un servizio denomianto ‘lp’ creato per permettere l’accesso indiscriminato alla stampante omonima (‘lp’) del file ‘/etc/printcap’. In pratica rende pubblica, attraverso Samba, questa stampante. path = percorso_della_directory Definisce il percorso della directory che Samba userà per accodare le stampe. Non si deve confondere questa directory con quelle già utilizzate con il sistema di stampa normale, questo perché si deve trattare di una directory accessibile a tutti. public = {yes|no} Permette di definire se si tratta o meno di un servizio pubblico. writable = {yes|no} Permette di definire se gli utenti di questo servizio possono accedere anche in scrittura. In questo caso no, trattandosi di un servizio di stampa. printable = {yes|no} Permette di definire se si tratta di un servizio di stampa. Introduzione a SMB con GNU/Linux 4371 385.3.7 Verifica del funzionamento Per controllare la correttezza sintattica del file di configurazione ‘/etc/smb.conf’ si può utilizzare il programma ‘testparm’. $ testparm[ Invio ] Si dovrebbe ottenere un elenco suddiviso in due parti. Segue solo la prima parte. Load smb config files from /etc/smb.conf Processing section "[public]" Loaded services file OK. Press enter to see a dump of your service definitions Premendo [ Invio ] si ottiene il resto delle informazioni che riguardano la configurazione, così come è stata interpretata, completa di tutti i valori predefiniti. Il passo successivo è quello di controllare che il servizio sia funzionante effettivamente. Se l’elaboratore che si utilizza e sul quale è installato Samba, si chiama dinkel.brot.dg, si può utilizzare il programma ‘smbclient’ nel modo seguente: $ smbclient -L dinkel.brot.dg[ Invio ] Si dovrebbe ottenere il risultato seguente: Added interface ip=192.168.1.1 bcast=192.168.1.255 nmask=255.255.255.0 Server time is Wed Apr 9 10:47:46 1997 Timezone is UTC+1.0 Domain=[UFFICIO] OS=[Unix] Server=[Samba 1.9.16p11] Server=[dinkel] User=[daniele] Workgroup=[UFFICIO] Domain=[UFFICIO] Sharename --------IPC$ lp public Type ---IPC Printer Disk Comment ------IPC Service (Samba 1.9.16p11) stampante pubblica directory pubblica This machine has a browse list: Server --------DINKEL Comment ------Samba 1.9.16p11 This machine has a workgroup list: Workgroup --------UFFICIO Master ------DINKEL 385.3.8 Nome del servente secondo NetBIOS Attraverso ‘smbclient’ è possibile, tra l’altro, conoscere la situazione di un servente SMB. In particolare è importante osservare il nome secondo NetBIOS, ovvero quello indicato come servente. Nell’esempio visto in precedenza si otteneva tra l’altro la riga seguente: Server=[dinkel] User=[daniele] Workgroup=[UFFICIO] Domain=[UFFICIO] Ecco che in questo esempio, il nome NetBIOS dell’elaboratore è ‘dinkel’. La coincidenza con il nome utilizzato per il trasporto IP è dovuta a Samba che utilizza la parte finale del nome di Introduzione a SMB con GNU/Linux 4372 dominio per questo. Il punto è però che tale assunto non deve essere considerato la regola; infatti, questo nome può essere cambiato. 385.3.9 $ smbstatus smbstatus [opzioni] ‘smbstatus’ è un programma molto semplice che permette di conoscere le connessioni in corso al servente SMB locale. Di solito non si usano opzioni. Esempi $ smbstatus[ Invio ] Samba version 1.9.16p11 Service uid gid pid machine ---------------------------------------------public guestpc users 148 roggen (192.168.1.2) Wed Apr 9 15:05:44 1997 No locked files In questo caso, c’è un solo accesso al servizio pubblico ‘public’ da parte dell’elaboratore ‘roggen’. 385.4 Cliente SMB Samba consente di accedere a un servente SMB, ovvero a un elaboratore che offre servizi NetBIOS. Ciò viene fatto fondamentalmente attraverso il programma ‘smbclient’ che si comporta in modo simile a un cliente per FTP, anche se non si tratta proprio della stessa cosa. 385.4.1 $ smbclient smbclient servente_e_servizio [parola_d’ordine] [opzioni] smbclient -L host ‘smbclient’ è il programma attraverso cui è possibile connettersi a un elaboratore che offre ser- vizi NetBIOS attraverso il protocollo TCP/IP. Potrebbe trattarsi di MS-Windows 95/98/NT/2000 o anche di un altro elaboratore GNU/Linux che gestisce un servente SMB con Samba. In linea di massima, si può vedere questo programma come una sorta di cliente FTP, con la differenza che si può inviare un file anche a un servizio di stampa. In questo senso, il programma offre normalmente un invito attraverso il quale possono essere impartiti dei comandi. Questo invito è ‘smb \>’, dove la barra obliqua inversa rappresenta la directory corrente della risorsa a cui ci si è connessi (in questo caso è la radice). L’indicazione del servente e della risorsa deve essere fatto nella forma consueta. \\servente \risorsa Alcune opzioni -P Inizia una connessione a una risorsa di stampa, invece che alla solita risorsa di condivisione di file. -L host Introduzione a SMB con GNU/Linux 4373 Permette di ottenere la lista delle risorse ottenibili da un elaboratore determinato. In tal caso, l’elaboratore viene identificato attraverso i comuni indirizzi IP o i nomi di dominio. -c stringa_di_comando Permette di indicare una stringa di comando da eseguire. In questo modo si evita la modalità interattiva perché si indica tutto quello che si vuole ottenere nella stringa. per indicare più comandi, questi devono essere separati con il punto e virgola (‘;’). -I host Permette di definire l’indirizzo (numero IP, oppure il nome di dominio) dell’elaboratore che concede il servizio. Solitamente, l’indirizzo viene ottenuto attraverso una chiamata circolare (broadcast), ma ci sono situazioni in cui questo sistema non può funzionare, per esempio quando si attraversa un router. Esempi $ smbclient -L dinkel.brot.dg Richiede e ottiene dinkel.brot.dg. l’elenco delle risorse SMB disponibili nell’elaboratore $ smbclient ’\\mais\c’ Attiva una connessione con la risorsa di condivisione file ‘c’ dell’elaboratore identificato dal protocollo NetBIOS con il nome ‘mais’. Non avendo indicato esplicitamente la parola d’ordine, questa viene richiesta prima di presentare l’invito di ‘smbclient’: se per questa risorsa non è prevista, basta lasciarla in bianco e premere [ Invio ]. $ smbclient ’\\mais\c’ -I 192.168.1.15 Come nell’esempio precedente, ma viene specificato l’indirizzo IP del servente. $ smbclient ’\\mais\stampa’ -P Attiva una connessione con la risorsa di condivisione della stampante ‘stampa’ dell’elaboratore identificato dal protocollo NetBIOS con il nome ‘mais’. Non avendo indicato esplicitamente la parola d’ordine, questa viene richiesta prima di presentare l’invito di ‘smbclient’: se per questa risorsa non è prevista, basta lasciarla in bianco e premere [ Invio ]. $ smbclient ’\\mais\stampa’ "" -P -c "print ./lettera" Come nell’esempio precedente, attiva una connessione con la risorsa di condivisione della stampante ‘stampa’, ma indica già la parola d’ordine, corrispondente alla stringa nulla, e il comando da eseguire: ‘print ./lettera’. In questo modo, non inizia alcuna sessione interattiva e il programma procede immediatamente all’invio del file ‘./lettera’ per la stampa. 385.4.2 Verificare il funzionamento di un servente Samba In precedenza si è visto come realizzare un servente SMB attraverso Samba. Per verificarne il funzionamento attraverso il programma ‘smbclient’ si può tentare un collegamento. Ciò può essere fatto sia dallo stesso elaboratore che offre il servizio che da un altro. $ smbclient ’\\DINKEL\PUBLIC’[ Invio ] Il nome dell’elaboratore e quello della risorsa sono scritti con lettere maiuscole intenzionalmente, non perché ciò sia necessario, ma perché è possibile. Infatti, molti clienti di servizi NetBIOS sono in grado di utilizzare solo nomi composti da lettere maiuscole. Introduzione a SMB con GNU/Linux 4374 Si osservi l’uso degli apici singoli. L’indicazione dell’elaboratore e della directory è fatta di due barre oblique inverse, seguite dal nome dell’elaboratore, seguito da una barra obliqua inversa, seguita dal nome dell’oggetto condiviso. Se fossero stati utilizzati gli apici doppi, con la shell Bash o altra simile, le barre oblique avrebbero dovuto essere raddoppiate. In base all’esempio di configurazione presentato all’inizio di questo capitolo, il risultato dovrebbe essere quello seguente: Added interface ip=192.168.1.1 bcast=192.168.1.255 nmask=255.255.255.0 Server time is Wed Apr 9 11:00:13 1997 Timezone is UTC+1.0 Password: Dal momento che si fa riferimento a un servizio pubblico, non si inserisce alcuna parola d’ordine: si preme semplicemente [ Invio ]. Domain=[UFFICIO] OS=[Unix] Server=[Samba 1.9.16p11] smb: \> A questo punto, ‘smbclient’ si comporta come un programma di FTP. Per terminare l’esecuzione di ‘smbclient’ è sufficiente scrivere il comando ‘quit’. 385.5 Connessione con una rete NetBIOS-TCP/IP Per poter integrare il proprio elaboratore GNU/Linux, sul quale è appena stato installato Samba, con una rete che utilizza NetBIOS, occorre che i sistemi operativi di questa rete utilizzino il trasporto TCP/IP.3 Di conseguenza, si potrà interagire con sistemi MS-Windows 95/98/NT/2000, mentre per MSWindows 3.11 e per il Dos occorre aggiungere l’estensione al TCP/IP. Per questo scopo si può visitare eventualmente il seguente indirizzo. <ftp://ftp.microsoft.com/bussys/clients/> L’esempio seguente mostra l’interrogazione di un elaboratore su cui gira MS-Windows 95/98/NT/2000 che consente la condivisione del disco ‘C:’ e della stampante. $ smbclient -L roggen.brot.dg[ Invio ] Added interface ip=192.168.1.1 bcast=192.168.1.255 nmask=255.255.255.0 Server time is Thu Apr 10 12:50:16 1997 Timezone is UTC+2.0 Server=[ROGGEN] User=[] Workgroup=[UFFICIO] Domain=[UFFICIO] Sharename --------C HP IPC$ PRINTER$ Type ---Disk Printer IPC Disk Comment ------- Comunicazioni remote tra processi Da quello che si vede nell’elenco dei servizi è possibile utilizzare ‘smbclient’ per accedere alla risorsa ‘C’. $ smbclient ’\\ROGGEN\C’ 3 Di solito, le reti NetBIOS fanno uso del protocollo di trasporto NetBEUI che ha il vantaggio di non richiedere alcuna configurazione. L’utilizzo del trasporto TCP/IP obbliga a indicare gli indirizzi IP e le maschere di rete. Ciò significa che, oltre a dover pianificare i nomi dei serventi o peer, si devono organizzare anche gli indirizzi IP. Di solito, questo particolare viene dimenticato perché non sembra fare parte del protocollo NetBIOS. Introduzione a SMB con GNU/Linux 4375 Dal lato dell’elaboratore roggen.brot.dg sul quale è in funzione MS-Windows 95/98/NT/2000, è possibile utilizzare le risorse di rete per accedere all’elaboratore GNU/Linux (dinkel.brot.dg), sempre che questo abbia attivato un servente SMB con Samba. Figura 385.1. La directory pubblica amministrata da Samba, dal punto di vista di MSWindows 95/98/NT/2000. Dal lato dell’elaboratore GNU/Linux è possibile controllare gli accessi attraverso ‘smbstatus’. $ smbstatus[ Invio ] Samba version 1.9.16p11 Service uid gid pid machine ---------------------------------------------public guestpc users 148 roggen (192.168.1.2) Wed Apr 9 15:05:44 1997 No locked files Segue il contenuto delle directory pubbliche così come si vede in figura 385.1 dal punto di vista di GNU/Linux. total 55 -rwxr--r--rwxr--r--rwxr--r--rwxr--r-- 1 1 1 1 guestpc guestpc guestpc guestpc users users users users 49129 3236 476 261 Feb 1 1992 dc.com Feb 1 1992 dc.doc Feb 6 20:46 dc.ext Dec 12 20:40 dc.mnu Per utilizzare una stampante condivisa in una rete NetBIOS, si può utilizzare ancora ‘smbclient’. Per esempio, si vuole stampare il file ‘esempio’ nella stampante condivisa con il nome ‘HP’ dall’elaboratore ‘roggen’. $ smbclient ’\\ROGGEN\HP’ -P Dopo la richiesta della parola d’ordine, che supponiamo sia inesistente, si presenta l’invito di ‘smbclient’ dal quale è possibile dare il comando di stampa. print file_da_stampare Quindi si può uscire dalla sessione di lavoro con ‘smbclient’ utilizzando il comando ‘quit’. Di certo è un’operazione piuttosto laboriosa, inoltre si aggiunge il problema della scalettatura, cioè la necessità di convertire i file di testo Unix in file di testo Dos. 4376 Introduzione a SMB con GNU/Linux 385.5.1 Cliente MS-Dos Se si vogliono utilizzare elaboratori MS-Dos per accedere a elaboratori GNU/Linux che condividono dati attraverso Samba, è necessario acquisire il software ‘msclient’ dal solito indirizzo di Microsoft. <ftp://ftp.microsoft.com/bussys/clients/> Nell’elaboratore Dos, una volta decompressi i file in una directory transitoria, si può avviare il programma ‘SETUP.EXE’. È necessario solo il protocollo TCP/IP, mentre il NetBEUI è superfluo e serve solo a ridurre ulteriormente la scarsa memoria a disposizione. È anche sufficiente utilizzare il cosiddetto redirector di base. Solitamente, il cliente Microsoft viene installato in ‘C:\NET’ Al suo interno sono disponibili alcuni file di configurazione ‘.INI’, secondo la convenzione normale di MS-Windows. Tutto, o quasi, è configurabile attraverso il programma ‘SETUP.EXE’, anche se resta la possibilità di modificare direttamente questi file. Quello che segue è un esempio del file ‘PROTOCOL.INI’. [network.setup] version=0x3110 netcard=ms$ne2clone,1,MS$NE2CLONE,1 transport=tcpip,TCPIP lana0=ms$ne2clone,1,tcpip [TCPIP] NBSessions=6 SubNetMask0=255 255 255 0 IPAddress0=192 168 1 10 DisableDHCP=1 DriverName=TCPIP$ BINDINGS=MS$NE2CLONE LANABASE=0 [MS$NE2CLONE] IOBASE=0x300 INTERRUPT=10 DriverName=MS2000$ [protman] DriverName=PROTMAN$ PRIORITY=MS$NDISHLP È importante osservare il modo con cui viene inserito l’indirizzo IP dell’elaboratore, cioè separando gli ottetti attraverso spazi invece che con il consueto punto. È importante impostare correttamente la maschera di rete e disabilitare il DHCP, ‘DisableDHCP=1’, a meno che questo ultimo sia disponibile effettivamente. Quello che segue è un esempio del file ‘SYSTEM.INI’. [network] filesharing=no printsharing=no autologon=yes computername=ALFA lanroot=C:\NET username=DANIELE workgroup=UFFICIO reconnect=yes dospophotkey=N lmlogon=0 logondomain=UFFICIO preferredredir=basic autostart=basic Introduzione a SMB con GNU/Linux 4377 maxconnections=8 [network drivers] netcard=ne2000.dos transport=tcpdrv.dos,nemm.dos devdir=C:\NET LoadRMDrivers=yes [386enh] TimerCriticalSection=5000 UniqueDosPSP=TRUE PSPIncrement=2 [Password Lists] *Shares=C:\NET\Shares.PWL DANIELE=C:\NET\DANIELE.PWL È abbastanza importante che il gruppo di lavoro (workgroup) sia uguale a quello del servizio da raggiungere, anche se non è indispensabile. In questo caso: ‘workgroup=UFFICIO’. Inoltre, per risparmiare memoria, è conveniente che sia attivato solo il redirector di base: ‘preferredredir=basic’. 385.5.2 Problemi con i router Quando si utilizzano clienti NetBIOS come MS-Windows 95/98/NT/2000 o lo stesso MS-Dos, pur avendo la possibilità di indicare l’indirizzo di un router (gateway), normalmente non si riesce ad attraversarlo per accedere a un servizio NetBIOS che si trovi oltre questo. Ciò dipende dalla normale impossibilità di indicare il nodo di destinazione attraverso la notazione necessaria al protocollo IP. In pratica, il cliente tipico effettua un’interrogazione circolare (broadcast) per il servente che offre un servizio NetBIOS particolare. La risposta si ottiene regolarmente se il servente è connesso nella stessa rete o sottorete, mentre non si ottiene alcuna risposta se questo si trova oltre un router. I programmi cliente di GNU/Linux, come ‘smbclient’ e ‘smbmount’ (il secondo viene descritto più avanti), offrono la possibilità di indicare esplicitamente l’indirizzo del nodo che funge da servente NetBIOS. In tal modo, questi clienti riescono ad attraversare anche i router. 385.6 Stampa Come si è visto, la stampa attraverso un servizio SMB avviene per mezzo di ‘smbclient’. La maggior parte delle distribuzioni GNU/Linux predispone già un sistema di filtri di stampa completo anche della possibilità di stampare presso una stampante remota di tipo SMB. A titolo di esempio, si può osservare lo script seguente che si occupa di ricevere lo standard input e di inviarlo, tramite ‘smbclient’, a una stampante remota particolare. Per farlo, viene creato un file temporaneo nella directory personale dell’utente che lo utilizza, che con l’occasione viene trasformato. In questo esempio, ci si limita a fare in modo che il codice di interruzione di riga corrisponda alla sequenza <CR><LF>, adatta alle stampanti comuni.4 #!/bin/bash #====================================================================== # stampa-smb # # Esempio di una sorta di filtro di stampa per utilizzare una stampante # condivisa da un servente SMB. 4 Qui si intende che il programma ‘unix2dos’ si comporti come filtro, ricevendo i dati dallo standard input ed emettendo il risultato della sua elaborazione attraverso lo standard output. Introduzione a SMB con GNU/Linux 4378 #====================================================================== #====================================================================== # Variabili. #====================================================================== #-----------------------------------------------------------------# Il nome del file temporaneo da utilizzare per la stampa. #-----------------------------------------------------------------STAMPA="$HOME/stampa-smb-$(date +%Y%m%d%H%M%S)" #-----------------------------------------------------------------# Il nome del servizio di stampa SMB. #-----------------------------------------------------------------SMB_PRINT=’\\weizen.mehl.dg\lp’ #====================================================================== # Inizio. #====================================================================== #-----------------------------------------------------------------# Scarica lo standard input nel file temporaneo, trasformandolo # in un testo «Dos» in cui «newline» corrisponda alla sequenza # <CR><LF>. #-----------------------------------------------------------------cat | unix2dos > $STAMPA #-----------------------------------------------------------------# Invia il file a un servizio di stampa SMB. #-----------------------------------------------------------------smbclient $SMB_PRINT "" -P -c "print $STAMPA" > /dev/null #-----------------------------------------------------------------# Elimina il file transitorio. #-----------------------------------------------------------------rm $STAMPA > /dev/null #====================================================================== # Fine. #====================================================================== 385.7 Montare una risorsa di condivisione dei file nel file system GNU/Linux Finora si è visto che è possibile accedere a una directory condivisa con il protocollo NetBIOS attraverso il programma ‘smbclient’. Ma questo programma non consente di montare quella directory, così come si fa con il protocollo NFS. Per questo occorre predisporre il kernel (nella sezione dedicata ai file system, 29.2.14) e per il montaggio si deve utilizzare il programma ‘smbmount’. Nella configurazione del kernel conviene attivare anche la gestione del raggiro del problema delle prime versioni di MS-Windows 95. 385.7.1 $ smbmount smbmount servizio punto_di_innesto [opzioni] ‘smbmount’ permette di eseguire il montaggio di una directory offerta in condivisione da un servizio NetBIOS. Il nome del servizio viene indicato in maniera più confacente allo standard Unix, utilizzando barre inclinate normali e non inverse come richiede normalmente NetBIOS. Il servizio ha la sintassi seguente: [ ] //servente /risorsa /directory Introduzione a SMB con GNU/Linux 4379 In questo modo si indica il servente e il nome della risorsa, come al solito, a parte l’uso delle barre normali. Di seguito, si può aggiungere l’indicazione di una directory particolare, discendente da quella di partenza per il servizio indicato. ‘smbmount’ può essere utilizzato eventualmente anche da utenti comuni (diversi dall’utente ‘root’), ma in tal caso, deve essere attivato il bit SUID (SUID-root). In pratica, deve avere i permessi 47558 e appartenere all’utente ‘root’. Alcune opzioni -s servente In alcune circostanze è necessario specificare a parte il nome del servente NetBIOS e questa opzione permette di farlo. -c cliente In alcune circostanze è necessario specificare a parte il nome del cliente NetBIOS, cioè di se stessi, attraverso questa opzione. -U utente Permette di specificare un nome di utente, per gli scopi di NetBIOS, diverso da quello utilizzato effettivamente nell’elaboratore cliente. -I host Permette di definire l’indirizzo (numero IP, oppure il nome di dominio) dell’elaboratore che concede il servizio. Solitamente, questo indirizzo viene ottenuto attraverso una chiamata circolare (broadcast), ma ci sono situazioni in cui questo sistema non può funzionare, per esempio quando si attraversa un router. -u utente -g gruppo Queste due opzioni permettono di definire la proprietà dei file e delle directory del file system che viene montato. Infatti, trattandosi di un file system sprovvisto di tali informazioni, è necessario decidere a chi si vuole fare appartenere il suo contenuto. Se non si utilizzano queste opzioni, tutto è di proprietà dell’utente ‘root’. Esempi $ smbmount //W5/C /mnt/dosserver Esegue il montaggio della directory condivisa dal servente NetBIOS ‘W5’ con il nome ‘C’, utilizzando come punto di innesto ‘/mnt/dosserver/’. I dati ottenuti (file e directory) risulteranno appartenere all’utente ‘root’. $ smbmount //W5/C /mnt/dosserver -c linux1 Esegue la stessa operazione dell’esempio precedente, ma fa in modo che l’elaboratore locale (il cliente dal quale si esegue il montaggio) venga identificato, ai fini del protocollo NetBIOS, con il nome ‘linux1’. $ smbmount //W5/C /mnt/dosserver -c linux1 -I 192.168.2.15 Come nell’esempio precedente, ma indica esplicitamente l’indirizzo IP del nodo cui corrisponde il nome NetBIOS ‘W5’. Ciò permette di superare un eventuale router e comunque evita una richiesta circolare a tutta la rete. $ smbmount //W5/C /mnt/dosserver -u daniele -g daniele Come nel primo esempio, ma viene indicato a quale utente e gruppo devono risultare appartenenti i file e le directory. Introduzione a SMB con GNU/Linux 4380 385.7.2 $ smbumount smbumount punto_di_innesto ‘smbumount’ permette agli utenti comuni di smontare una directory offerta in condivisione da un servizio NetBIOS, montata precedentemente con ‘smbmount’. Perché ciò possa funzionare, è necessario che questo programma appartenga all’utente ‘root’ e abbia il bit SUID attivato (SUID-root). In pratica, le stessa situazione richiesta per ‘smbmount’. L’utente ‘root’ non ha bisogno di utilizzare questo programma; per lui è sufficiente il solito ‘umount’. 385.8 Riferimenti • David Wood, SMB HOWTO <http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 386 Applicazioni multimediali In questo capitolo si raccolgono informazioni su applicativi multimediali che per qualche motivo non vengono più seguite in questo documento. 386.1 Wavplay Wavplay 1 è un pacchetto per l’esecuzione e la registrazione di file audio in formato WAV-RIFF. Non si tratta di qualcosa di eccezionale, ma è almeno uno strumento funzionale che permette di non dover lavorare direttamente con i file di dispositivo. Purtroppo, Wavplay non funziona con tutti i tipi di scheda audio. In generale dovrebbe andare bene con quelle i cui driver appartengono alla serie «OSS». 386.1.1 $ wavplay, wavrec [opzioni] file_wav ... wavrec [opzioni] file_wav wavplay Come si può intuire, ‘wavrec’ registra, mentre ‘wavplay’ esegue i file WAV. Le opzioni di questi due programmi eseguibili sono in parte uguali. Alcune opzioni -s frequenza_campionamento In registrazione permette di definire la frequenza di campionamento. Il valore predefinito è di 22050 Hz. Utilizzando frequenze maggiori si migliora la qualità della registrazione, aumentando proporzionalmente le dimensioni del file che si genera. In esecuzione, permette di modificare la velocità di ascolto. In pratica, utilizzando una frequenza di campionamento inferiore a quella utilizzata per registrare si ottiene un’esecuzione rallentata e, di conseguenza, il contrario aumentando la frequenza. In generale, per eseguire un brano alla sua velocità naturale, non occorre specificare questa opzione. -S Richiede espressamente una registrazione o un’esecuzione stereofonica. -M Richiede espressamente una registrazione o un’esecuzione monofonica. | -b 8 16 Permette di specificare espressamente la dimensione in bit di ogni campione. Si può scegliere solo tra i valori 8 e 16. -t n_secondi_registrazione Permette di fissare la durata della registrazione (non si usa per l’esecuzione). -i Riguarda solo ‘wavplay’ e fa sì che si limiti a mostrare le caratteristiche del file, senza eseguirlo. 1 Wavplay GNU GPL 4381 Applicazioni multimediali 4382 Esempi $ wavrec -b 8 -S -t 60 mio_file.wav Registra nel file ‘mio_file.wav’ ciò che proviene dalla scheda audio (si deve utilizzare un programma come Aumix per selezionare un segnale in registrazione), con campioni di 8 bit, in stereofonia, per una durata di 60 s. La frequenza di campionamento è quella predefinita. $ wavrec -b 8 -S -t 60 -s 20000 mio_file.wav Come nell’esempio precedente, specificando una frequenza di campionamento di 20000 Hz. $ wavplay mio_file.wav Esegue il file ‘mio_file.wav’. $ wavplay -s 10000 mio_file.wav Esegue il file ‘mio_file.wav’ a una data frequenza di campionamento, in modo da alterarne la velocità di esecuzione (seguendo gli esempi già visti, la velocità viene dimezzata). 386.1.2 $ xltwavplay Wavplay si compone anche dell’eseguibile ‘xltwavplay’, a volte distribuito in un pacchetto separato, che si comporta da programma frontale grafico per ‘wavplay’ e ‘wavrec’. In pratica, utilizza il sistema grafico X per comandare ‘wavplay’ e ‘wavrec’ in modo più gradevole rispetto alla solita riga di comando. Figura 386.1. Aspetto del programma frontale di Wavplay. Applicazioni multimediali 4383 L’unico problema di ‘xltwavplay’ sta nel fatto che utilizza le librerie LessTif che funzionano ancora perfettamente. 386.2 Mpg123 Mpg123 2 è un applicativo specializzato per l’esecuzione di brani memorizzati in formato MP3. Mpg123 si compone in pratica solo dell’eseguibile omonimo: ‘mpg123’. mpg123 [opzioni] {file_mp3|uri_http} L’eseguibile in questione è ricco di opzioni e di possibilità; tuttavia dovrebbe bastare l’indicazione del file MP3 come unico argomento per iniziare la sua esecuzione attraverso la gestione dell’audio del sistema operativo (in pratica si arrangia a inviare i dati al dispositivo ‘/dev/audio’ o ‘/dev/dsp’, che deve avere i permessi necessari). Una particolarità di Mpg123 è quella di poter caricare direttamente un file attraverso il protocollo HTTP. Per esempio: $ mpg123 mio_file.mp3 avvia l’esecuzione del file ‘mio_file.mp3’, mentre: $ mpg123 "http://www.brot.dg/brano.mp3" esegue direttamente il file che si ottiene dall’URI ‘http://www.brot.dg/brano.mp3’. Eventualmente, per questo è possibile servirsi anche di un proxy. Per maggiori dettagli si può consultare la pagina di manuale relativa: mpg123(1). 386.3 8Hz-mp3 8Hz-mp3 3 è un programma che è stato disponibile gratuitamente, ma che pare avere qualche problema (si veda a questo proposito <http://www.8hz.com/mp3/index.html> ed eventualmente anche <http://sound.media.mit.edu/~eds/mpeg-patents-faq>). 8Hz-mp3 è in grado di convertire file WAV-RIFF, o PCM, in MP3. In generale, conviene limitarsi alla conversione a partire da file WAV-RIFF, dal momento che questi contengono nell’intestazione tutte le informazioni necessarie a conoscere il modo in cui sono campionati. L’eseguibile ‘8hz-mp3’ è tutto ciò che compone questo programma: 8hz-mp3 [opzioni] file_in_ingresso file_mp3_generato L’uso normale di 8Hz-mp3 non richiede alcuna opzione. Per la precisione, senza opzioni, 8Hzmp3 si aspetta che il file in ingresso sia in formato WAV-RIFF, generando un file MP3 con la qualità migliore che è in grado di ottenere. Alcune opzioni -c Imposta nel file MP3 il bit ‘copyright’. Senza questa opzione, il bit non viene attivato. -o Imposta nel file MP3 il bit ‘original’. Senza questa opzione, il bit non viene attivato. -q n_qualità 2 3 Mpg123 software non libero: non è consentita la modifica e la commercializzazione 8Hz-mp3 gratuito, senza una licenza vera e propria Applicazioni multimediali 4384 Definisce esplicitamente il livello di qualità che si intende ottenere nel file MP3. Il valore predefinito è zero, che corrisponde alla qualità migliore. Valori superiori allo zero, fino a un massimo di 30, indicano qualità progressivamente inferiori. Esempi $ 8hz-mp3 01.wav 01.mp3 Converte il file ‘01.wav’ nel file ‘01.mp3’, utilizzando le impostazioni predefinite. $ for i in *.wav ; do 8hz-mp3 $i $i.mp3 ; done Attraverso la shell, attiva un ciclo con il quale vengono convertiti tutti i file che terminano con estensione ‘.wav’ in MP3, creando altrettanti file, che si distinguono perché hanno in più l’estensione ‘.mp3’. 386.4 Xanim Xanim 4 è un programma, apparentemente molto semplice, che permette la visione e l’ascolto di file contenenti delle animazioni. I formati che può gestire sono molti; per citarne alcuni: FLI, GIF animati, AVI e Quicktime. Xanim (l’eseguibile ‘xanim’) può essere usato molto bene in modo non interattivo attraverso l’uso delle opzioni fornite nella riga di comando, ma permette comunque una gestione intuitiva anche senza di queste. L’unico argomento obbligatorio è il nome del file che si vuole «eseguire». Per utilizzare bene Xanim è necessario leggere la pagina di manuale xanim(1). 386.4.1 $ xanim xanim [opzioni] file ... Come accennato, ‘xanim’ richiede espressamente l’indicazione di almeno un file di animazione da eseguire. Se vengono indicati più file, questi risultano uniti assieme in un’unica sequenza. Il controllo dell’esecuzione delle animazioni avviene normalmente attraverso un pannellino di controllo che si può vedere nella figura 386.2. Figura 386.2. La finestra contenente il pannellino di controllo di Xanim. Anche senza volere approfondire l’uso di questo programma, può essere conveniente conoscere almeno l’uso del mouse e di alcune funzionalità della tastiera durante l’esecuzione di un’animazione: • facendo un clic con il primo tasto del mouse, oppure premendo il tasto [ , ] (virgola), si ottiene l’arresto dell’esecuzione e la visualizzazione della scena precedente; • facendo un clic con il terzo tasto del mouse, oppure premendo il tasto [ . ] (punto), si ottiene l’arresto dell’esecuzione e la visualizzazione della scena successiva; 4 Xanim software gratuito, non libero, per uso «non commerciale» Applicazioni multimediali 4385 • facendo un clic con il secondo tasto del mouse (quello centrale) si ottiene la ripresa dell’esecuzione dell’animazione (se era stata fermata); • la [ barra spaziatrice ] arresta o fa riprendere l’esecuzione dell’animazione; Capitolo 387 Acua Un sistema dedicato prevalentemente agli utenti, sul quale possano accedere un gran numero di persone, richiede la definizione di una regolazione di tali accessi, in base alle politiche che si vogliono attuare. In tali situazioni di affollamento è importante poter definire degli orari o delle preferenze in base al carico, cosa che non può essere fatta in modo manuale, con un controllo umano diretto. Oltre a questo, quando si amministrano centinaia di utenti, diventa molto impegnativo il compito di ricordare le scadenze previste per le utenze, rischiando di lasciare attive quelle che non servono più, o sono inutilizzate da tanto tempo. Acua 1 è un applicativo che permette di risolvere in parte questi problemi, permettendo di stabilire in particolare: degli orari, dei limiti di tempo, il numero massimo di accessi contemporanei da parte dello stesso utente, delle preferenze in base al carico del sistema, l’eliminazione delle utenze scadute (provvedendo all’avviso preventivo) e l’eliminazione di utenze inattive da molto tempo. Acua è lo strumento ideale per un fornitore di accesso a Internet, ma anche altri ambienti possono trovare utile l’utilizzo di questo software. 387.1 Organizzazione generale Il controllo di Acua si basa su un registro degli utenti sottoposti alla sua amministrazione, un demone che verifica la presenza di tali utenti nel sistema e di cui controlla l’utilizzo di risorse, avvalendosi di una serie di programmi e script di contorno. Perché il controllo abbia un senso, Acua deve avere il modo di impedire l’accesso agli utenti che accedono al di fuori della loro fascia oraria, o che tentano di utilizzare risorse superiori a quanto loro concesso. Per questo, la procedura che permette all’utente di accedere deve essere ritoccata, in modo da inserire una verifica attraverso Acua. Inoltre, per forzare il rispetto delle regole poste, il demone di Acua deve poter chiudere una connessione con un utente che ha esaurito le risorse a sua disposizione o che comunque non ha più diritto di continuare a mantenere la connessione. Ancora, il demone deve prendersi cura di avvisare dell’imminente scadenza dell’utenza, anche attraverso la posta elettronica, prima di provvedere alla sua eliminazione definitiva. Come si può intuire, Acua va a interferire con la gestione tradizionale degli utenti; di sicuro, almeno quando questo provvede da solo all’eliminazione delle utenze. Infatti, ciò implica la cancellazione dai file ‘/etc/passwd’, ‘/etc/group’ (con modalità differenti, a seconda che si usino i gruppi privati o meno) e ‘/etc/shadow’, inoltre implica l’eliminazione della directory personale dell’utente, assieme alla sua posta elettronica sospesa. Per questo, Acua deve sapere come gestire questi file, ma soprattutto, dove trovare le directory personali e i file della posta elettronica. Acua è così coinvolto nella creazione ed eliminazione degli utenti, che si utilizzano normalmente due script appositi: ‘acua_adduser’ e ‘acua_deluser’, al posto dei tradizionali ‘adduser’ (‘useradd’) e ‘deluser’ (‘userdel’).2 Il compito di questi è così delicato che non si può evitare di controllarli e modificarli. Solo se Acua viene distribuito tra i pacchetti ufficiali della propria distribuzione si può sperare che non si debbano toccare tali script. 1 2 Acua GNU GPL Per la precisione, si utilizzano i comandi ‘acua addUser’ e ‘acua delUser’, ma questo verrà chiarito in seguito. 4386 Acua 4387 Il demone di Acua, assieme al comportamento dei comandi che si occupano di inserire o modificare le registrazioni degli utenti sottoposti al controllo di Acua, può essere configurato attraverso un file di configurazione generale. Il problema di Acua è che raramente fa parte della tipica distribuzione GNU/Linux e questo significa che lo si trova spesso come pacchetto aggiunto nei contributi. Ciò comporta che non siano stati presi tutti gli accorgimenti necessari a farlo funzionare subito e che si debbano modificare necessariamente gli script di creazione e cancellazione degli utenti. 387.1.1 Problemi Acua non è un sistema di controllo perfetto e nemmeno giunto a un livello di maturazione accettabile per l’uso improvvisato. Dato il tipo di problema che intende cercare di risolvere, si rivolge a persone che hanno un’ottima esperienza dei sistemi Unix. In tal senso, la documentazione è insufficiente e l’attuazione di determinate strategie implica un’organizzazione iniziale che poi non può essere sconvolta. Quindi, prima di usare Acua seriamente, occorre essere sicuri di averne compreso la filosofia e tutte le sue debolezze. Acua dipende dal funzionamento corretto della registrazione nei file ‘/var/run/utmp’ e ‘/var/ log/wtmp’. Per esempio, se un utente accede senza che ciò venga registrato in questi file, Acua non può verificare la sua presenza e generalmente si rifiuta di accettarlo. Questo tipo di problema si verifica effettivamente in alcune distribuzioni GNU/Linux in presenza di accessi attraverso il PPP, quando vengono utilizzate le librerie PAM; si tratta di un difetto di queste edizioni del demone ‘pppd’, ma ciò basta a mettere in crisi Acua. Acua mantiene un proprio elenco degli utenti in cui annota le risorse concesse e utilizzate. Questo elenco è troppo poco dettagliato, per cui gli utenti sono annotati solo attraverso il numero UID, non per nome. Inoltre, l’utilizzo di risorse da parte degli utenti è fatto attraverso l’uso di interi: se per qualche errore di configurazione gli utenti riescono a utilizzare un’unità in più delle risorse concesse, la detrazione genera un valore negativo, che in un intero produce l’equivalente del valore massimo gestibile. 387.1.2 Definizione delle risorse Acua utilizza alcuni concetti per definire le risorse che controlla. Questi concetti, assieme ai termini utilizzati per identificarli, è bene siano chiariti prima di mettersi a predisporre la configurazione. I più importanti sono riferiti all’utilizzo orario da parte degli utenti e al carico del sistema. Però è importante non illudersi: alcune cose non funzionano come dovrebbero e per determinarlo si possono solo fare esperimenti. Precisamente, si distingue tra: • durata complessiva (time), che rappresenta il tempo massimo a disposizione per l’utilizzo dell’accesso in un dato intervallo di tempo di riferimento (generalmente si tratta di 24 ore, una settimana, un mese o un anno); • durata della sessione (session time), che rappresenta il tempo massimo a disposizione per una singola connessione;3 • fasce orarie (time class), che servono a definire dei privilegi differenti per i vari utenti in base al momento in cui questi utilizzano il sistema. 3 A meno di avere verificato effettivamente il funzionamento della gestione del tempo di sessione, è meglio non farne uso, o al massimo indicare lo stesso valore del tempo totale. Acua 4388 A questo si affianca poi il concetto del carico del sistema, in base al quale, alcuni utenti possono essere preferiti ad altri. Il carico del sistema può servire anche per condizionare l’applicazione delle regole stabilite attraverso le fasce orarie e la durata delle connessioni (opzioni smart...). 387.1.3 Variabili Nell’elenco degli utenti di Acua vengono gestite una serie di informazioni che all’esterno sono mostrate come delle variabili. Queste variabili possono essere usate per personalizzare i file dei messaggi generati da Acua, sia per quanto viene mostrato sullo schermo del terminale, sia per ciò che viene inviato attraverso la posta elettronica. Per evitare confusioni inutili, è meglio avere sotto mano uno specchietto di questi nomi, con il loro significato. La tabella 387.1 mostra l’elenco delle variabili a cui può essere assegnato un valore che esprime una quantità, mentre la tabella 387.2 elenca le variabili booleane, cioè quelle che rappresentano l’attivazione o meno di una modalità. Tabella 387.1. Elenco delle variabili principali riferite alla gestione di Acua. Nome expire phNo priority maxLogins maxDeduct PPPidleBytes PPPidleMin tLeft tLimit credit sLeft sLimit cLeft cLimit bTx bRx bTxLimit bRxLimit bLimit bStxLimit bSrxLimit bSLimit Descrizione Scadenza dell’utenza. Numero telefonico dell’utente. Priorità. Numero massimo di accessi simultanei. Numero massimo di minuti da dedurre per minuto (<= maxLogins). Byte transitati al di sotto dei quali la connessione sembra inattiva. Minuti di tempo durante i quali si calcola il transito minimo. Tempo complessivo rimasto (minuti). Tempo complessivo concesso (minuti). Credito di tempo accumulato (minuti). Tempo di sessione rimasto (minuti). Tempo di sessione concesso (minuti). Tempo di fascia rimasto (minuti). Tempo di fascia concesso (minuti). Byte trasmessi. Byte ricevuti (scaricati). Limite massimo di byte che possono essere trasmessi. Limite massimo di byte che possono essere ricevuti. Limite complessivo al trasferimento in byte. Limite di sessione dei byte che possono essere trasmessi. Limite di sessione dei byte che possono essere ricevuti. Limite di sessione complessivo al trasferimento in byte. Tabella 387.2. Elenco delle variabili booleane di Acua. Nome SMARTTIME SSMARTTIME TCSMARTTIME SMARTBOOT SSMARTBOOT TCSMARTBOOT ISMARTBOOT WARNBOOT EXPLAINBOOT Descrizione Non deduce il tempo complessivo se il sistema non è sotto carico. Non deduce il tempo di sessione se il sistema non è sotto carico. Non deduce il tempo della fascia oraria se il sistema non è sotto carico. Se il carico è ridotto, non allontana l’utente allo scadere del tempo complessivo. Se il carico è ridotto, non allontana l’utente allo scadere del tempo di sessione. Se il carico è ridotto, non allontana l’utente allo scadere del tempo di fascia. In caso di inattività, l’utente non viene allontanato se il sistema non è sotto carico. L’utente può essere avvisato della disconnessione imminente. L’utente può essere avvisato della motivazione della disconnessione. Acua 4389 387.2 Preparazione Per utilizzare Acua è necessario mettere in funzione il demone ‘acua_updated’, ma prima di poterlo fare, bisogna preparare il file di configurazione generale. Come al solito, il posto corretto per i file di configurazione dovrebbe essere la directory ‘/etc/’, ma se Acua non viene configurato correttamente prima della compilazione, oppure se si utilizza un pacchetto già compilato che non fa parte della propria distribuzione GNU/Linux ufficiale, è probabile che si trovi altrove (‘/usr/lib/acua/’ per esempio).4 387.2.1 Azzeramenti Oltre all’avvio del demone, per utilizzare Acua è necessario azzerare periodicamente i conteggi dell’utilizzo delle risorse. In precedenza si è accennato alla differenza tra la durata complessiva dell’utilizzo del sistema da parte di un utente e la durata di un collegamento singolo. La durata complessiva va riferita a un dato intervallo di tempo, che potrebbe essere l’arco di 24 ore, oppure una settimana, o un mese, o anche un anno; in ogni caso, qualcosa di ben definito. L’azzeramento di questi conteggi (che possono riguardare anche altri parametri) deve avvenire con una cadenza equivalente. Se si gestiscono le fasce orarie, occorre anche aggiungere un azzeramento giornaliero relativo a queste. Supponendo che la durata complessiva sia riferita a un anno di tempo, si potrebbero utilizzare le direttive seguenti nel file di configurazione del sistema Cron. 02 4 * * * root /usr/bin/acua renew -c 03 4 1 1 * root /usr/bin/acua renew In pratica, seguendo l’esempio, si esegue il comando ‘acua renew -c’ ogni giorno, alle 4:02; invece, il comando ‘acua renew’ viene eseguito una volta all’anno, precisamente il primo di gennaio, alle ore 4:03. Naturalmente, la scelta delle ore 4:02 e 4:03 è solo un esempio, con l’intenzione di indicare un momento in cui l’utilizzo del sistema è minimo. 387.2.2 Configurazione del demone La configurazione attraverso il file ‘/etc/acua/acua.config’ è piuttosto delicata e importante. La documentazione per questo è composta praticamente solo dai commenti contenuti nell’esempio allegato al pacchetto di Acua. Di seguito verranno mostrati e descritti solo alcune direttive importanti. In ogni caso, è bene precisare che i commenti si rappresentano con il simbolo ‘#’, dove ciò che segue tale simbolo, fino alla fine della riga, viene ignorato; inoltre, come al solito, le righe vuote e quelle bianche vengono ignorate. Alcune direttive si riferiscono a caratteristiche delle utenze che vengono prese in considerazione quando si utilizza ‘acua addRec’ (ovvero lo script ‘acua_adduser’). Ciò serve a facilitare il compito dell’amministratore nell’uniformare gli utenti. Questi dati possono poi essere modificati attraverso ‘acua modRec’. Devices dispositivo [n_quantità ] [dispositivo [n_quantità ] ]... La direttiva ‘Devices’ serve a definire quali dispositivi, utilizzabili per l’accesso, devono essere controllati dal demone. Ogni dispositivo va indicato senza comprendere la directory che lo contiene, per cui, ‘/dev/ttyS0’ viene annotato come ‘ttyS0’ e basta. 4 Nel seguito si farà riferimento al file ‘/etc/acua/acua.config’, confidando che sia quella la collocazione comune. 4390 Acua Se i dispositivi sono in sequenza, cioè se hanno lo stesso numero primario (major) e il numero secondario (minor) è in sequenza, si può indicare il primo dispositivo seguito da un numero che esprime la quantità di questi dispositivi da includere. Per esempio, ‘ttyp0 4’ rappresenta i dispositivi da ‘/dev/ttyp0’ a ‘/dev/ttyp3’. PurgeDays n_giorni Con questa direttiva è possibile automatizzare l’eliminazione delle utenze inutilizzate da tanto tempo, precisamente dal numero di giorni indicato. L’eliminazione di questi utenti avviene attraverso uno script di Acua, in questo caso avviato dal demone. Tuttavia la cosa è così delicata che è importante ricordare di verificare questo script, prima di avviare il demone stesso. Se si vuole impedire questo comportamento di Acua, basta indicare il valore zero. MailHost nome_host Acua può occuparsi di inviare dei messaggi di preavviso prima della scadenza dell’utenza, avvalendosi per questo della posta elettronica. A volte però, il nodo presso cui sono gestiti gli accessi, non è quello presso cui gli utenti ricevono la posta elettronica. In tal caso si deve utilizzare questa direttiva, che serve a specificare il nome di dominio completo del nodo a cui fare riferimento per l’invio dei messaggi. WarnBoot n_minuti ... PPPWarnBoot n_minuti ... Permette di definire quanti minuti prima della scadenza della connessione avvisare l’utente. Nel primo caso si tratta di utenti che accedono attraverso un terminale normale (TTY), a cui viene inviato un messaggio sul terminale, nel secondo si tratta di utenti che accedono attraverso il PPP, a cui l’avvertimento viene dato per mezzo della posta elettronica. È molto probabile che ci siano situazioni in cui, sia un tipo di avvertimento, sia l’altro, sono perfettamente inutili. Per esempio, l’utente che accede a un ISP, utilizzando una connessione PPP, dovrebbe avere sempre attivo un programma per la lettura della posta elettronica dal servente presso cui questa viene depositata. WarnExpire n_giorni ... WarnExpireCC indirizzo_email Questo è un altro tipo di avvertimento che riguarda la scadenza dell’utenza, dato solo attraverso la posta elettronica, qualche giorno prima di tale scadenza. I valori numerici indicati nella prima direttiva sono il numero di giorni prima che si vuole sia emesso l’avvertimento; più numeri indicano più avvertimenti. La seconda delle due direttive, serve a inviare una copia di tale messaggio di avvertimento anche all’amministratore, specificato attraverso il suo indirizzo di posta elettronica. IdleBoot n_minuti PPPIdleBoot n_minuti n_byte Dovrebbe essere conveniente interrompere le connessioni che risultano inattive (idle). Si distingue tra le connessioni da terminale normale, rispetto a quelle che usano il PPP. Nel secondo caso non è facile determinare bene che la connessione sia inattiva, per cui si stabilisce una quantità di byte minima che deve transitare attraverso la connessione in un dato intervallo di tempo, per poter affermare che la connessione sia ancora utilizzata effettivamente. SmartTime SessionSmartTime TimeClassSmartTime Acua 4391 Le direttive booleane mostrate, se utilizzate, specificano che l’applicazione delle regole riferite al tempo di utilizzo, al tempo di connessione e ai tempi nelle fasce orarie, è subordinata all’effettiva necessità di limitare il carico del sistema. Il risultato pratico è che quando il sistema non è carico eccessivamente, i contatori di utilizzo delle risorse di tempo relative non vengono incrementati. In effetti, si distinguono due situazioni fondamentali per cui si utilizza Acua: un ISP che offre un servizio a pagamento; un ente che offre l’accesso alle persone che ne fanno parte. Nel primo caso, è improbabile che venga offerto un accesso smart, mentre nel secondo dovrebbe essere logico questo tipo di approccio. Queste direttive si riferiscono rispettivamente alle variabili ‘SMARTTIME’, ‘SSMARTTIME’ e ‘TCSMARTTIME’. SmartBoot SessionSmartBoot TimeClassSmartBoot IdleSmartBoot A differenza delle direttive precedenti, l’utilizzo di queste non interrompe il conteggio dell’utilizzo delle risorse, ma evita la chiusura di una connessione se il carico del sistema non lo richiede. In questo caso, si può anche evitare di imporre l’eliminazione di una connessione inattiva (idle), se il carico del sistema non lo richiede. Queste direttive si riferiscono rispettivamente alle variabili ‘SMARTBOOT’, ‘SSMARTBOOT’, ‘TCSMARTTIME’ e ‘ISMARTBOOT’. TimeClass fascia_oraria ... La definizione delle fasce orarie è fondamentale, perché nelle indicazioni annotate per ogni utente, si può fare riferimento solo a fasce orarie definite con questa direttiva: la prima, la seconda, la terza,... Una fascia oraria è composta dall’indicazione dei giorni della settimana a cui si riferisce e dall’intervallo orario. I giorni della settimana si esprimono attraverso un numero, dove lo zero corrisponde a domenica, mentre gli orari si esprimono in ore e minuti, uniti con un punto. Per esempio, ‘0-6:0.0-24.0’ indica ogni momento di qualunque giorno della settimana, mentre ‘1-5:8.0-18.0’ rappresenta la fascia oraria che va dalle 8:00 alle 18:00 dei giorni lavorativi normali (dal lunedì al venerdì). Generalmente, dovrebbe essere sufficiente l’indicazione delle fasce orarie standard che appaiono già nel file di configurazione che accompagna Acua. TimeClass 0-6:0.0-24.0 1-5:8.0-18.0 1-5:19.0-22.0 6-0:0.0-24.0 Infine, è fondamentale escludere alcuni utenti dalle interferenza di Acua. Per la precisione, si possono escludere alcuni utenti dalle scansioni fatte attraverso il comando ‘acua forEach’, che verrà descritto in seguito. Si tratta evidentemente degli utenti di sistema, oltre a utenti che hanno compiti di amministrazione di qualunque tipo. ForEachExclude utente ... La direttiva può essere usata anche più volte, in modo da poter suddividere un elenco molto lungo. È molto importante osservare bene il proprio file ‘/etc/passwd’ per segnalare tutti gli utenti di sistema e tutti gli amministratori presenti effettivamente. A titolo di esempio, viene mostrata una configurazione possibile, in cui, come si noterà, non si concedono privilegi di tipo smart. Acua 4392 # Controlla l’accesso attraverso gli pseudoterminali e i terminali seriali. Devices ttyp0 64 ttyS0 64 # Elimina le utenze inutilizzate da 6 mesi (180 giorni). PurgeDays 180 # La deduzione minima per collegamento è di un minuto. MinDeduct 1 # Il sistema viene considerato carico (impegnato) quando non ci sono # più linee dial-up (di accesso telefonico) libere. BusyThreshold 0 # Mappa le priorità di CPU secondo la classificazione di Acua. CPUpriority 19 -20 # Il nome del nodo presso cui risiedono le caselle postali degli # utenti a cui inviare i messaggi di avvertimento. #MailHost posta.mio.dominio # Avvisa della scadenza attraverso la posta elettronica: due settimane # prima, una settimana prima e un giorno prima. WarnExpire 14 7 1 # Avvisa anche l’amministratore. #WarnExpireCC [email protected] # Vengono concessi al massimo 15 minuti di inattività. IdleBoot 15 # Attraverso la connessione PPP, vengono concessi un massimo di 15 minuti # di inattività; per determinarlo si stabilisce che si arriva a questo # se sono stati trasferiti meno di 15360 byte (1 Kibyte al minuto). PPPIdleBoot 15 15360 # # # # # # # # # Non viene concesso alcun privilegio «smart». SmartTime SessionSmartTime TimeClassSmartTime SmartBoot SessionSmartBoot TimeClassSmartBoot IdleSmartBoot # Si fissano le fasce orarie standard. # fascia 0: 24 ore da lunedì a domenica # fascia 1: dalle 8 alle 18, da lunedì a venerdì # fascia 2: dalle 19 alle 22, da lunedì a venerdì # fascia 3: 24 ore da sabato a domenica TimeClass 0-6:0.0-24.0 1-5:8.0-18.0 1-5:19.0-22.0 (orario di ufficio) (prima serata) (fine settimana) 6-0:0.0-24.0 # Esclude gli utenti di sistema e di amministrazione dalle scansioni # fatte attraverso «acua forEach». ForEachExclude root bin daemon adm lp sync shutdown halt mail news uucp ForEachExclude operator games gopher ftp nobody postgres exim ForEachExclude daniele Acua 4393 387.2.3 Creazione ed eliminazione degli utenti La creazione e l’eliminazione degli utenti gestiti da Acua, deve essere predisposta attraverso due script che vanno modificati opportunamente. Anche questa fase è da considerare parte della configurazione. Eventualmente, gli utenti potrebbero essere inseriti nel controllo di Acua anche in modo differente, ma è importante che lo script di cancellazione, ‘acua_deluser’, funzioni correttamente, dal momento che può essere utilizzato dal demone per eliminare le utenze scadute e quelle inutilizzate da molto tempo. 387.2.3.1 Creazione con acua_adduser acua_adduser utente [numero_telefonico ] Si tratta di uno script preparato per una shell di Bourne e quindi compatibile anche con la shell Bash. #! /bin/sh Nella prima parte vengono definite alcune variabili, attraverso cui diventa più facile impostare i parametri essenziali per l’utilizzo di ‘acua addRec’, che verrà descritto più avanti. DEFAULT_EXPIRY=0 DEFAULT_TLIMIT=120 DEFAULT_SLIMIT=120 DEFAULT_PRIORITY=4 La variabile ‘DEFAULT_EXPIRY’ permette di indicare quanto tempo è valida la registrazione dell’utenza (questo viene espresso generalmente in giorni). Lo zero rappresenta l’assenza di una scadenza. Le variabili ‘DEFAULT_TLIMIT’ e ‘DEFAULT_SLIMIT’ servono a indicare rispettivamente il tempo complessivo a disposizione e il tempo massimo di sessione. Il valore si esprime in minuti e nell’esempio i dati coincidono, a indicare che l’utente ha a disposizione due ore che può impiegare anche completamente in una sola sessione. Più avanti, dopo la definizione di alcune funzioni, inizia l’acquisizione degli argomenti forniti. Se non si indica il numero telefonico, viene utilizzato il valore -1. Ciò che si ottiene sono le variabili ‘LOGIN’ e ‘PH_NO’, contenenti rispettivamente il nominativo-utente da creare e il suo numero di telefono. Infine viene creato l’utente, attraverso ‘adduser’ (se si usano le password shadow si tratterà di un collegamento a ‘useradd’) e poi viene registrato all’interno di Acua, utilizzando i parametri indicati con le variabili già viste. # Crea l’utente adduser $LOGIN || err # Registra l’utente in Acua acua addRec $LOGIN $DEFAULT_EXPIRY $DEFAULT_TLIMIT $DEFAULT_SLIMIT \ $DEFAULT_PRIORITY "$PH_NO" || err # Impone l’indicazione della password passwd $LOGIN || err # Cambia la shell #chsh -s /bin/zsh $LOGIN || err # Accumula le informazioni finger chfn $LOGIN exit 0 Questa parte richiede attenzione. Per prima cosa occorre notare la modifica della shell dell’utente. A parte la scelta proposta dall’autore di Acua, che vorrebbe fosse utilizzato ‘zsh’ da tutti, se si tratta della creazione di utenze per l’accesso attraverso la linea commutata, è molto probabile che 4394 Acua non possa trattarsi di una shell comune, dovendo essere piuttosto uno script di connessione per l’attivazione del PPP. Inoltre, come si vedrà in seguito a proposito di ‘acua addRec’, non appare definito l’utilizzo delle fasce orarie, cosa che si colloca dopo l’indicazione del numero telefonico. Una volta definite le politiche cui sottoporre gli utenti, è possibile predisporre degli script diversi, in funzione delle diverse categorie che si desiderano gestire. 387.2.3.2 Eliminazione con acua_deluser acua_deluser utente Questo script è più importante di quello di creazione, soprattutto perché potrebbe essere avviato dal demone ‘acua_updated’ (attraverso il comando ‘acua delUser’). Inoltre, è anche più delicato, perché va direttamente a modificare i file ‘/etc/passwd’, ‘/etc/group’ e ‘/etc/ shadow’. A proposito dell’intervento nel file ‘/etc/group’, occorre verificare se gli utenti fanno parte di un gruppo comune, o se si applica la politica dei gruppi privati, in cui ogni utente ha un proprio gruppo. Infatti, solo nel secondo caso ha senso eliminare il gruppo dell’utente che viene cancellato. acua kickUser $LOGIN acua delRec $LOGIN Per prima cosa, come si vede, l’utente viene disconnesso, mentre subito dopo viene rimosso dal registro di Acua. Successivamente si passa all’eliminazione vera e propria dell’utente, come si vede sotto. Il problema sta nel verificare che tutto corrisponda alla realtà del proprio sistema. L’esempio mostrato sotto è un po’ diverso rispetto al contenuto standard di questo script; in particolare, si fa riferimento ai gruppi privati, per cui viene eliminato anche il gruppo che abbia lo stesso nome dell’utente. # Si modifica opportunamente la maschera umask per motivi di sicurezza. umask 077 # Si fa una copia di sicurezza del file /etc/passwd cp -f /etc/passwd /etc/passwd.orig # Toglie il record dell’utente dal file /etc/passwd grep -v \^$LOGIN: /etc/passwd > /etc/passwd.$$ mv /etc/passwd.$$ /etc/passwd # Sistema la proprietà e i permessi chown root.root /etc/passwd ; chmod 644 /etc/passwd # Se esiste il file /etc/shadow, cerca di intervenire anche lì. if [ -f /etc/shadow ]; then # Si fa una copia di sicurezza del file /etc/shadow cp -f /etc/shadow /etc/shadow.orig # Toglie il record dell’utente dal file /etc/passwd grep -v \^$LOGIN: /etc/shadow > /etc/shadow.$$ mv /etc/shadow.$$ /etc/shadow # Sistema la proprietà e i permessi chown root.root /etc/shadow ; chmod 400 /etc/shadow Acua 4395 fi # Si fa una copia di sicurezza del file /etc/group cp -f /etc/group /etc/group.orig # Cerca di eliminare le tracce dell’utente dal file /etc/group: # sia le aggregazioni nei gruppi, sia il suo gruppo privato. gawk -v login=$LOGIN ’{ if ($0 ~ ".*" login ".*") { if ($0 !~ "^" login ":.*") { gsub("," login, ""); gsub(":" login, ":"); print; } } else print; }’ /etc/group > /etc/group.$$ mv /etc/group.$$ /etc/group # Sistema la proprietà e i permessi chown root.root /etc/group ; chmod 644 /etc/group Infine, si eliminano la directory personale dell’utente e la casella di posta elettronica. Anche questi due elementi possono essere delicati per il proprio sistema; infatti, non è detto che le directory personali degli utenti si trovino necessariamente nella directory ‘/home/’, così come la posizione della casella postale non è ovvia. # Elimina la directory home e il file della casella postale rm -rf /home/$LOGIN rm -f /var/mail/$LOGIN 387.2.4 Filtro di ingresso Acua deve avere il modo di impedire l’accesso agli utenti che hanno esaurito le loro risorse, inoltre deve essere «avvisato» quando l’utente accede. Per questo si interviene normalmente attraverso la shell, oppure attraverso lo script che ne prende il posto. Per comprendere il problema, si immagini il controllo di un accesso normale attraverso un terminale, dove l’utente corrispondente ha una shell Bash. In tal caso, si può modificare il file ‘/etc/ profile’ di questa shell per inserire il comando: /usr/sbin/acua_login || logout In pratica, sarebbe come se fosse stato scritto quanto segue: if ! /usr/sbin/acua_login then logout fi 387.3 Gestione Tutti i comandi di Acua che possono servire per la sua gestione sono filtrati dall’eseguibile ‘acua’, che a seconda del primo argomento si comporta in modi molto differenti. Spesso, l’eseguibile ‘acua’ deve avviare a sua volta altri eseguibili, o anche degli script; quando si tratta di operazioni che non possono essere accessibili agli utenti comuni, i permessi che contano sono dati proprio da questi programmi avviati successivamente da ‘acua’. In queste sezioni verranno mostrati solo alcuni dei comandi di Acua, a volte anche in modo approssimativo. Per gli altri si può consultare la documentazione originale, che su questo punto è sufficientemente dettagliata. Acua 4396 387.3.1 # acua addUser acua addUser utente ‘acua addUser’ permette di creare un nuovo utente, registrandolo anche sotto Acua. Questo comando, tuttavia, richiama semplicemente lo script ‘acua_adduser’, che come già spiegato, deve essere modificato opportunamente. Non c’è alcuna necessità di utilizzare il comando ‘acua addUser’, in quanto lo script da solo è più che sufficiente. Anzi, potrebbero essere preparati più script per diversi tipi di utenti che si vogliono poter inserire nel sistema. È bene ricordare che dipende dallo script se poi è necessario intervenire ulteriormente oppure no. Per esempio, potrebbe essere necessario definire la parola d’ordine dell’utente e forse anche la shell, tenendo conto del tipo di accesso che viene consentito all’utente. 387.3.2 # acua delUser acua delUser utente ‘acua delUser’ permette di eliminare un utente registrato anche sotto Acua. Questo comando, tuttavia, richiama semplicemente lo script ‘acua_deluser’, che come già spiegato, deve essere modificato opportunamente. Non c’è alcuna necessità di utilizzare il comando ‘acua delUser’, in quanto lo script da solo è più che sufficiente. 387.3.3 # acua addRec acua addRec utente scadenza tempo_massimo ←,→ sessione_massima priorità telefono limite_di_fascia ... [ [ [ [ ]]]] ‘acua addRec’ permette di aggiungere un utente nel registro di Acua. Viene chiamato all’interno dello script ‘acua_adduser’ e può essere usato direttamente per aggiungere il controllo di un utente che è già stato inserito nel sistema (ma non ancora sotto il controllo di Acua). Sono obbligatori solo i primi tre argomenti (dopo ‘addRec’), mentre a partire dal quarto, sono obbligatori solo gli argomenti precedenti a quello che si vuole inserire (per esempio, non si può saltare il numero telefonico e inserire i limiti di fascia oraria). 1. utente Il nome utilizzato dall’utente per identificarsi all’atto dell’accesso. 2. scadenza Rappresenta la scadenza dell’utenza secondo Acua (indipendente da quanto indicato nel file ‘/etc/shadow’). La scadenza può essere definita attraverso un numero, che rappresenta normalmente una quantità di giorni, oppure in modo esplicito, nella forma ‘aa/mm /gg’ (anno/mese/giorno), dove l’anno può utilizzare solo due cifre numeriche. Se si indica un numero, questo può anche essere seguito da una lettera, per esprimere: ‘d’, giorni (predefinito); ‘m’, mesi; ‘y’, anni. La scadenza è riferita sempre alla fine dell’unità indicata, ma per difetto; per esempio, nel caso si indichino mesi, la scadenza si riferisce Acua 4397 alla fine del mese finale, includendo il mese in corso, anche se questo è già a metà, oppure oltre. Per inibire la scadenza, basta utilizzare il valore zero. Questo valore viene annotato nella variabile ‘expire’. 3. tempo_massimo Il tempo massimo concesso all’utente. Tale durata si esprime in minuti. Se si indica il valore -1, si intende una durata indefinitamente grande. Questo valore viene annotato nella variabile ‘tLimit’. 4. sessione_massima Stabilisce la durata massima della sessione. Anche questo valore si esprime in minuti. Se non viene specificato, si assume corrisponda al tempo massimo. Questo valore viene annotato nella variabile ‘sLimit’. 5. priorità Fissa la priorità di questo utente, che si esprime con un valore che va da zero a sette, dove lo zero esprime il trattamento peggiore. Questo valore può tradursi in una diversa priorità di CPU, secondo quanto definito nel file di configurazione, con la direttiva ‘CPUpriority’. Se è così, dovrebbe essere sconveniente tentare di utilizzare priorità di Acua che poi si traducono in priorità di CPU negative. In generale, il valore predefinito per questa priorità di Acua è quattro. Questo valore viene annotato nella variabile ‘priority’. 6. numero_telefonico Questo argomento è dedicato al numero telefonico dell’utente. A quanto pare, Acua accetta solo un formato particolare che non è indicato nella documentazione; inoltre, è probabile che tale informazione possa essere ottenuta anche da utenti comuni che hanno accesso al sistema, mentre si presume che si tratti di una notizia riservata. Si può trascurare questo argomento, indicando eventualmente il valore zero, o -1. Questo valore viene annotato nella variabile ‘phNo’. 7. limite_di_fascia ... Gli ultimi argomenti sono in quantità variabile e dipendono delle fasce orarie definite nel file di configurazione generale. Se si lasciano le fasce orarie standard, se ne hanno a disposizione quattro e per ognuna di queste può apparire un argomento che definisce il limite relativo. Per ogni fascia oraria può essere indicato un valore che corrisponde al limite di tempo consentito per gli accessi, espresso in minuti. Evidentemente, tale limite si sostituisce a quello generico definito con il terzo argomento di questo comando. In alternativa si possono indicare i valori seguenti: • 0 viene usato per impedire l’accesso in quella fascia oraria; • -1 rappresenta l’utilizzo del limite di tempo stabilito in modo generico (il terzo argomento del comando) ed è il dato predefinito; • -2 fa in modo che in quella fascia oraria non venga calcolato il tempo di sessione, mentre il tempo complessivo continua a esserlo; • -3 fa in modo che in quella fascia oraria non venga calcolato né il tempo di sessione né il tempo complessivo. Acua 4398 Molte informazioni che riguardano l’utente non possono essere indicate attraverso ‘acua addRec’. Queste possono essere specificate in modo predefinito nel file di configurazione (‘/etc/acua/acua.config’) e poi possono essere modificate attraverso ‘acua modRec’. Esempi # acua addRec pippo 365 120 120 4 0 -1 -1 -1 -1 Registra l’utente ‘pippo’ all’interno della gestione di Acua, specificando una scadenza dell’utenza dopo 365 giorni, con un tempo massimo di accesso (probabilmente giornaliero) di due ore, un tempo massimo di sessione di due ore, un livello di priorità pari a quattro, senza telefono e senza limitazioni riferite alle fasce orarie (gli ultimi quattro -1). # acua addRec pippo 365 120 Esattamente come nell’esempio precedente, perché gli argomenti mancanti corrispondono ai valori predefiniti. # acua addRec pippo 365 120 120 4 0 -1 0 -1 -1 Come nell’esempio precedente, con la differenza che l’utente ‘pippo’ non può accedere nella seconda fascia oraria (il valore zero). # acua addRec pippo 365 120 120 4 0 -1 60 -1 -1 Come nell’esempio precedente, con la differenza che l’utente può utilizzare solo un’ora nella seconda fascia oraria. # acua addRec pippo 10/01/01 120 120 4 0 -1 -1 -1 -1 Registra l’utente ‘pippo’ all’interno della gestione di Acua, specificando la scadenza dell’utenza nel primo gennaio del 2010. Gli altri dati sono uguali a quelli del primo esempio. 387.3.4 # acua modRec acua modRec [-s] utente altri_argomenti Il comando ‘acua modRec’ è molto importante e può articolarsi in forme molto differenti. Il suo scopo è quello di modificare la configurazione di un utente, soprattutto su particolari che non possono essere definiti attraverso ‘acua addRec’. In questa sezione verranno mostrate solo alcune delle possibilità di questo comando. Per un dettaglio maggiore si può provare a consultare la documentazione originale. L’azione di ‘acua modRec’ è limitata a ciò che si specifica, senza alcuna verifica della congruenza di ciò che si fa. Per fare un esempio, se si decide di aumentare il tempo totale concesso a un utente, è anche probabile che gli si voglia aumentare il tempo totale rimasto a disposizione, altrimenti il risultato pratico potrebbe non corrispondere a quanto inteso. A questo proposito, è bene usare sempre ‘acua viewRec’ dopo ogni modifica, per verificare che la situazione dell’utente corrisponda a quanto voluto. Caratteristiche generali acua modRec utente scadenza tempo_massimo [sessione_massima [priorità [limite_di_fascia ...]]] In questo modo è possibile definire gli elementi principali riferiti alla registrazione di un certo utente. Come si può osservare, è quasi uguale alla sintassi di ‘acua addRec’, con la differenza che non è prevista l’indicazione del telefono. Acua 4399 Purtroppo, questa forma di utilizzo di ‘acua modRec’ non funziona sempre come dovrebbe. In particolare, potrebbero essere cancellate le fasce orarie e potrebbe anche essere impossibile modificarle successivamente. Se questo dovesse succedere, probabilmente l’unica possibilità di rimediare è l’uso di ‘acua delRec’ seguito da ‘acua addRec’, utilizzando i valori corretti; successivamente, come si può leggere sotto, attraverso ‘acua modRec’ usato nella sua sintassi alternativa, si possono ripristinare i valori corretti per quanto riguarda le risorse già utilizzate. Modalità acua modRec utente {+|-}modalità Le informazioni legate agli utenti prevedono la presenza di molte variabili booleane, corrispondenti a modalità che possono essere attivate o disattivate. Come si può intuire, il simbolo ‘+’ davanti a un nome attiva la modalità corrispondente, mentre il segno ‘-’ la disattiva. È possibile definire una configurazione predefinita per queste modalità, attraverso il file di configurazione generale, anche se i nomi utilizzati non sono gli stessi. Di seguito appare l’elenco di alcuni di questi nomi di modalità, per ciò che riguarda ‘acua modRec’. • ‘SMARTTIME’ Equivale alla direttiva ‘SmartTime’; permette di non incrementare il conteggio della durata globale di utilizzo del servizio se il carico del sistema non risulta eccessivo. • ‘SSMARTTIME’ Equivale alla direttiva ‘SessionSmartTime’; permette di non incrementare il conteggio della durata della sessione se il carico del sistema non risulta eccessivo. • ‘TCSMARTTIME’ Equivale alla direttiva ‘TimeClassSmartTime’; permette di non incrementare il conteggio della durata di utilizzo riferito alla fascia oraria corrispondente se il carico del sistema non risulta eccessivo. • ‘SMARTBOOT’ Equivale alla direttiva ‘SmartBoot’; consente all’utente di restare nel sistema quando il tempo complessivo è esaurito se il carico del sistema non risulta eccessivo. • ‘SSMARTBOOT’ Equivale alla direttiva ‘SessionSmartBoot’; consente all’utente di restare nel sistema quando il tempo massimo per una singola sessione è esaurito se il carico del sistema non risulta eccessivo. • ‘TCSMARTBOOT’ Equivale alla direttiva ‘TimeClassSmartBoot’; consente all’utente di restare nel sistema quando il tempo complessivo riferito alla fascia oraria è esaurito se il carico del sistema non risulta eccessivo. • ‘ISMARTBOOT’ Equivale alla direttiva ‘IdleSmartBoot’; consente all’utente di restare nel sistema quando il tempo massimo di inattività è stato superato se il carico del sistema non risulta eccessivo. • ‘WARNBOOT’ Equivale alla direttiva ‘WarnBoot’; fa sì che l’utente sia avvisato dell’imminente disconnessione. Acua 4400 • ‘EXPLAINBOOT’ Equivale alla direttiva ‘ExplainBoot’; fa sì che l’utente venga informato del motivo per cui è stato disconnesso. Questa informazione viene fornita attraverso un messaggio di posta elettronica e, se possibile, anche attraverso il terminale, quando il tipo di accesso lo consente. Assegnamento di valori a opzioni acua modRec utente variabile {=|+=|-=} valore Oltre alle modalità (booleane), sono annotate una serie di informazioni che possono essere modificate con un assegnamento (‘=’), con un incremento (‘+=’) o con un decremento (‘-=’). La maggior parte di queste indicazioni sono definite in modo preliminare nel file di configurazione generale, mentre altre riguardano la contabilizzazione degli accessi e vengono gestite dinamicamente in base all’utilizzo da parte dell’utente. Di seguito appare l’elenco di alcune di queste variabili. • ‘priority’ Definisce il livello di priorità dell’utente. • ‘maxLogins’ Il numero massimo di accessi simultanei (di solito ne viene consentito uno solo). • ‘PPPidleByte’, ‘PPPidleMin’ La connessione PPP viene considerata inattiva se sono stati trasmessi meno di ‘PPPidleByte’ byte in ‘PPPidleMin’ minuti. Nel file di configurazione può essere usata la direttiva ‘PPPIdleBoot’ per definire entrambi questi valori. • ‘tLimit’, ‘tLeft’ L’accesso a queste due variabili permette di modificare rispettivamente il tempo massimo a disposizione e il tempo rimasto, alterando così quanto contabilizzato da Acua. • ‘sLimit’, ‘sLeft’ L’accesso a queste due variabili permette di modificare rispettivamente il tempo massimo di sessione e il tempo di sessione rimanente, alterando così quanto contabilizzato da Acua. • ‘cLimit’, ‘cLeft’ L’accesso a queste due variabili permette di modificare rispettivamente il tempo massimo di fascia oraria e il tempo di fascia rimanente, alterando così quanto contabilizzato da Acua. • ‘bTx’, ‘bRx’ Definiscono la quantità di byte trasmessi e ricevuti (upload, download). Intervenendo su questi valori si altera la contabilizzazione di Acua. • ‘bTxLimit’, ‘bRxLimit’ Definiscono il limite massimo di byte trasmessi e ricevuti (upload, download). • ‘bLimit’ Definisce il limite massimo di byte che possono transitare (la somma di quelli trasmessi e di quelli ricevuti). • ‘bStxLimit’, ‘bStxLimit’ Definiscono il limite massimo di byte trasmessi e ricevuti per sessione (upload, download). Acua 4401 • ‘bSLimit’ Definisce il limite massimo di byte che possono transitare per sessione (la somma di quelli trasmessi e di quelli ricevuti). Esempi # acua modRec pippo 10/01/01 12000 12000 4 -1 60 -1 -1 Modifica l’impostazione dell’utente ‘pippo’, fissando la scadenza al 1/1/2010, definendo il tempo massimo complessivo e anche quello di sessione in 200 ore (12000 minuti), indicando il livello di priorità (4) e le fasce orarie (nella seconda viene concesso di accedere per un’ora). Purtroppo, è probabile che questo comando non funzioni, pur essendo corretto sintatticamente. Se ‘acua modRec’ non risponde correttamente a questa forma della sintassi, non ci sono altri rimedi che farne a meno. # acua modRec pippo +EXPLAINBOOT Attiva la modalità ‘EXPLAINBOOT’ per l’utente ‘pippo’. # acua modRec pippo -WARNBOOT Disattiva la modalità ‘WARNBOOT’ per l’utente ‘pippo’. # acua modRec pippo tLimit = 24000 Modifica il tempo complessivo concesso, portandolo a 400 ore (24000 minuti). # acua modRec pippo tLeft = 24000 Modifica il tempo complessivo rimanente, portandolo a 400 ore (24000 minuti). 387.3.5 # acua subscribe acua subscribe utente scadenza tempo_massimo [sessione_massima [priorità [limite_di_fascia ...]]] Per motivi di praticità, è possibile definire una registrazione aggiuntiva che si sovrappone alla situazione esistente dell’utente a cui viene applicata. Quando l’utente è «iscritto», tutte le modifiche che possono essere fatte attraverso ‘acua modRec’ si riferiscono a questo strato aggiuntivo, che ha effetto fino alla scadenza stabilita (l’argomento che segue l’indicazione dell’utente), oppure fino a quando si utilizza ‘acua unsubscribe’. È importante chiarire che tutte le modifiche apportate quando è attiva l’iscrizione, vengono perdute nel momento in cui questa viene rimossa, riportando tutto allo stato precedente. Esempi # acua subscribe pippo 05/01/01 24000 24000 4 -1 120 -1 -1 Modifica temporaneamente l’impostazione dell’utente ‘pippo’, fissando la scadenza di queste modifiche al 1/1/2005, definendo il tempo massimo complessivo e anche quello di sessione in 400 ore (24000 minuti), indicando il livello di priorità (4) e le fasce orarie (nella seconda viene concesso di accedere per due ore). Come nel caso di ‘acua modRec’, è probabile che questo comando, pur essendo corretto sintatticamente, non funzioni, andando a modificare in modo errato i tempi assegnati alle fasce orarie Acua 4402 387.3.6 # acua unsubscribe acua unsubscribe utente Elimina lo strato aggiunto attraverso l’iscrizione di un utente, riportando il suo stato a quello esistente prima di quel momento. 387.3.7 # acua delRec acua delRec utente Toglie un utente dal controllo di Acua, cancellando la registrazione corrispondente. Di solito, viene utilizzato direttamente dallo script ‘acua_deluser’, ovvero dal comando ‘acua delUser’. 387.3.8 # acua viewRec acua viewRec [utente] ‘acua viewRec’ permette di conoscere lo stato dell’utente specificato, o di quello che ha avviato il comando. Per farlo si avvale di ‘acua_viewRec’. Il problema di questo comando è che può essere utilizzato da qualunque utente, cosa che potrebbe essere interpretata come una violazione della riservatezza personale. È importante decidere se rendere pubbliche tali informazioni o meno. Se si vuole evitarlo, basta che il programma ‘acua_viewRec’ abbia i permessi di esecuzione esclusivamente per l’utente ‘root’. Segue un esempio riferito all’utente ‘tizio’, appena creato, al quale viene concesso un tempo complessivo e un tempo di sessione di 200 ore (12000 minuti), inoltre, nella seconda fascia oraria gli viene concesso di accedere solo per un’ora. Per quanto riguarda le altre risorse non sono stati stabiliti limiti particolari; la scadenza dell’utenza è il giorno 1/1/2010. login: util: online: phone: priority: flags: uflags: maxLogins: idleLimit: time: class: data: data TX: data RX: creation: expiry: lock: subscr: last log: last on: tizio 0.00% NO N/A 4 [TCSMARTBOOT WARNBOOT EXPLAINBOOT] [] 1 [maxDeduct = 1] [TTY = 00:15] [PPP = 15360 bytes in 00:15] total: [200:00 + 00:00 / 200:00] session: [200:00 / 200:00] [-00:01 / +INF] [01:00 / 01:00] [-00:01 / +INF] [-00:01 / +INF] total: [0.00 KB / +INF] session: [0.00 KB / +INF] total: [0.00 KB / +INF] session: [0.00 KB / +INF] total: [0.00 KB / +INF] session: [0.00 KB / +INF] Sat Jan 2 21:42:23 1999 DELETE in 4016.10 days [Fri Jan 1 00:00:00 2010] N/A N/A Sat Jan 2 21:42:23 1999 -0.00 days [Sat Jan 2 21:42:23 1999] Acua 4403 387.3.9 # acua forEach acua forEach [opzioni] comando ‘acua forEach’ permette di scandire l’elenco degli utenti, eseguendo per ognuno di loro il comando posto alla fine degli argomenti. ‘acua forEach’ esclude dalla scansione gli utenti indicati espressamente nel file di configurazione generale con la direttiva ‘ForEachExclude’. All’interno del comando da eseguire attraverso ‘acua forEach’ è possibile passare il nome dell’utente per il quale viene eseguito, inserendo il simbolo ‘{}’, come si fa con ‘find’ per passare il nome del file trovato. Come al solito, può darsi che le parentesi graffe debbano essere protette dall’interpretazione della shell, come succede se si usa la shell Bash. Alcune opzioni -u Specifica che deve essere fatta la scansione dei soli utenti per i quali esista effettivamente una registrazione all’interno di Acua. Esempi # acua forEach -u acua modRec \{\} expire = 1y Scandisce ogni utente registrato con Acua e gli assegna la scadenza dell’utenza alla fine dell’anno in corso. # acua forEach acua addRec \{\} 1y 120 Scandisce tutti gli utenti, esclusi quelli indicati nella configurazione generale con la direttiva ‘ForEachExclude’, allo scopo di aggiungerli alla gestione di Acua, assegnando la scadenza dell’utenza alla fine dell’anno in corso, concedendo un tempo massimo di due ore (120 minuti). 387.4 Funzionamento Il funzionamento quotidiano di Acua è attuato dal demone ‘acua_updated’, il quale si avvale di altri programmi e script, e da ‘acua_login’ che annota immediatamente l’ingresso di un utente, o gli impedisce di accedere. 387.4.1 # acua_updated acua_updated [opzioni] ‘acua_updated’ è il demone che controlla l’utilizzo del sistema, esegue le operazioni di contabilizzazione, interrompe le connessioni quando necessario ed eventualmente elimina gli utenti. Per compiere queste funzioni si avvale eventualmente dei comandi ‘acua sync’, ‘acua purge’ e ‘acua expire’. Generalmente, ‘acua_updated’ viene avviato senza opzioni, o al massimo con l’opzione ‘-a’, allo scopo di evitare che vengano compiute operazioni di manutenzione che implicano l’utilizzo di ‘acua sync’, ‘acua purge’ e ‘acua expire’, lasciando all’amministratore il compito di provvedere a queste cose. Acua 4404 387.4.2 # acua sync acua sync ‘acua sync’ serve a sincronizzare le informazioni di Acua con il file ‘/etc/passwd’, allo scopo di eliminare registrazioni riferite a utenti che non esistono più. In generale, questo comando dovrebbe essere eseguito periodicamente da ‘acua_updated’. 387.4.3 # acua purge acua purge giorni ‘acua purge’ elimina le utenze che risultano inutilizzate dal numero di giorni indicato come argomento. Viene usato generalmente in modo automatico da ‘acua_updated’, che a sua volta utilizza quanto definito nella configurazione. 387.4.4 # acua expire acua expire ‘acua expire’ elimina le utenze scadute, oppure le iscrizioni scadute. In pratica, se un utente ha un’iscrizione scaduta, viene eseguito ‘acua unsubscribe’, se invece è scaduta proprio la registrazione, allora l’utente viene eliminato attraverso ‘acua delUser’ (cosa che poi avvia il solito script ‘acua_deluser’). ‘acua expire’ viene eseguito normalmente attraverso ‘acua_updated’, in modo da rendere automatica l’operazione. 387.4.5 $ acua_login acua_login [utente] acua_login < terminale ‘acua_login’ deve essere utilizzato per autorizzare l’accesso degli utenti controllati da Acua. Se l’utente non è autorizzato, ‘acua_login’ restituisce un valore diverso da zero (Falso) e questo viene sfruttato per realizzare uno script per controllare l’accesso, come già mostrato all’inizio del capitolo. L’avvio di ‘acua_login’ è necessario anche per inizializzare alcuni valori riferiti all’utente nel sistema di Acua e quindi non se ne può fare a meno. ‘acua_login’ può essere avviato senza l’indicazione esplicita dell’utente, se il processo appartiene all’utente stesso; in alternativa, si può fornire a ‘acua_login’ il dispositivo del terminale da cui accede l’utente, sempre allo scopo di riconoscerlo. ‘acua_login’ dipende dalle informazioni contenute nei file ‘/var/run/utmp’ e ‘/var/ log/wtmp’; se per qualche motivo questi non vengono aggiornati correttamente, ‘acua_login’ non riesce a verificare l’accesso da parte dell’utente e restituisce il valore Falso. Esempi #!/bin/sh Acua 4405 /usr/bin/mesg n /bin/stty -tostop # Verifica che l’utente possa accedere. if /usr/sbin/acua_login then # L’utente viene accolto. echo Benvenuto $LOGNAME else # L’utente viene estromesso. logout fi # Attiva la connessione PPP. echo "Viene attivata la connessione PPP." exec /usr/sbin/pppd crtscts modem noauth refuse-chap refuse-pap \ debug proxyarp idle 600 Lo script che si vede è un esempio di shell per un utente che sfrutta la connessione per attivare un collegamento PPP, alla fine della procedura di autenticazione tradizionale. #! /bin/sh # /etc/ppp/ip-up #... if ! /usr/sbin/acua_login < $DEVICE then kill -15 "$PPID" exit fi Quello che si vede sopra è una parte di un ipotetico script ‘/etc/ppp/ip-up’. Questo viene avviato da ‘pppd’ dopo la connessione e serve nel caso l’autenticazione avvenga attraverso il protocollo PPP stesso. In particolare, la variabile di ambiente ‘DEVICE’ contiene il percorso assoluto del dispositivo di terminale attraverso il quale l’utente accede, mentre la variabile ‘PPID’ contiene il numero del processo corrispondente a ‘pppd’. 387.4.6 $ acua renew acua renew [opzioni] ‘acua renew’ viene usato per azzerare i conteggi riferiti a tutti gli utenti. Se non vengono utilizzate le opzioni, si azzera tutto ciò che può esserlo. Alcune opzioni -c Azzera i conteggi riferiti alle fasce orarie. Di solito, il tempo a disposizione riferito a una fascia oraria determinata, viene inteso come utilizzabile nell’arco delle 24 ore, per cui è opportuno eseguire il comando ‘acua renew -c’ ogni giorno, attraverso il sistema Cron. -d Azzera i conteggi riferiti ai trasferimenti di dati. -t Azzera i conteggi riferiti al tempo complessivo. Acua 4406 387.5 Altra configurazione È possibile personalizzare meglio il funzionamento di Acua intervenendo su altri file, oltre a quello di configurazione generale. All’interno della directory ‘/etc/acua/’ (ma potrebbe trattarsi invece di ‘/usr/lib/acua/’) dovrebbero trovarsi altri file di configurazione, assieme ai messaggi che possono essere generati da Acua (per avvisare l’utente dell’imminente disconnessione, o di altre cose). Se si vuole utilizzare Acua professionalmente, diventa indispensabile tradurre tali file. A titolo di esempio, viene mostrato il contenuto del file ‘/usr/lib/acua_viewRec’, quello utilizzato per generare il rapporto di ‘acua viewRec’. login: util: online: phone: priority: flags: uflags: maxLogins: idleLimit: time: class: data: data TX: data RX: creation: expiry: lock: subscr: last log: last on: $login $overallUtilization $online $phNo $priority [$flags] [$uflags] $maxLogins [maxDeduct = $maxDeduct] [TTY = $idleLimit] [PPP = $PPPidleBytes bytes in $PPPidleMinutes] total: [$tLeft + $credit / $tLimit] session: [$sLeft / $sLimit] [$cLeft0 / $cLimit0] [$cLeft1 / $cLimit1] [$cLeft2 / $cLimit2]... total: [$bXfer / $bLimit] session: [$bSxfer / $bSlimit] total: [$bTx / $bTxLimit] session: [$bStx / $bStxLimit] total: [$bRx / $bRxLimit] session: [$bSRx / $bSrxLimit] $creationDate $expireAction $lockInfo $subscriptionInfo $lastLogin $lastOnDays days [$lastOnline] Si intuisce il senso delle variabili, anche se la maggior parte di queste non sono documentate. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Indice analitico del volume /etc/smb.conf, 4369 8hz-mp3, 4383 Acua, 4386 acua addRec, 4396 acua addUser, 4396 acua delRec, 4402 acua delUser, 4396 acua expire, 4404 acua forEach, 4403 acua modRec, 4398 acua purge, 4404 acua renew, 4405 acua subscribe, 4401 acua sync, 4404 acua unsubscribe, 4402 acua viewRec, 4402 acua_adduser, 4393, 4396 acua_deluser, 4394, 4396 acua_login, 4404 acua_updated, 4403 controllo accessi, 4386 MP3, 4383 Mpg123, 4383 NetBIOS, 4366, 4371, 4374 nmbd, 4367, 4368 RIFF WAV, 4381 SMB, 4366 smbclient, 4372 smbmount, 4378 smbstatus, 4372 smbumount, 4380 Wavplay, 4381 wavplay, 4381 wavrec, 4381 WAV-RIFF, 4381 xanim, 4384 Xanim, 4384 xltwavplay, 4382 xltwavrec, 4382 4407 4408 Appunti di informatica libera 2003.01.01 Volume X LDR: Linux domande e risposte FAQ su GNU/Linux in italiano Gaetano Paolone <[email protected]> 3.0 (2001.08.10) 4409 Gaetano Paolone è laureato in Odontoiatria e protesi dentaria ed esercita in qualità di libero professionista in Roma. Nel tempo libero si dedica all’informatica ed in particolare a quella libera. Gaetano Paolone LDR: Linux Domande e Risposte Copyright © 1999-2001 Gaetano Paolone bigpaul @ linuxfaq.it This information is free; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This work 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. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this work; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Una copia della licenza GNU General Public License, versione 2, si trova nell’appendice A. L’immagine di copertina è una realizzazione di Alessandra Toti. L’autore chiede che ogni riproduzione cartacea dell’opera contenga questa immagine in copertina. Nomi e marchi citati nel testo sono generalmente depositati o registrati dalle rispettive case produttrici. 4410 non modificare Dedicato a tutti coloro che si battono ogni giorno per l’affermazione del software libero... 4411 Le copie cartacee LDR: Linux Domande e Risposte sono reperibili nei centri GNUtemberg!. I centri GNUtemberg! sono quei centri che vendono copie stampate di documentazione libera non ancora ufficialmente pubblicata da case editrici. Presso <http://www.gnutemberg.org> o <http:// www.gnutenberg.org> sono reperibili più informazioni su questo progetto ed è reperibile anche un elenco dei centri più vicini. GNUtemberg! 4412 L’indirizzo della versione aggiornata delle LDR: Linux Domande e Risposte è: <http://www.linuxfaq.it> Riproduzioni aggiornate del sito suddetto sono inoltre disponibili presso i seguenti siti: • Pluto (sezione ILDP): <http://www.pluto.linux.it/ildp/LDR/>; • inter.linux: <http://linux.interpuntonet.it/linux/LDR/>; • ziobudda.net: <http://www.ziobudda.net/mirror/linuxfaq/>; • king.rett.polimi.it/~ant/linuxfaq/: <http://king.rett.polimi.it/~ant/linuxfaq/>; Chiunque volesse mantenere una riproduzione aggiornata del sito delle LDR, può farlo liberamente, eventualmente segnalandolo all’autore. La versione 2000.04.12 di Appunti Linux di Daniele Giacomini ospita nell’ultimo tomo dell’opera, il corpo della versione 2.4 delle LDR. La versione 2000.07.31 di Appunti di Informatica Libera di Daniele Giacomini ospita negli ultimi due tomi dell’opera, il corpo della versione 2.8 delle LDR free e nonfree. LDR nei CD-ROM delle riviste: • CD-ROM n° 52-1 inter.net (v. 1.8); • CD-ROM 87-1 PC-Action (v. 2.2); • CD-ROM n° 56-1 inter.net (v. 2.2); • CD-ROM n° 1 Linux Magazine (v. 2.6); • CD-ROM n° 13 Linux Magazine (v. 2.9); • tutti i CD-ROM contenenti le versioni 2000.04.12 di Appunti Linux e 2000.07.31 di Appunti di Informatica Libera. La diffusione di questo documento è incoraggiata in base ai termini della licenza. 4413 388 Amministrazione del sistema 388.1 Installazione di GNU/Linux 388.1.1 Come si copiano o come si creano i dischetti di avvio (boot)? 388.1.2 Come si creano i dischetti di installazione di una distribuzione GNU/Linux Debian? 388.1.3 Come si creano i dischetti di installazione di una distribuzione GNU/Linux Red Hat da Dos? 388.1.4 Perché ‘FIPS.EXE’ non funziona all’interno di una finestra Dos? 388.1.5 Cosa significa il problema del limite dei 1024 cilindri?5 388.1.6 Perché dopo avere spostato il disco con MS-Windows e dopo averlo collocato come primario slave, MS-Windows non parte più? Ho aggiornato le impostazioni di LILO ma riesco ad avviare solamente GNU/Linux. 388.1.7 Come si fa a esportare il CD-ROM durante l’installazione via NFS? 388.2 Avvio e arresto del sistema 388.2.1 Come si arresta il sistema? Come si riavvia? 388.2.2 Come si disabilita il supporto per l’APM in fase di avvio? 388.2.3 È possibile fermare l’arresto o il riavvio del sistema dopo averne dato il comando? 388.2.4 Esiste un modo per rendere più repentino l’arresto del sistema? 388.2.5 Come si concede a tutti gli utenti la possibilità di arrestare il sistema? 388.2.6 Come si concede a tutti gli utenti la possibilità di riavviare il sistema? 388.2.7 Come si può impedire agli utenti del sistema di impartire il riavvio mediante la combinazione di tasti [ Ctrl+Alt+Canc ]? 388.2.8 Come funziona ‘install-mbr’ in una distribuzione GNU/Linux Debian? 388.2.9 Come è possibile avviare un sistema GNU/Linux da un sistema Dos/MSWindows? 388.2.10 Come si avvia GNU/Linux dal Boot Manager di MS-Windows NT? 388.2.11 Ho impostato involontariamente il livello di esecuzione (runlevel) a zero e il sistema inizia la procedura di arresto non appena ha terminato l’avvio. Che posso fare? 388.2.12 Come è possibile fare spegnere la macchina alla fine del processo di arresto? 388.2.13 Come è possibile far spegnere la macchina se si dispone di una scheda madre ‘Soyo 5-EM’ o ‘Soyo 5 ema’? 388.2.14 È possibile avviare la procedura di arresto del sistema con una combinazione di tasti? 388.2.15 Perché in alcune distribuzioni tutti gli utenti hanno la facoltà di impartire il comando ‘halt’? 388.2.16 Come è possibile visualizzare messaggi o loghi all’avvio di GNU/Linux? 388.2.17 KERNEL PANIC: VFS: Unable to mount root fs on 03:03 388.2.18 Perché dopo la ricompilazione del kernel viene visualizzato un messaggio di kernel panic? 388.2.19 swapon: warning: /dev/hda1 has insecure permissions 0660, 0600 suggest 388.2.20 Parallelizing fsck version x.yy /dev/hdxy: UNEXPECTED INCONSISTENCY; R 388.3 Tipi di file system e partizioni 5 questione risolta con le recenti versioni di LILO 4414 388.3.1 Come si fa a indicare che alcune directory del file system sono distribuite su dispositivi differenti? 388.3.2 Come si visualizza la struttura del file system? 388.3.3 Come si crea un file system Ext2 nella terza partizione del secondo disco fisso IDE/EIDE? 388.3.4 Come si verifica se ci sono settori danneggiati su partizioni con file system Ext2? 388.3.5 Come si possono ridimensionare le partizioni con file system Ext2? 388.3.6 Come si può creare da GNU/Linux un file system Dos-FAT? 388.3.7 Come si verifica la presenza di settori danneggiati in una partizione contenente un file system Dos-FAT? 388.4 Swap 388.4.1 Se si avesse bisogno di ulteriore spazio ‘swap’, come si aggiunge? 388.5 Montare i dischi 388.5.1 Operazioni con un dischetto Dos (file system vfat) 388.5.2 Non riesco a montare dischetti con file system Ext2; se uso dischetti con file system Dos invece non ho problemi, perché? 388.5.3 Come si può montare una partizione con file system NTFS (MS-Windows NT)? 388.5.4 Come si monta una partizione contenente MS-Windows 2000? 388.5.5 Come si fa a dare agli utenti il permesso di montare il lettore dischetti e il lettore CD-ROM? 388.5.6 Ma cosa cambia se si mette ‘user’ o ‘users’ nei campi di ‘/etc/fstab’? 388.5.7 Come si concedono tutti i permessi di una partizione ad ogni utente del sistema? 388.5.8 No final new line in /etc/fstab 388.5.9 Come si fa a montare automaticamente i dischi all’avvio? 388.5.10 Come è possibile montare le partizioni Dos/MS-Windows 9x (file system vfat)? 388.5.11 Effettuando il login da un’altra console, si ottengono a volte numerosi messaggi relativi a dispositivi già montati. Come si possono eliminare? 388.5.12 Come è possibile accedere a partizioni GNU/Linux (file system Ext2) da MS-Windows? 388.6 LILO 388.6.1 Installazione e configurazione di LILO 388.6.2 Come posso avviare Linux con un dischetto di avvio, in maniera veloce? 388.6.3 Come si installa LILO in una posizione diversa da quella attuale? 388.6.4 Come si elimina LILO? 388.6.5 Come si fa a scegliere quale sistema operativo avviare in maniera predefinita con LILO? 388.6.6 Come è possibile con LILO gestire più distribuzioni GNU/Linux sullo stesso sistema? 388.6.7 Come si deve configurare LILO se sulla macchina è installato anche MSWindows NT? 388.6.8 Come si configura LILO se si vuole installare una distribuzione GNU/Linux sul primo disco fisso e MS-Windows su un altro? 4415 388.6.9 Se si reinstalla MS-Windows, il MBR contenente LILO verrà sovrascritto; come posso prevenire questo problema? 388.6.10 Come si può impostare una password per LILO? 388.6.11 Perché digitare «linux 1» al prompt di LILO consente l’accesso al sistema senza richiesta di password? 388.6.12 ‘Error 0x10’ - visualizzazione di ripetuti 01 con LILO 388.6.13 Da cosa può dipendere se si riceve la segnalazione della presenza di un virus nel settore di avvio (boot)? 388.6.14 Ci sono delle valide alternative a LILO? 388.7 Kernel 388.7.1 Come si può sapere quale è l’ultima versione del kernel? 388.7.2 Come si visualizza la versione del kernel in uso? 388.7.3 Come è possibile conoscere il nome del file dell’immagine del kernel che è stata caricata? 388.7.4 Come si ricompila il kernel? 388.7.5 Come funziona la ricompilazione del kernel in una distribuzione GNU/Linux Debian? 388.7.6 Cosa succede se copio la nuova immagine del kernel in ‘/boot’ ma lì c’è la vecchia immagine? 388.7.7 Quanto spazio occupa il sorgente del kernel? Si può cancellare dopo la ricompilazione? 388.7.8 Come si applica una patch al kernel? 388.7.9 Dopo avere applicato una patch al kernel, la procedura di ricompilazione subisce dei cambiamenti? 388.7.10 Durante la ricompilazione del kernel, viene segnalata la mancanza di ‘wish’, perché? 388.7.11 Dopo avere ricompilato il kernel, come è possibile provare senza rischio l’immagine appena creata? 388.7.12 Si può trasportare l’immagine del kernel da una distribuzione ad un’altra? 388.7.13 A cosa serve il file ‘initrd-x.x.xx.img’ nella directory ‘/boot’? 388.7.14 Il kernel di Linux è in grado di gestire periferiche USB? 388.7.15 Come è possibile ottimizzare il kernel per macchine con processore Pentium? 388.7.16 Dove si trovano i sorgenti del kernel? 388.7.17 Perché sopraggiungono dei problemi relativi a ‘ipfwadm’ con i kernel della serie 2.2.x ? 388.7.18 Perché nei kernel della serie 2.2.x non è presente l’opzione drop sourcerouted frames? 388.7.19 Come si verifica quali sono i pacchetti RPM del kernel installati? 388.7.20 Come si possono memorizzare gli eventuali messaggi (di errore e non) che possono risultare dalla procedura di ricompilazione del kernel? 388.7.21 Perché dopo la ricompilazione del kernel c’è una diminuzione dello spazio nel disco? 388.7.22 Dove devo copiare il file ‘System.map’ e che operazioni devo compiere su di esso? 388.7.23 Come si possono gestire più file ‘System.map’ quando si dispone di più immagini del kernel? 4416 388.7.24 Perché il sistema mi avverte che la versione del file ‘System.map’ è sbagliata? 388.7.25 as86 Command not found 388.7.26 /dev/lp0 :not detected 388.7.27 signal 11 388.7.28 No setup Signature found 388.8 Moduli 388.8.1 Cosa si deve fare per i moduli dopo la ricompilazione del kernel? 388.8.2 Come si possono caricare i moduli del kernel all’avvio? 388.8.3 modprobe: can’t locate module... 388.9 Configurazione del sistema 388.9.1 Come è possibile mantenere sulla propria macchina più di una distribuzione GNU/Linux? 388.9.2 Esiste la deframmentazione in GNU/Linux? 388.9.3 Quali sono le differenze tra i file ‘/etc/profile’, ‘~/.bashrc’, ‘~/ .bash_profile’ e ‘~/.inputrc’? 388.9.4 Come si rendono disponibili anche per gli utenti le modifiche fatte al file ‘/etc/bashrc’? 388.9.5 Dopo aver modificato un file di configurazione, è necessario riavviare il sistema per rendere effettive le modifiche? 388.9.6 Perché alcune modifiche apportate al sistema durante situazioni di emergenza non sono riscontrabili al riavvio? 388.9.7 Come vengono gestiti i servizi in una distribuzione GNU/Linux Debian? 388.9.8 Come si lancia un programma durante la fase di avvio di una distribuzione GNU/Linux Debian? 388.9.9 Come vengono gestiti i servizi in una distribuzione GNU/Linux Red Hat? 388.9.10 Come si possono disattivare i servizi in Red Hat? 388.9.11 Come si fanno ripartire i demoni se si sono modificati i file di configurazione? 388.9.12 Come si cambia il nome della macchina? 388.9.13 Come si imposta l’orologio? 388.9.14 Come si mantiene aggiornato l’orologio? 388.9.15 Cosa si deve fare per impostare l’ora legale in GNU/Linux? 388.9.16 Come si visualizza un calendario? 388.9.17 Come è possibile attivare ad ogni avvio la spia della tastiera relativa al tasto [ BlocNum ]? 388.9.18 Si può cancellare il contenuto della directory ‘/tmp/’ o è pericoloso? 388.9.19 Come si visualizza lo spazio disponibile su disco? 388.9.20 Come si possono visualizzare le variabili d’ambiente? 388.9.21 Come si impostano le variabili d’ambiente? 388.9.22 Come si possono visualizzare le librerie usate da un programma? 388.9.23 Come mi devo comportare se un applicativo mi chiede una libreria di una versione più vecchia di quella attualmente installata nel mio sistema? 388.9.24 C’è un modo per evitare di scrivere ogni volta comandi molto lunghi utilizzati di frequente? 388.9.25 Esiste la possibilità di sospendere (ibernare) un sistema GNU/Linux? 4417 388.10 Utenti e password 388.10.1 Dove sono raccolte le informazioni sugli utenti del sistema? 388.10.2 Dove sono raccolte le informazioni sui gruppi di utenti del sistema? 388.10.3 In che modo è possibile rimuovere un account di un utente? 388.10.4 Come si cancellano tutti i file di un utente presenti nel sistema? 388.10.5 Come si fa a diventare momentaneamente un altro utente? 388.10.6 Come si cambia la propria password? 388.10.7 Come si cambia la password degli utenti del sistema? 388.10.8 Cosa sono le password shadow? 388.10.9 Come si può evitare la richiesta della password all’avvio? 388.10.10 Come si può evitare la richiesta del login e della password all’avvio? 388.10.11 Cosa si deve fare se si dimentica la password di ‘root’? 388.10.12 A cosa serve il file ‘/etc/.pwd.lock’? 388.10.13 Come si fa a sapere chi è connesso attualmente al sistema? 388.10.14 Come si cambia proprietario di un file? 388.10.15 Come si cambia il gruppo di un file? 388.11 Permessi 388.11.1 Come si conferisce il permesso di esecuzione ad un file? 388.11.2 Come si conferisce il permesso di lettura ad un file? 388.11.3 Come si conferisce il permesso di scrittura ad un file? 388.11.4 Come si conferiscono i permessi alle directory? 388.11.5 Qual è il significato del permesso di esecuzione di una directory? 388.11.6 Come posso concedere i permessi di lettura e scrittura su partizioni vfat agli utenti del sistema? 388.11.7 Come si impostano i permessi predefiniti dei file e delle directory? 388.12 File, collegamenti (link) e directory 388.12.1 Come si copiano i file? 388.12.2 Come si cancellano i file? 388.12.3 Come si spostano i file? 388.12.4 Qual è in GNU/Linux l’equivalente di ‘DIR *.HTML /S’ del Dos? 388.12.5 Come si può evitare la cancellazione di un file da parte dell’utente ‘root’? 388.12.6 Come si esegue la copia di un’intera porzione del file system? 388.12.7 Esiste la funzione undelete in GNU/Linux? 388.12.8 In che posizione del file system mi trovo? 388.12.9 Come si visualizza il contenuto di un file? 388.12.10 Come si visualizza la riga numero n di un file? 388.12.11 Come si visualizza il contenuto di una directory? 388.12.12 Come si visualizza il contenuto di una directory a colori? 388.12.13 Come si visualizza il contenuto della directory corrente e delle sue discendenti compreso di percorso? 388.12.14 Come si visualizza il contenuto di tutti i file di una directory? 388.12.15 Come si visualizza il contenuto di uno stesso file presente in diverse directory? 388.12.16 Perché ‘less’ disattiva la colorazione di ‘ls’? 388.12.17 Come si crea un file vuoto? 4418 388.12.18 Come si uniscono più file di testo? 388.12.19 Come si fa a conoscere il tipo di un file? 388.12.20 Come si può mettere il contenuto di un file in ordine alfabetico? 388.12.21 Come si creano le directory? 388.12.22 Come si cancellano le directory? 388.12.23 Cosa sono gli attributi estesi? È vero che se conferiti ad un file, ne impediscono la cancellazione anche da parte dell’utente ‘root’? 388.12.24 Come ci si sposta tra le directory del file system? 388.12.25 Quali sono le differenze tra collegamenti soft e hard? 388.12.26 Come si crea un collegamento simbolico? 388.12.27 Come si fa a trovare un file in tutto il file system? 388.12.28 Come si fa a trovare un file in una porzione del file system? 388.12.29 Con che comando posso copiare un file dopo averlo ricercato nel file system? 388.12.30 Quali sono i file della directory corrente che contengono una stringa? 388.12.31 Quali sono i file del file system che contengono una stringa? 388.12.32 Come si visualizzano i nomi dei file che iniziano con una determinata stringa? 388.12.33 Come si possono suddividere in più parti i file di grandi dimensione? 388.13 Configurazione della console 388.13.1 Come si utilizzano le variabili nella shell Bash? 388.13.2 Come si può personalizzare il prompt? 388.13.3 Esempi di prompt 388.13.4 Come si disabilita una console virtuale? 388.13.5 Che significato hanno gli apici inversi (‘) nella shell? 388.13.6 Come funziona ‘history’, lo storico dei comandi? 388.13.7 Come si possono reindirizzare i messaggi di ‘/dev/console’ su un’altra console? 388.13.8 Come si può impostare la modalità grafica della console? 388.13.9 shell-init: could not get current directory: getcwd: cannot access par 388.14 File di log 388.14.1 Come si visualizzano i registri (log) degli accessi? 388.14.2 Di chi si occupa della registrazione degli eventi del sistema? 388.14.3 Come si possono ricavare informazioni dai file di log? 388.14.4 Si può creare uno script che riduca i file di log? 388.14.5 Si possono inviare i file di log attraverso la posta elettronica? 388.14.6 Come si può ridimensionare ‘/var/log/wtmp’? 388.14.7 Come si reindirizza lo standard error? 388.14.8 Come si possono visualizzare i messaggi che appaiono all’avvio del sistema? 388.15 Cron e At 388.15.1 388.15.2 388.15.3 388.15.4 Come si verifica se Cron è attivo? Come si attiva Cron? Quali sono i file di configurazione del Cron? Come si modificano i file crontab? 4419 388.15.5 Come sono strutturati i file crontab? 388.15.6 Come si visualizzano i file crontab? 388.15.7 Come si cancellano i file crontab? 388.15.8 Come si modificano i file crontab dell’utente ‘tizio’? 388.15.9 Cosa succede se Cron è installato, ma la macchina è spenta? 388.15.10 Si può utilizzare At con applicazioni X? 388.16 Processi ed utilizzo delle risorse del sistema 388.16.1 Perché spesso si nota un improvviso aumento dell’attività del disco fisso e un conseguente rallentamento delle prestazioni del sistema? 388.16.2 Come si ottengono informazioni sulle risorse del sistema? 388.16.3 Quanta memoria e quante risorse sta utilizzando un processo? 388.16.4 Cosa è un ‘fork’? 388.16.5 Cosa è il PID dei processi? 388.16.6 Come si visualizzano i programmi che attualmente sono in esecuzione e come si interrompono? 388.16.7 Come si fa a sapere il PID del processo che tiene occupato un dispositivo? 388.16.8 Come si fa a chiudere un’applicazione bloccata? 388.17 Risoluzione di problemi di una certa entità 388.17.1 Storia di un recupero della tavola delle partizioni 388.18 Caratteri speciali 388.18.1 Come si fanno le parentesi graffe? 388.18.2 Come si fa la tilde? 388.19 Documentazione di aiuto 388.19.1 Come si possono ricercare parole chiave nelle pagine di manuale (man)? 388.19.2 Come si convertono le pagine di manuale in PostScript? 388.19.3 Come si stampano le pagine di manuale? 389 Reti e rete Internet 389.1 Generalità e configurazione di una rete locale 389.1.1 Come si imposta un dominio virtuale? 389.1.2 Come si può controllare il traffico giornaliero del sistema? 389.1.3 Come si abilita il masquerading in una rete locale? 389.1.4 Come si predispone un firewall? 389.1.5 Perché non riesco ad uscire dalla rete locale attraverso il gateway? Ho configurato tutto con attenzione ma non ci riesco. Perché? 389.2 FTP 389.2.1 Come si può fornire agli utenti solamente l’accesso FTP al sistema ma non un accesso Telnet? 389.2.2 Come si può impedire l’accesso tramite FTP ad alcuni utenti? 389.2.3 Dopo essersi connessi ad un sistema remoto, come si fa a mantenere attivo un comando FTP una volta disconnessi dal sistema stesso? 389.2.4 Come si può realizzare un comando che invii ogni minuto un file via FTP? 389.2.5 Come si concede il permesso di caricare file durante una sessione FTP? 389.2.6 Descrizione di uno script che permette di automatizzare diverse operazioni FTP. 4420 389.3 Telnet 389.3.1 Come si può visualizzare cosa digita un utente collegato in Telnet? 389.3.2 Si può permettere l’accesso Telnet al proprio sistema anche mediante un’altra porta? 389.3.3 Si può accedere ad una macchina solo da un terminale remoto? 389.3.4 Ci si può collegare attraverso Telnet a una macchina remota accedendo come utente ‘root’? 389.3.5 C’è un’alternativa più sicura a Telnet? 389.3.6 Perché alcuni servizi di rete (Telnet, FTP, ecc.) sono molto lenti? 389.3.7 Si possono automatizzare dei comandi da eseguire su un sistema remoto cui si abbia accesso attraverso Telnet? 389.3.8 Come funziona la registrazione degli accessi avvenuti tramite Telnet alle macchine? 389.3.9 Come si impedisce l’accesso al sistema tramite Telnet? 389.4 SSH 389.4.1 Come si copiano i file con SSH? 389.4.2 Come si copiano intere porzioni di file system (directory) con SSH? 389.5 La condivisione delle risorse in rete 389.5.1 Perché non riesco a montare i file system delle macchine di una rete locale? 389.5.2 Come si fa ad utilizzare un’applicazione grafica (che giri sotto il server X) presente su una macchina della rete cui è collegata la propria macchina? 389.5.3 Come si può utilizzare il display di un utente su quello di un altro? 389.5.4 Come si copiano i file tra le macchine di una rete locale? 389.6 Terminali 389.6.1 Come si possono simulare dei terminali sulla propria macchina? 389.6.2 terminal type not supported 389.7 Server web (Apache, ecc.) 389.7.1 Perché il mio navigatore non interpreta affatto i tag (marcatori) HTML dei file presenti nel mio server? 389.7.2 Come vengono gestite le variabili tra due pagine PHP? 389.7.3 Come si configura il server Apache per gestire le pagine scritte in PHP? 389.7.4 Come si configura il server Apache per gestire le pagine scritte in ASP? 389.7.5 Esiste un modo per convertire le pagine scritte in ASP in PHP? 389.7.6 Come si fa a proteggere alcune pagine HTML da una password? 389.8 Samba 389.8.1 Quale password deve essere inserita se si accede attraverso Samba da una macchina MS-Windows a una GNU/Linux? 389.8.2 Qual è un esempio di ‘smb.conf’ ben configurato? 389.8.3 Come si ricevono i messaggi di WinPopUp con LinPopUp? 389.8.4 Perché non si vedono le icone delle macchine GNU/Linux in ‘Risorse di Rete’ di MS-Windows? 389.8.5 Come si copiano i file tra una macchina GNU/Linux e una MS-Windows collegate attraverso Samba? 389.8.6 Come si fa a stampare da una macchina GNU/Linux collegata ad una rete MS-Windows tramite Samba? 4421 389.8.7 Se ci si collega da una macchina MS-Windows ad una GNU/Linux, vorrei che venisse chiesta la password solo per le directory degli utenti e non per la directory indicata in ‘[public]’. Come si fa? 389.8.8 Come si deve configurare il file ‘smb.conf’ per dare un nome mediante il name server NetBIOS alla macchina Linux collegata ad una rete servita da un server DHCP? 389.9 Plip 389.9.1 Come si imposta il MTU (Max Transfer Unit ) di una connessione tramite protocollo PLIP? 389.10 Connessione al provider - ppp 389.10.1 Esiste un programma che faciliti la connessione al provider in una distribuzione GNU/Linux Debian? 389.10.2 Come si può verificare se nel sistema è stato installato il protocollo PPP? 389.10.3 Come si possono visualizzare in tempo reale i processi di connessione al provider? 389.10.4 pppd: The remote system is required to authenticate itself but... 389.10.5 Si possono ottenere dei dati sulla connessione ad Internet? 389.10.6 Perché durante l’avvio di ‘kppp’ ( KDE 2.x ) viene visualizzato un errore relativo al timeout? 389.10.7 Perché ‘kppp’ (KDE 2.x ) non riesce a creare il file di lock? 389.10.8 Perché lanciando da utente ‘kppp’ (KDE 2.x ), viene chiesta la password di ‘root’? 389.10.9 Come può un utente qualsiasi utilizzare ‘kppp’ (KDE 2.x )? 389.10.10 Come si visualizza il proprio indirizzo IP? 389.10.11 Si può estrapolare solamente l’indirizzo IP da ‘ifconfig’? 389.10.12 Come si ottengono gli indirizzi DNS dei provider? 389.10.13 Se ci si connette ad Internet con più di un provider, occorre cambiare ogni volta gli indirizzi DNS nel file ‘/etc/resolv.conf’? 389.10.14 Cosa si deve fare se il provider assegna automaticamente gli indirizzi DNS? 389.10.15 Perché pur essendo connessi a Internet il navigatore non riesce a connettersi ai siti? 389.10.16 no dialtone 389.10.17 Come si possono automatizzare alcune operazioni da effettuare durante la connessione ad Internet? 389.10.18 Come ci si connette ad Internet con gli script? 389.10.19 Esempio degli script per la connessione ad un provider 389.10.20 Perché in Red Hat viene composto due volte il numero telefonico del provider? 389.10.21 Perché utilizzando ‘ppp’ per il collegamento ad Internet, compare una casella di dialogo che avverte che il demone ‘pppd’ non è installato con il set user ID? Che vuol dire? 389.10.22 Perché il collegamento ad Internet con ‘diald’ fallisce per problemi di autentificazione? 389.10.23 Una volta essere riusciti ad aver stabilito un collegamento funzionante ad Internet, quali sono i file di configurazione e gli script che conviene conservare? 389.10.24 Perché utilizzando il ‘dialup configuration tool’ della Red Hat 6.1 il sistema si blocca? 4422 389.10.25 Se si utilizzano diversi provider per connettersi ad Internet, come si possono invertire rapidamente gli script di connessione in una distribuzione Red Hat? 389.10.26 Se si utilizzano diversi provider per connettersi ad Internet, come si possono gestire gli script di connessione? 389.11 Connessione remota tra macchine 389.11.1 Come si predispone un accesso da linea commutata a una macchina GNU/Linux? 389.11.2 Come ci si sconnette da un sistema remoto lasciando attivi alcuni processi? 389.12 Posta elettronica 389.12.1 Come si configura il sistema per poter scaricare e smistare i messaggi di posta elettronica? 389.12.2 Come si configura Fetchmail? 389.12.3 Come si possono spedire messaggi all’interno di una rete locale facendo risultare un indirizzo esterno? 389.12.4 Come si indirizzano correttamente i messaggi scaricati con Procmail in una directory ben precisa? 389.12.5 Come si installa e come si configura Postfix? 389.12.6 You have new mail 389.12.7 Perché la macchina esita a lungo su Sendmail all’avvio? 389.12.8 Qual è l’indirizzo cui fare ‘telnet’ per verificare la configurazione di Sendmail nei confronti dello spam? 389.12.9 Come si può inviare un file di testo compresso in allegato con un unico comando? 389.12.10 Come si può associare un file di testo ad un messaggio da riga di comando? 389.12.11 Come si possono inviare messaggi ad intervalli di tempo regolare? 389.12.12 Come si possono eliminare i duplicati di posta elettronica? 389.12.13 Cosa è il file ‘~/.forward’? 389.12.14 Si può scegliere la firma (signature) in modo casuale? 389.12.15 Perché i client di posta delle macchine di una rete locale non riescono ad inviare i messaggi al di fuori della rete stessa? 389.12.16 Come si scarica la posta con Mutt? 389.12.17 Come si spedisce con Mutt un file allegato da riga di comando? 389.12.18 Come si personalizza in Mutt, la stringa che introduce il messaggio riportato? 389.12.19 Come si configura in Mutt, la stringa che indica il vecchio oggetto del messaggio in caso di sostituzione dello stesso? 389.12.20 Come si può automatizzare lo scaricamento della posta? 389.13 Navigatori (browser) 389.13.1 Come si imposta lo sfondo di Lynx? 389.13.2 Come si ricarica una pagina (reload) con Lynx? 389.14 Gruppi di discussione (newsgroup) 389.14.1 Leafnode - Come si possono leggere i messaggi dei gruppi di discussione una volta scollegati? 389.14.2 skipping it.xxx.yyy from now on 389.15 IRC - chat 4423 389.15.1 Come si possono controllare le intrusioni al sistema che possono verificarsi con frequenza durante l’utilizzo di programmi per IRC? 389.16 Scaricamento file - riproduzione (mirror) di siti 389.16.1 Quali sono i programmi per GNU/Linux che si devono utilizzare per scaricare i file ad intervalli? 389.16.2 Come si riprende con Wget uno scaricamento interrotto? 389.16.3 Come si riprende uno scaricamento interrotto da un sito FTP? 389.16.4 Come si crea una riproduzione speculare (mirror) di un sito? 389.16.5 Come si fornisce utente e password a Wget per scaricare un file da un sito FTP? 389.16.6 Si può utilizzare Wget con i proxy? 389.16.7 Come si può automatizzare lo scaricamento di file in orari particolari? 390 Programmi 390.1 Installazione ed esecuzione programmi 390.1.1 Come si installano i programmi? 390.1.2 Come si evita di mettere sempre ‘./’ davanti al nome di un eseguibile? 390.1.3 Come si fa a non far chiudere i programmi lanciati da un terminale grafico alla chiusura del terminale stesso? 390.1.4 Come si fa a chiudere il terminale grafico nel momento del lancio di un eseguibile o di un’applicazione? 390.1.5 Dove risiedono realmente nel file system gli eseguibili? 390.1.6 Come si applicano le patch (file delle differenze) ai programmi? 390.1.7 Cosa sono i file ‘.elf’? 390.1.8 È possibile far girare alcune applicazioni di SCO Unixware con Linux? 390.1.9 Dove viene posizionata all’interno del file system la documentazione allegata ai pacchetti? 390.2 File ‘core’ 390.2.1 390.2.2 390.2.3 390.2.4 Cosa sono i file ‘core’? Come si evidenzia il responsabile di un file ‘core’? Si possono disabilitare i file ‘core’? Come si eliminano tutti i file ‘core’? 390.3 I pacchetti - generalità 390.3.1 390.3.2 390.3.3 390.3.4 Come si convertono i pacchetti? Come si possono utilizzare pacchetti RPM in una distribuzione Slackware? Come si possono convertire i pacchetti ‘tar.gz’ in formato RPM? Cosa sono i file ‘.bin’? 390.4 I pacchetti - ‘tar.gz’, ‘tgz’ 390.4.1 390.4.2 390.4.3 390.4.4 390.4.5 Come si installano i programmi distribuiti in pacchetti ‘.tar.gz’ (o ‘.tgz’)? Che differenza c’è tra i pacchetti ‘.tar.gz’ e i pacchetti ‘.tgz’? Come si visualizza il contenuto dei pacchetti ‘.tar.gz’ o ‘.tgz’ Come si decomprimono i pacchetti ‘.tar.gz’ o ‘.tgz’? Come si disinstallano i programmi originariamente installati da pacchetti ‘.tar.gz’ o ‘.tgz’? 390.4.6 Come si creano i propri pacchetti ‘.tar.gz’ o ‘.tgz’? 4424 390.4.7 Come si creano pacchetti ‘.tar.gz’ o ‘.tgz’ nel cui nome venga inserita la data di creazione? 390.4.8 Come si creano i pacchetti ‘.tar.gz’ o ‘.tgz’ sequenziali su dischetti? 390.4.9 Come si ripristinano i pacchetti ‘.tar.gz’ o ‘.tgz’ archiviati su dischetti sequenziali? 390.5 I pacchetti - ‘deb’ 390.5.1 Come si installano i pacchetti Debian? 390.5.2 Come si aggiornano i pacchetti Debian? 390.5.3 Come si disinstallano i pacchetti Debian? 390.5.4 Come si verifica l’installazione dei pacchetti Debian? 390.5.5 Da quale pacchetto Debian proviene un determinato file? 390.5.6 Come si fa a conoscere le dipendenze di un pacchetto Debian installato? 390.5.7 Come si fa ad ottenere la descrizione e l’elenco del contenuto dei pacchetti Debian? 390.5.8 Come si visualizza l’elenco dei pacchetti Debian installati? 390.5.9 Come funziona Dselect? 390.5.10 Come funziona ‘apt-get’? 390.6 I pacchetti - RPM 390.6.1 Come si installano i pacchetti RPM? 390.6.2 Come si aggiornano i pacchetti RPM? 390.6.3 Come si disinstallano i pacchetti RPM? 390.6.4 Come si verifica l’installazione di pacchetti RPM? 390.6.5 Da qual pacchetto RPM viene un determinato file? 390.6.6 Come si ottiene una descrizione di un pacchetto RPM? 390.6.7 Come si visualizza l’elenco dei pacchetti RPM installati? 390.6.8 Come si verifica la corretta installazione di tutti i pacchetti? 390.6.9 Come si può verificare la corrispondenza tra un pacchetto RPM e ciò che è installato? 390.6.10 Come si può installare un pacchetto RPM su destinazione diversa da quella predefinita? 390.7 La compressione - ‘.gz’ ‘.bz2’ ‘.zip’ 390.7.1 Come si comprime un file? 390.7.2 Cosa è un file ‘.gz’? 390.7.3 Cosa è un file ‘.bz2’? 390.7.4 Avendo una serie di file compressi con ‘gzip’, come posso decomprimerli tutti evitando di utilizzare ‘gunzip’ per ognuno? 390.7.5 Cos’è un file ‘.tar.bz2’ e come posso utilizzarlo? 391 X 391.1 Avvio, conclusione, configurazione e risoluzione 391.1.1 Come si cambia desktop manager in una distribuzione GNU/Linux Red Hat? 391.1.2 Come si fa a sapere la versione del server X? 391.1.3 Come si abilita e disabilita il login grafico? 391.1.4 Come si abilita e disabilita il login grafico di una distribuzione GNU/Linux Debian? 4425 391.1.5 Perché l’utente ‘root’ non riesce a lanciare applicazioni grafiche se il server X è stato lanciato da utente comune? 391.1.6 Come si può lanciare un’applicazione che gira sotto X senza attivare il gestore delle finestre? 391.1.7 Come si lancia solamente X, senza gestori delle finestre? 391.1.8 Come si possono catturare le immagini in GNU/Linux? 391.1.9 Come si fa se i caratteri appaiono troppo piccoli in X ad alte risoluzioni? 391.1.10 Come si può risolvere il blocco di X senza riavviare il sistema? 391.1.11 C’è un modo per aumentare le prestazioni del server X? 391.1.12 Come si possono capire gli errori del server X? 391.1.13 Come si imposta la risoluzione predefinita di X? 391.1.14 Come si regola la profondità dei colori in X? 391.1.15 Come si elimina lo schermo virtuale? 391.1.16 Come si passa da una modalità all’altra dello schermo virtuale? 391.1.17 L’immagine in X è decentrata, come posso risolvere questo problema? 391.1.18 Come si apre una console testuale da X? 391.1.19 Come si ritorna alla console grafica (X) dopo avere aperto una console testuale? 391.2 Gnome 391.2.1 Come si chiude contemporaneamente Enlightenment e ‘gnome-panel’? 391.2.2 Come si configura in Gnome l’associazione tra file HTML e le applicazioni deputate a visionarle? 391.3 X - Gestori delle finestre (window manager) 391.3.1 391.3.2 391.3.3 391.3.4 391.3.5 391.3.6 Come si impostano i temi di Enlightenment? Come si richiamano le finestre nascoste in Window Maker? Come si impostano i temi di Window Maker? Come si configura IceWM? Come si aggiungono pulsanti sulla barra di IceWM? Come si imposta lo sfondo di IceWM? 391.4 Terminale grafico (‘xterm’) 391.4.1 Perché le applicazioni lanciate da un terminale grafico scompaiono alla chiusura del terminale stesso? 391.4.2 Come è possibile conferire le stesse impostazioni della console testuale ai terminali grafici? 391.4.3 Come si fa a lanciare un’applicazione da terminale grafico dopo avere assunto l’identità di un altro utente? 391.4.4 Come si impostano i colori del terminale grafico? 391.4.5 Come si impostano in maniera predefinita i colori del terminale grafico? 391.4.6 Perché non funzionano più i terminali grafici? 391.4.7 Come imposto il comportamento del tasto [ Canc ] nel terminale grafico? 391.4.8 Come funziona il ‘copia ed incolla’ in X? 392 Applicazioni 392.1 Editor di testi 392.1.1 Quali sono i comandi essenziali di VI? 4426 392.1.2 Come si configura il numero di caratteri per riga di ‘elvis’ (‘vi’)? 392.2 Applicazioni per comunicazioni telefoniche 392.2.1 Come si cambiano le impostazioni di Minicom? 392.3 Applicazioni fax 392.3.1 ‘no dialtone’ con Efax 392.4 Applicazioni grafica bidimensionale non vettoriale 392.4.1 Come si convertono i file ‘.gif’ in ‘.png’? 392.5 Applicazioni matematiche 392.5.1 Ci sono per GNU/Linux programmi per la matematica, per fare grafici? 392.6 Applicazioni base di dati (database) 392.6.1 Quali sono le differenze tra DB e DBMS? 392.6.2 Perché durante la compilazione di PHP per il supporto di PostgreSQL mi vengono richieste le librerie ‘libpq’? 392.6.3 Unable to connect to PostgresSQL server: connectDB() failed: Is the pos 392.6.4 Perché non tutti gli utenti possono creare archivi PostgreSQL? 392.6.5 Come si possono esportare basi di dati da Microsoft Access a PostgreSQL? 392.6.6 Come si creano gli archivi con PostgreSQL? 392.6.7 Come si fa ad accedere ad un archivio con PostgreSQL? 392.6.8 Unsupported frontend protocol 393 Stampa 393.1 Impostazioni generali 393.1.1 393.1.2 393.1.3 393.1.4 393.1.5 393.1.6 393.1.7 393.1.8 Com’è strutturato il file ‘/etc/printcap’? Perché non vengono trovati i dispositivi ‘/dev/lp?’? Come si configura la stampante in una distribuzione GNU/Linux Red Hat? Come si visualizza la coda di stampa? Come si eliminano i processi di stampa in coda? Come si elimina tutta la coda di stampa? Come si evita l’effetto scalettato nella stampa di testi? Come si evita la stampa dei separatori con il nome dell’utente? 393.2 Stampa da riga di comando 393.2.1 Come si stampa un file da riga di comando? 393.2.2 Come si stampa il contenuto della directory corrente? 393.2.3 Come si stampa un file PostScript da riga di comando? 394 Editoria 394.1 Conversione tra formati 394.1.1 Come si può convertire un file HTML in txt? 394.2 I file PostScript (‘.ps’) 394.2.1 Come si visualizzano i file PostScript in MS-Windows? 394.3 I file ‘.pdf’ 394.3.1 Perché in GNU/Linux con Xpdf i file PDF vengono visualizzati male? 394.4 I File ‘.sgml’ 4427 394.4.1 Perché con ‘sgml2txt’ si trovano spesso parole con lettere ripetute? Si tratta di un’interpretazione scorretta? 394.5 I file ‘.doc’ 394.5.1 Come si leggono e stampano i documenti Microsoft Word in GNU/Linux? 394.6 Compatibilità formati GNU/Linux-Dos 394.6.1 Perché aprendo con Emacs alcuni file di testo creati con programmi Dos, compaiono una serie di ‘^M’ alla fine di ogni riga? 395 I Caratteri (font) 395.1 Impostazioni 395.1.1 Come si fa a cambiare i caratteri del prompt? 395.1.2 Removing unix/:7101 from the valid list of fontpaths 395.1.3 Come si possono utilizzare i caratteri TrueType con XFree86 4? 395.1.4 Come si utilizzano in Linux i caratteri TrueType (XFree86 3.xx)? 395.1.5 Da quale pacchetto derivano i file ‘FS.h’ e ‘FSprolo.h’? Risultano mancanti durante la compilazione di ‘xfstt’? 395.1.6 Come si può richiamare ‘xfstt’ all’avvio di GNU/Linux? 396 Immagini 396.1 Generalità 396.1.1 396.1.2 396.1.3 396.1.4 396.1.5 396.1.6 Come si crea l’immagine di una partizione? Come si crea l’immagine di un dischetto? Come si copia un’immagine su un dischetto? Come si visualizza il contenuto di un’immagine? Come si può inserire file in un’immagine? Si può aggiungere un file ad un’immagine ISO 9660? 397 Masterizzazione 397.1 Masterizzare da riga di comando 397.1.1 397.1.2 397.1.3 397.1.4 397.1.5 397.1.6 397.1.7 397.1.8 Quali sono i comandi comuni per masterizzare con GNU/Linux? Come si masterizza in modalità multisessione? Come si masterizza un CD-ROM audio? Come si utilizza Cdda2wav per estrarre le tracce audio? Come si masterizza on the fly? Come si rende avviabile un CD-ROM? Linux gestisce i CD riscrivibili? Come si formatta un CD riscrivibile? 398 Audio 398.1 Impostazioni 398.1.1 Come si installano i moduli audio ALSA? 398.1.2 Perché non si sente nessun suono dopo l’installazione dei driver ALSA? 398.1.3 Come si alza il volume nelle macchine desktop e nei portatili se si utilizzano i driver ALSA? 398.1.4 Come si regolano in maniera definitiva i toni del mixer? 4428 398.1.5 Come si possono eliminare le segnalazioni acustiche di sistema? 398.2 CD audio 398.2.1 Non riesco a montare i CD audio! 398.3 mp3, wav, ecc. 398.3.1 Quali sono le applicazioni da utilizzare per creare file ‘.mp3’ partendo da brani presenti su CD? 398.3.2 Si possono creare file ‘.mp3’ dai brani presenti in un CD-ROM mediante un comodo script? 398.3.3 Come si possono leggere i tag (marcatori) ‘ID3’ dei file ‘.mp3’? 399 Programmazione 399.1 Script per la shell 399.1.1 Perché il comando ‘cd’ non funziona negli script? 399.1.2 Come si può eseguire uno script di shell attraverso il protocollo HTTP? 399.1.3 Esiste un comando o un sistema per contare le righe presenti in un file di testo? 399.1.4 Esiste un comando o un sistema per contare i caratteri presenti in un file di testo? 399.1.5 Come si fa a sapere lo stato di uscita di un comando? 399.1.6 Che differenza c’è tra ‘$@’ e ‘$#’ all’interno degli script shell? 399.1.7 Come si eliminano le prime n righe o le ultime n righe per numerosi file di testo? 399.1.8 Come si cancellano tutte le righe di un file che cominciano con una determinata stringa? 399.1.9 Come si aggiungono i numeri di riga ad un file di testo? 399.1.10 Come si sceglie un file a caso in una directory? 399.1.11 Come si visualizzano i file modificati negli ultimi n minuti? 399.1.12 Come si ricercano file doppi? 399.1.13 Come si convertono in minuscolo tutti i nomi dei file di una directory? 399.1.14 Come si convertono in minuscolo i nomi dei file nei collegamenti ipertestuali di una pagina HTML? 399.1.15 Come si converte un elenco di nomi di file ‘.html’ in collegamenti ipertestuali? 399.1.16 Come si ordinano le righe di un file di testo al contrario? 399.1.17 Come si utilizza Sed per sostituire il testo? 399.1.18 Quante volte appare una parola in un file? 399.1.19 A cosa serve l’opzione ‘-f’ (if) negli script della shell? 399.1.20 Come si può utilizzare ‘date’ negli script della shell? 399.1.21 Come si fa a cercare tutti i file di un certo tipo (es. ‘*.png’) e a copiarli in una directory? 399.1.22 Come si cambiano le estensioni dei file? 399.1.23 Come si può modificare l’output di ‘pppstats’? 399.1.24 Come si trovano tutti gli indirizzi di posta elettronica in un file HTML? 399.1.25 Come si aggiunge una stringa alla fine di ogni riga di un file testo? 399.1.26 Esempio di uno script per decomprimere file in directory sequenziali. 399.2 Linguaggio C 4429 399.2.1 399.2.2 399.2.3 399.2.4 Cosa sono i file ‘.h’, ‘.o’ e ‘.c’ in un programma C? Come si avvia il compilatore C++? Bus Error Esiste in GNU/Linux il file ‘conio.h’? 399.3 Pascal 399.3.1 Si può convertire un programma scritto in Pascal in C? 399.4 Cobol 399.4.1 Esistono dei compilatori Cobol per GNU/Linux? 399.5 Perl 399.5.1 Come si installano i moduli Perl? 400 Computer portatili 400.1 Problematiche di installazione 400.1.1 Perché non funziona l’audio sul portatile Acer TM 312D? 400.1.2 Perché la tastiera del portatile alla fine dell’installazione di Linux risulta inutilizzabile? 401 Hardware 401.1 Processori 401.1.1 Come si comporta il processore AMD K6 con Linux? 401.2 Monitor 401.2.1 Come si può impostare il risparmio energetico per il monitor? 401.3 Dispositivi video (scheda, telecamera, ecc.) 401.3.1 Sono supportate le schede TV e le schede di acquisizione video in GNU/Linux? 401.3.2 Si può utilizzare la scheda video Matrox G200 AGP in GNU/Linux? 401.3.3 Si può utilizzare la scheda video SiS 6326 in GNU/Linux? 401.4 Tastiera 401.4.1 401.4.2 401.4.3 401.4.4 Come si possono utilizzare i tasti accessori della tastiera in GNU/Linux? Come si imposta la tastiera italiana? Come si impostano le tastiere estere? È possibile generare i caratteri accentati su una tastiera statunitense? 401.5 Mouse 401.5.1 Come si configura un mouse PS/2? 401.5.2 Come si abilita l’utilizzo della rotellina del mouse? 401.6 Disco fisso 401.6.1 Perché i controller UltraATA non vengono riconosciuti? 401.7 CD-ROM e masterizzatori 401.7.1 Come si configura un CD-ROM esterno parallelo in GNU/Linux? 401.7.2 Perché ho problemi con il CD-ROM all’avvio del server X? 401.7.3 Come si configura un masterizzatore connesso all’interfaccia IDE/EIDE? 401.7.4 Qual è il nome del dispositivo generalmente associato a un masterizzatore connesso all’interfaccia IDE/EIDE? 4430 401.7.5 Come si utilizza in GNU/Linux un masterizzatore SCSI? 401.7.6 Qual è il nome del dispositivo generalmente associato a un masterizzatore SCSI? 401.8 Schede di rete 401.8.1 Come si utilizzano schede di rete NE2000 compatibili in GNU/Linux? 401.9 Scheda audio 401.9.1 Come si fa a rilevare le schede audio Plug & Play in GNU/Linux? 401.9.2 Come si fa a rilevare una scheda audio OPTi 82C931 presente su un alloggiamento ISA? 401.9.3 Come si fa ad utilizzare una scheda audio Sound Blaster Live! con GNU/Linux? 401.9.4 Perché il sistema restituisce un errore di ‘device busy’ relativo alla SoundBlaster PCI 128? 401.9.5 Come si configura una SoundBlaster PCI 64V in GNU/Linux? 401.9.6 Come si configura una scheda audio Yamaha OPL3-SAx in GNU/Linux? 401.9.7 Come si configura una scheda Avance Logic ALS 110 in GNU/Linux? 401.9.8 Come si configura una scheda Plug & Play 16 bit ISA SoundBlaster compatibile in GNU/Linux? 401.9.9 Come si fa riconoscere al sistema una scheda audio SoundBlaster 16 Plug & Play? 401.9.10 Come si configurano i driver ALSA per le schede audio SoundBlaster PCI 64V integrate su scheda madre? 401.10 Lettori ZIP 401.10.1 Quale è il nome del dispositivo comunemente associato ad un lettore Iomega ZIP ATAPI installato sul canale master della seconda interfaccia IDE/EIDE? 401.10.2 Come si deve configurare il sistema per far riconoscere un lettore ZIP collegato alla porta parallela? 401.10.3 Quali sono le differenze tra i moduli ‘ppa’ e ‘imm’ dei drive ZIP? 401.11 Nastri 401.11.1 Come si utilizzano le unità a nastro DAT? 401.12 RAM 401.12.1 Quanta RAM è utilizzata e quanta è disponibile? 401.12.2 Come si dichiara la quantità di RAM oltre le 64 Mibyte in proprio possesso? 401.12.3 Perché la dichiarazione della quantità RAM superiore alle 64 Mibyte non funziona? 401.12.4 Come si comporta il sistema se ci sono difetti nella RAM? 401.13 Scanner 401.13.1 Si può utilizzare uno scanner HP 6100C in GNU/Linux? 401.14 Modem 401.14.1 Si possono utilizzare i Win-modem in GNU/Linux? 401.14.2 Cosa si deve configurare per far riconoscere il modem al sistema? 401.14.3 Come si configura il sistema per utilizzare un dispositivo US Robotics ISDN TA? 401.15 Stampante 4431 401.15.1 Quali sono le stampanti utilizzabili con GNU/Linux? 401.15.2 Come si può stampare con una HP Deskjet 720C? 401.15.3 Come si configura il file ‘/etc/printcap’ se si utilizza una stampante Epson Stylus Color? 401.15.4 Cosa va impostato prima della ricompilazione del kernel per permettere al sistema di stampare? 401.16 Periferiche SCSI 401.16.1 Come funziona l’emulazione SCSI per la gestione delle periferiche IDE/EIDE/ATAPI? 401.16.2 Quale opzione del kernel bisogna selezionare se si possiede la scheda SCSI Adaptec 2904? 401.16.3 Cosa si deve configurare per fare riconoscere al sistema il dispositivo SCSI Adaptec 1510A? 401.16.4 Cosa si deve configurare per fare riconoscere al sistema il dispositivo SCSI Adaptec 1505? 401.16.5 Cosa si deve configurare per fare riconoscere al sistema il dispositivo SCSI Adaptec 152x? 401.17 Unità disco 401.17.1 Cosa si deve configurare per fare riconoscere al sistema un’unità LS-120 interna? 401.18 Periferiche Plug & Play 401.18.1 Come si fa ad utilizzare periferiche Plug & Play in GNU/Linux? 401.19 Porte (seriale, parallela, PS/2, USB, ecc.) 401.19.1 401.19.2 401.19.3 401.19.4 401.19.5 401.19.6 Come si ricreano i dispositivi ‘/dev/ttyS0’ e ‘/dev/ttyS1’? Come si ricrea il dispositivo ‘/dev/dsp’? Perché il sistema dice che i dispositivi ‘/dev/cuan ’ sono obsoleti? Come si ricrea ‘/dev/null’? Come si ricreano i dispositivi ‘/dev/lp*’? Come si possono individuare gli indirizzi di IRQ e di I/O? Indice analitico del volume 4432 Capitolo 388 Amministrazione del sistema 388.1 Installazione di GNU/Linux 388.1.1) Come si copiano o come si creano i dischetti di avvio (boot)? Si può leggere il dischetto creando un’immagine in un file: # dd if=/dev/fd0 of=floppy.img[ Invio ]1 Quindi si può utilizzare il file dell’immagine copiandolo in un altro dischetto già inizializzato a basso livello: # dd if=floppy.img of=/dev/fd0[ Invio ] In alternativa si può usare ‘mkbootdisk’, per crearne uno nuovo, ecco un esempio per il kernel 2.2.7: # mkbootdisk --device /dev/fd0 2.2.7[ Invio ] Oppure ancora: # cp bzImage /dev/fd0[ Invio ]2 Per indicare la partizione del disco fisso su cui dovrà essere montato il file system principale (‘/’) si deve utilizzare il comando ‘rdev’: # rdev /dev/fd0 /dev/partizione [ Invio ]3 Infine occorre ricordarsi di impostare nel BIOS l’avvio da dischetto. 388.1.2) Come si creano i dischetti di installazione di una distribuzione GNU/Linux Debian? Come per i dischetti della distribuzione Red Hat, ‘RAWRITE.EXE’ è un comando valido per copiare qualsiasi immagine di dischetto. Nella distribuzione GNU/Linux Debian si può trovare ‘RAWRITE.EXE’ nella directory ‘\TOOLS\RAWRITE2\’ (meglio usare la versione 2), mentre le immagini dei dischetti si trovano in ‘\DISTS\STABLE\MAIN\DISKS-I386\CURRENT\’. Il numero di dischetti da usare dipende dal metodo di installazione. 388.1.3) Come si creano i dischetti di installazione di una distribuzione GNU/Linux Red Hat da Dos? Si deve usare il programma ‘RAWRITE.EXE’ presente nella directory ‘\I386\DOSUTILS\’ della distribuzione che hai. Il comando è: 1 2 ‘floppy.img’ rappresenta il nome dell’immagine che verrà creata. ‘bzImage’ rappresenta il nome dell’immagine del kernel che verrà copiata sul dischetto. Si è scelto ‘bzImage’ come esempio perché è il nome dell’immagine che risulta alla fine della procedura di ricompilazione del kernel e che si viene generalmente a trovare in ‘/usr/src/linux/arch/i386/boot’ nei computer con architettura i386. 3 Per partizione si intende la partizione in cui abbiamo intenzione di installare il file system principale (es. ‘hda1’, ‘hdb5’, ecc.) 4433 Amministrazione del sistema 4434 D:\> RAWRITE immagine A:[ Invio ] La metavariabile immagine rappresenta il nome del dell’immagine presente in ‘\I386\ IMAGES\’. I file sono due per creare i due dischetti. La terza immagine è per la risoluzione dei problemi di installazione. 388.1.4) Perché ‘FIPS.EXE’ non funziona all’interno di una finestra Dos? ‘FIPS.EXE’ deve essere lanciato da Dos puro, non da emulazione MS-Windows. Si deve innan- zitutto eseguire la deframmentazione del disco fisso e riavviare poi in modalità Dos in seguito si esegue ‘FIPS.EXE’ seguendo le istruzioni. È consigliabile leggere con attenzione la documentazione di ‘FIPS.EXE’, che dovrebbe trovarsi insieme all’eseguibile, facendo comunque fare le copie di sicurezza del contenuto del disco di MS-Windows (o almeno dei file non recuperabili in altri modi). 388.1.5) Cosa significa il problema del limite dei 1024 cilindri?4 Al momento di suddividere in partizioni il disco con l’uso di ‘fdisk’ può capitare di vedere la segnalazione di un errore simile a quello seguente: The number of cylinders for this disk is set to 2105. This is larger than 1024, and may cause problems with: 1) software that runs at boot time (e.g. LILO) 2) booting and partitioning software from other OSs (e.g. DOS FDISK, OS/2 FDISK) Non è il caso di preoccuparsi; più che un errore è un avvertimento sul fatto che alcuni programmi (LILO) o sistemi operativi non sono in grado di accedere ai cilindri oltre il 1024-esimo (il numero 1023) per problemi del BIOS. Si possono attuare gli accorgimenti seguenti: 1. attivazione della modalità LBA del BIOS, che traduce il disco (divide il numero dei cilindri per un certo numero e moltiplica il numero di testine per lo stesso); 2. creazione (e questo forse è meglio) di una partizione di avvio entro il 1024-esimo cilindro, ad esempio ‘/boot/’ per GNU/Linux, senza abilitare la modalità LBA. C’è da dire in ogni caso che le ultime versioni di LILO non presentano più queste limitazioni. Basta quindi procurarsi una versione aggiornata di LILO. 388.1.6) Perché dopo avere spostato il disco con MS-Windows e dopo averlo collocato come primario slave, MS-Windows non parte più? Ho aggiornato le impostazioni di LILO ma riesco ad avviare solamente GNU/Linux. Soluzione 1: BIOS Dal BIOS si disabilita il disco fisso primario master, si salvano le impostazioni e si riavvia. In questo modo MS-Windows si trova effettivamente sul primo disco fisso in fase di avvio e così parte normalmente. 4 questione risolta con le recenti versioni di LILO Amministrazione del sistema 4435 Se non dovesse partire vuol dire che si è compromesso il MBR (Master Boot Record), quindi si deve avviare con il disco di ripristino di MS-Windows, digitando il comando seguente per rimettere a posto il MBR: # fdisk /MBR[ Invio ] Al termine si riavvia da disco fisso e MS-Windows dovrebbe partire regolarmente. Soluzione 2: LILO Nella sezione relativa a MS-Windows si aggiungono le seguenti impostazioni: other = /dev/hdb1 label = DOS table = /dev/hdb # # # # #nel mio caso le quattro righe seguenti indicano a LILO di far credere che i dischi fissi siano invertiti, cioè che lo slave primario sia sul master primario e viceversa map-drive=0x80 to = 0x81 map-drive=0x81 to = 0x80 In questo modo i dischi vengono rimappati istantaneamente al contrario rispetto a come sono impostati. Altro problema è cercare di installare MS-Windows su disco slave mentre sul master c’è già GNU/Linux. Per farlo, occorre prima copiare il kernel su un dischetto, in modo da poter eventualmente riavviare da floppy. Il comando necessario è: # cat /boot/vmlinuz > /dev/fd0 [ Invio ] dove ‘/boot/vmlinuz’ è il percorso assoluto per raggiungere l’immagine del kernel in uso (basta provare ad avviare con il dischetto appena creato per verificare che il procedimento vada a buon fine). Successivamente si procede con i passi seguenti: 1. da BIOS si deve disabilitare il disco master; 2. si lancia il setup di MS-Windows (avvio direttamente da CD-ROM, oppure avvio da dischetto e poi installazione da CD-ROM); 3. si attende che MS-Windows concluda i suoi numerosi riavvii per terminare l’installazione; 4. si riavvia, rientrando nel BIOS e riabilitando il primo disco fisso; 5. si riavvia da dischetto con il dischetto contenente l’immagine del kernel creato prima di iniziare; 6. da GNU/Linux, si modifica ‘/etc/lilo.conf’ nel modo indicato in precedenza; 7. si lancia ‘lilo’. In questo modo, avviando la macchina con LILO si dovrebbe riuscire a caricare entrambi i sistemi operativi. Amministrazione del sistema 4436 388.1.7) Come si fa a esportare il CD-ROM durante l’installazione via NFS? Si deve aggiungere il percorso al file ‘/etc/exports’ facendo riferimento alle pagine di manuale di nfs(5) e di exports(5). /cdrom host_che_mi_pare (ro) Nel modello si vede la parola chiave ‘ro’, che sta per read only. Successivamente si fa ripartire l’NFS con il comando seguente: # /etc/init.d/nfs restart[ Invio ] Ovviamente bisogna avere installato il demone ‘nfsd’, oppure bisogna avere compilato il supporto per il server NFS nel kernel (c’è nei kernel 2.2, ma non è ancora del tutto stabile). 388.2 Avvio e arresto del sistema 388.2.1) Come si arresta il sistema? Come si riavvia? Per arrestare il sistema si deve dare il comando: # shutdown -h now[ Invio ] Oppure: # init 0[ Invio ] Per riavviare il sistema il comando è: # shutdown -r now[ Invio ] Oppure: # init 6[ Invio ] 388.2.2) Come si disabilita il supporto per l’APM in fase di avvio? Al prompt di LILO occorre digitare: LILO boot: linux apm=off[ Invio ]5 388.2.3) È possibile fermare l’arresto o il riavvio del sistema dopo averne dato il comando? Per poter farlo, occorre impartire il comando: # shutdown -c [ Invio ]6 ma questa operazione di annullamento avrebbe successo esclusivamente qualora il comando ‘shutdown’ fosse stato impartito mediante l’indicazione esatta del tempo di esecuzione dello stesso: 5 in questo caso linux è il nome dell’etichetta da inserire per invocare l’immagine del kernel e che è presente nel file ‘/etc/lilo.conf’ 6 -c: cancel shutdown Amministrazione del sistema 4437 # shutdown -r ore:minuti &[ Invio ] Nel caso in cui invece il comando venisse assegnato così: # shutdown -r now[ Invio ] le console virtuali e i terminali grafici verrebbero repentinamente disattivati impedendo qualsiasi tipo di operazione. 388.2.4) Esiste un modo per rendere più repentino l’arresto del sistema? Utilizzare ‘shutdown’ con l’opzione -n , comporta un riavvio e un arresto del sistema velocissimi. In ogni caso se ne sconsiglia decisamente l’uso come indicato anche nella pagina di manuale: man shutdown -n [DEPRECATED] Don’t call init(8) to do the shutdown but do it ourself. The use of this option is dis-couraged, and its results are not always what you’d expect. -n [SCONSIGLIATO] Non impartite init(8) per lo shutdown ma fatelo voi. L’utilizzo di questa opzione è sconsigliato, e i risultati ottenuti non sono quelli che ci si aspetterebbero. 388.2.5) Come si concede a tutti gli utenti la possibilità di arrestare il sistema? Occorre attivare il bit SUID abbinando la proprietà all’utente ‘root’ (SUID-root), per l’eseguibile ‘shutdown’: # chmod 4755 /sbin/shutdown [ Invio ] In questo modo ‘shutdown’ verrà sempre eseguito come se fosse l’utente ‘root’ a lanciarlo. Un altro modo per ottenere lo stesso obiettivo è quello di creare un utente speciale ‘halt’. Ecco una porzione del file ‘/etc/passwd’ che indica quali dovrebbero essere le impostazioni di questo ipotetico utente: [...] halt:x:0:0:,,,:/home/halt:/sbin/halt [...] In questa maniera l’arresto del sistema è consentito solo a coloro che hanno la password di quell’utente. 388.2.6) Come si concede a tutti gli utenti la possibilità di riavviare il sistema? Tale operazione può essere effettuata in diversi modi; in questo caso verrà spiegato come farlo mediante il comando ‘sudo’. Innanzitutto occorre modificare il file ‘/etc/sudoers’ mediante ‘visudo’: # visudo[ Invio ]7 e aggiungere una riga tipo questa: 7 ‘visudo’ è il ‘vi’ per ‘sudo’ Amministrazione del sistema 4438 tizio sempronio=/sbin/shutdown -[hr] now In questo caso ‘tizio’ è l’utente e ‘sempronio’ il nome della macchina; ‘-[h|r]’ indica che l’utente avrà la possibilità di arrestare e di riavviare il sistema. Una volta apportate le modifiche, per arrestare il sistema o per riavviarlo, l’utente ‘tizio’ dovrà impartire: $ sudo shutdown -h now [ Invio ] oppure: $ sudo shutdown -r now [ Invio ] A questo punto egli dovrà inserire la password per proseguire con l’arresto o il riavvio del sistema. 388.2.7) Come si può impedire agli utenti del sistema di impartire il riavvio mediante la combinazione di tasti [ Ctrl+Alt+Canc ]? Occorre commentare la riga contenente ‘ctrlaltcanc’ nel file ‘/etc/inittab’. 388.2.8) Come funziona ‘install-mbr’ in una distribuzione GNU/Linux Debian? In Debian GNU/Linux, ‘install-mbr’ aggiunge al MBR (Master Boot Record) un piccolo ma potente codice per scegliere la partizione di avvio. In realtà questo evita anche di utilizzare il MBR Dos che non è libero. ‘install-mbr’ si installa con il seguente comando: # cd /usr/sbin[ Invio ] # ./install-mbr /dev/hda[ Invio ]8 Una volta installato, dal riavvio successivo del sistema, se non si preme alcun tasto, l’MBR modificato, invocherà il primo settore della prima partizione del primo disco fisso. Se invece si premerà qualche tasto, ‘install-mbr’ visualizzerà il suo prompt. Quest’ultimo è costituito da lettere e numeri. Ecco un esempio di prompt: 14FA: • [1] permette l’avvio della prima partizione; • [4] permette l’avvio della quarta partizione; • [F] permette l’avvio da dischetto; 8 install-mbr si installa al posto del MBR del primo disco fisso della catena IDE-EIDE. Indicando ‘/dev/sda’, si installerà nel primo disco SCSI. Amministrazione del sistema • 4439 [A] opzioni avanzate. Ulteriori informazioni possono essere rilevate nel file ‘/usr/doc/mbr/README’ di una distribuzione Debian GNU/Linux. 388.2.9) Come è possibile avviare un sistema GNU/Linux da un sistema Dos/MS-Windows? Occorre utilizzare il comando ‘LOADLIN.EXE’. Prima di invocarlo però, occorre apportare qualche modifica al sistema Dos o MS-Windows. Bisogna infatti copiare ‘LOADLIN.EXE’ e le immagini del kernel all’interno di una directory dell’unità da cui si intende avviare il sistema GNU/Linux. Per invocare ‘LOADLIN.EXE’, supponendo di avere posto lo stesso comando e le immagini del kernel nella directory ‘C:\LINUX\’, abbiamo a disposizione diverse metodiche: 1. si può inserire la riga: INSTALL=C:\LINUX\LOADLIN.EXE nel file ‘C:\CONFIG.SYS’; 2. si può inserire il comando ‘LOADLIN.EXE’ nel file ‘C:\AUTOEXEC.BAT’; 3. infine si può ricorrere a script (batch). Esempi di script: rem C:\LINUX\LINUX2.BAT rem l’immagine è quella del kernel 2.2.2 e rem la partizione è la seconda di un disco SCSI @pause @echo Premere Ctrl-C per interrompere C:\LINUX\LOADLIN C:\LINUX\bzImage.222 root=/dev/sda2 ro rem C:\LINUX\LINUX_R.BAT rem l’immagine è quella del kernel 2.0.36 della Red Hat rem la partizione è la seconda di un disco IDE/EIDE master @pause @echo Premere Ctrl-C per interrompere C:\LINUX\LOADLIN C:\LINUX\vmlinuz2.036 root=/dev/hda2 ro rem C:\LINUX\SINGLE.BAT rem l’immagine è quella del kernel 2.0.36 della Red Hat rem la partizione è la seconda di un disco IDE/EIDE slave @pause @echo Premere Ctrl-C per interrompere C:\LINUX\LOADLIN C:\LINUX\vmlinuz2.036 single root=/dev/hdb2 ro Notiamo in quest’ultimo esempio l’opzione single che permette di avviare il sistema in modalità utente singolo. Amministrazione del sistema 4440 388.2.10) Come si avvia GNU/Linux dal Boot Manager di MS-Windows NT? Occorre innanzitutto installare LILO sulla partizione Linux. Va poi generato il file ‘bootsect.lin’ contenente l’immagine del settore di avvio della partizione Linux: # dd if=/dev/hdx of= /tmp/bootsect.lin bs=512 count=1[ Invio ]9 ‘bootsect.lin’ va poi copiato nella partizione di avvio di MS-Windows NT e va modificato il file ‘boot.ini’ di MS-Windows NT come segue: [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Server Version 4.00" multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Server Version 4.00 [VGA mode]" /basevideo /s C:\="MS-DOS" c:\bootsect.lin="Linux" Occorre infine ricordare che ogni modifica di LILO, comporta il fatto che si deve ricreare il file immagine e che si deve copiarlo nuovamente nella partizione di MS-Windows NT. 388.2.11) Ho impostato involontariamente il livello di esecuzione (runlevel ) a zero e il sistema inizia la procedura di arresto non appena ha terminato l’avvio. Che posso fare? Al prompt di LILO occorre dare il comando: LILO boot: linux init=/bin/bash [ Invio ] Si intende che ‘linux’ deve essere sostituito con l’etichetta di LILO deputata al caricamento di GNU/Linux Una volta ottenuto l’accesso al sistema si deve montare a mano in modalità lettura-scrittura il file system radice (root): bash-2.03$ mount -n -o remount,rw /[ Invio ] Questo permette di apportare le modifiche necessarie per tornare al livello di esecuzione preferito. Un’altra soluzione consiste nell’impartire ‘linux 1’ sempre al prompt di LILO e cambiare poi repentinamente livello di esecuzione. 388.2.12) Come è possibile fare spegnere la macchina alla fine del processo di arresto? Se la macchina in questione ha la capacità di gestire autonomamente l’alimentazione (APM), è necessario ricompilare il kernel includendo il supporto per l’APM selezionando l’opzione ‘power off on shutdown’. Dopo questa modifica la macchina dovrebbe spegnersi dopo le procedure d’arresto (shutdown). Se così non fosse, occorre verificare che nel file ‘/etc/init.d/ halt’ (o in ‘/etc/rc.d/init.d/halt’) sia presente l’opzione -p del comando ‘halt’. Ecco un esempio del file ‘halt’: #! /bin/sh # # halt 9 Execute the halt command. x è la lettera della partizione Linux Amministrazione del sistema # # Version: # @(#)halt 4441 2.75 19-May-1998 [email protected] PATH=/sbin:/bin:/usr/sbin:/usr/bin # See if we need to cut the power. if [ -x /etc/init.d/ups-monitor ] then /etc/init.d/ups-monitor poweroff fi halt -d -f -i -p 388.2.13) Come è possibile far spegnere la macchina se si dispone di una scheda madre ‘Soyo 5-EM’ o ‘Soyo 5 ema’? Occorre collegarsi al sito della Soyo (<http://www.soyo.com>) spostandosi nella sezione ‘software’. Qui troviamo una directory chiamata ‘patch/’ contenente due file di differenze (patch) per le due schede in oggetto. È necessario ora applicare i file di differenze al kernel che dovrà essere ricompilato includendo il supporto per l’APM selezionando l’opzione ‘power off on shutdown’. 10 . 388.2.14) È possibile avviare la procedura di arresto del sistema con una combinazione di tasti? Nel file ‘/etc/inittab’ troviamo la seguente sezione: # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now Se sostituiamo -r con -h , alla pressione contemporanea di la procedura di arresto. [ Ctrl+Alt+Canc ] il sistema comincerà 388.2.15) Perché in alcune distribuzioni tutti gli utenti hanno la facoltà di impartire il comando ‘halt’? Per evitare che gli utenti possano impartire i comandi ‘halt’ e ‘shutdown’, è sufficiente creare il file ‘/etc/halt.users’ e aggiungere due righe ai file ‘/etc/pam.d/halt’ e ‘/etc/pam.d/ shutdown’ in modo che risultino così: #%PAM-1.0 auth auth auth auth account sufficient requisite onerr=3Dfail required required required /lib/security/pam_rootok.so /lib/security/pam_listfile.so \ sense=allow item=user file=/etc/halt.users /lib/security/pam_console.so /lib/security/pam_pwdb.so /lib/security/pam_permit.so In questa maniera solo gli utenti menzionati in ‘/etc/halt.users’ possono utilizzare ‘halt’ e ‘shutdown’. Ovviamente il controllo della password per l’utente rimane, per essere sicuri che sia proprio l’utente che sta digitando colui che ha impartito il comando. 10 La documentazione allegata ai file di differenze (patch) indica la versione minima del kernel che occorre utilizzare per poterli applicare Amministrazione del sistema 4442 388.2.16) Come è possibile visualizzare messaggi o loghi all’avvio di GNU/Linux? Le metodiche da utilizzare per ottenere questo risultato variano al variare del momento in cui si vuole che il messaggio o il logo venga visualizzato. Se ad esempio vogliamo fare visualizzare al sistema un messaggio al prompt di LILO, occorre mettere nel file ‘/etc/lilo.conf’ la riga: message= <var>/percorso/nomefile</var> Per rendere effettive le modifiche occorrerà dare il comando: # lilo[ Invio ] Per ottenere questo messaggio colorato, è necessario installare Lilo-Colors che altro non è che un file di differenze per LILO. Si tenga presente che esiste un altro programma chiamato BootLogo che è un generatore di messaggi sia per la versione monocromatica che per la versione colorata di LILO. Per avere un logo ANSI o ASCII al login di GNU/Linux possiamo utilizzare Linux Logo. Simile è Welcome2L. Figura 388.1. Linux Logo. Figura 388.2. Linux Logo in visualizzazione banner. Amministrazione del sistema 4443 Figura 388.3. Welcome2L. Inoltre, se ricompilando il kernel si include il supporto per ‘fbcon’, si avrà la possibilità di fare apparire durante l’avvio del sistema un pinguino in modalità grafica. 388.2.17) KERNEL PANIC: VFS: Unable to mount root fs on 03:03 Questo tipo di errore si presenta quando il sistema non riesce a montare la radice del file system. Probabilmente c’è stato un cambiamento di disposizione dei dischi fissi (aggiunta, rimozione o inversione). Per risolvere il problema, occorre far ripartire il sistema mediante un disco di avvio. Al prompt di LILO si deve indicare quale è la radice del file system: LILO boot: linux 1 root=/dev/hdx [ Invio ]11 Una volta ottenuto l’accesso al sistema occorre modificare il file ‘/etc/fstab’ indicando il dispositivo corretto della partizione che costituisce la partizione principale. La stessa modifica va effettuata anche nel file ‘/etc/lilo.conf’ e per rendere effettive le modifiche va rilanciato ‘lilo’: # /sbin/lilo[ Invio ] 388.2.18) Perché dopo la ricompilazione del kernel viene visualizzato un messaggio di kernel panic ? Quando si ricompila il kernel, è possibile gestirne alcune parti in forma di modulo. Ciò che non deve assolutamente essere caricato sotto forma di modulo è ciò che è necessario in fase di avvio. Infatti, se il modulo per i dischi IDE/EIDE viene caricato sotto forma di modulo, il sistema non sarà in grado di avviarsi e produrrà un messaggio di ‘kernel panic’; questo potrebbe spiegare il problema. 11 x va sostituito con il dispositivo che identifica la partizione contenente la radice del file system. Bisogna ricordare però che si dovrà indicare il dispositivo corrente della partizione e non quello che sussisteva prima dell’errore. Amministrazione del sistema 4444 388.2.19) swapon: warning: /dev/hda1 has insecure permissions 0660, 0600 suggested Con questo messaggio il sistema ci avverte di una condizione di scarsa sicurezza relativa ai permessi di una partizione; in questo caso si tratta della prima partizione dell’unità IDE/EIDE master primaria che possiede inutilmente i permessi di lettura e scrittura per il gruppo del proprietario. Mediante il comando: # chmod 0600 /dev/hda1[ Invio ] si ristabiliscono i permessi corretti. 388.2.20) Parallelizing fsck version x.yy /dev/hdxy: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY Questo tipo di messaggio appare prevalentemente quando il sistema non è stato arrestato in maniera corretta. Per risolvere il problema occorre dare il seguente comando: # e2fsck /dev/hdxy[ Invio ] Occorre rispondere affermativamente alle eventuali richieste di clonazione di inode. 388.3 Tipi di file system e partizioni 388.3.1) Come si fa a indicare che alcune directory del file system sono distribuite su dispositivi differenti? Per fare questa operazione occorre aggiungere nel file ‘/etc/fstab’ una riga per ogni dispositivo o file system remoto che si voglia montare. Ogni riga di ‘/etc/fstab’ è composta da 6 campi: 1. dispositivo o file system remoto; 2. directory di innesto (mount point) del file system; 3. tipo del file system: • ext2; • vfat; • nfs; • swap; • iso9660; • ecc. 4. opzioni di montaggio(‘user’, ‘auto’, ‘noauto’, ecc.) 5. campo usato da ‘dump’ Amministrazione del sistema 4445 6. campo usato da ‘fsck’ Se si vuole ad esempio che venga innestata al file system principale la directory ‘/var/’ che risiede sulla terza partizione del secondo disco fisso, bisogna aggiungere la seguente riga al file ‘/etc/fstab’: /dev/hdb3 /var ext2 defaults 1 2 388.3.2) Come si visualizza la struttura del file system? Per vedere quali partizioni sono innestate al file system principale, è sufficiente impartire il comando ‘df’: # df[ Invio ] Figura 388.4. La visualizzazione della struttura del file system. Per visualizzare invece il partizionamento di un’unità, si darà il comando: # fdisk -l dispositivo [ Invio ]12 388.3.3) Come si crea un file system Ext2 nella terza partizione del secondo disco fisso IDE/EIDE? Assumendo che il partizionamento sia un’operazione già effettuata, il comando sarà: # mke2fs /dev/hdb3[ Invio ] Per controllare i blocchi difettosi ed eventualmente fissarli, si utilizza l’opzione ‘-c’ di ‘mke2fs’: # mke2fs -c /dev/hdb3[ Invio ] 388.3.4) Come si verifica se ci sono settori danneggiati su partizioni con file system Ext2? Occorre impartire il comando: # fsck.ext2 -c /dev/partizione [ Invio ]13 Oppure: # e2fsck -c partizione [ Invio ] 12 dove dispositivo è l’unità da analizzare. partizione è il nome del dispositivo corrispondente alla partizione da controllare. L’opzione -c consente di verificare la presenza di settori danneggiati. 13 4446 Amministrazione del sistema 388.3.5) Come si possono ridimensionare le partizioni con file system Ext2? Per tale scopo esistono due strumenti molto validi: 1. GNU parted; 14 2. ext2resize; 15 388.3.6) Come si può creare da GNU/Linux un file system Dos-FAT? Il comando ‘mkdosfs’ o il comando ‘mkfs.msdos’ sono preposti a questo scopo. Ecco un esempio che mostra come creare un file system Dos-FAT nella terza partizione del secondo disco SCSI (‘/dev/sdb3’) dopo avere verificato la presenza di settori difettosi (-n ): # mkdosfs -c /dev/sdb3[ Invio ] 388.3.7) Come si verifica la presenza di settori danneggiati in una partizione contenente un file system Dos-FAT? Con il comando ‘fsck.msdos’: # fsck.msdos -r /dev/hda1[ Invio ] In questo caso sarà la prima partizione del primo disco fisso IDE/EIDE ad essere controllata e nel caso venisse trovata qualche irregolarità, verrebbe chiesto all’utente come comportarsi. 388.4 Swap 388.4.1) Se si avesse bisogno di ulteriore spazio ‘swap’, come si aggiunge? Si può creare una partizione Linux-swap oppure un file-swap. La partizione da rendere partizione Linux-swap si crea come tutte le altre partizioni; il file invece deve essere creato nel seguente modo: # dd if=/dev/zero of=/file_swap bs=1024 count=1024[ Invio ]16 Per rendere ‘swap’ la partizione ‘/dev/hda2’, si darà il comando: # mkswap -c /dev/hda2[ Invio ]17 Per rendere invece ‘swap’ il file ‘file_swap’, si darà il comando: # mkswap /file_swap 1024[ Invio ] Sono stati quindi predisposti due spazi ‘swap’ che però non sono ancora utilizzati. Per farlo, occorre impartire il comando ‘swapon’: 14 GNU parted GPL ext2resize GPL 16 Si deve creare uno spazio di dimensioni multiple di 4; in questo caso si sta creando un file di circa 1 Mibyte. 17 L’opzione -c sta ad indicare che verrà effettuato un controllo per i settori difettosi. Questa opzione non deve essere utilizzata nella creazione di uno spazio ‘swap’ su un file. 15 Amministrazione del sistema 4447 # swapon /dev/hda1[ Invio ] Oppure, nel caso del file: # swapon file_swap[ Invio ] Se non si vuole lanciare ogni volta questo comando, basta inserire nel file ‘/etc/fstab’ le indicazioni del nuovo spazio di ‘swap’ ed esso verrà attivato ad ogni avvio del sistema. Ecco una porzione d’esempio del file ‘/etc/fstab’. [...] /file_swap [...] none swap sw 0 0 388.5 Montare i dischi 388.5.1) Operazioni con un dischetto Dos (file system vfat) Come si crea in Linux un dischetto capace di ospitare file generati con un sistema operativo Dos? Occorre innanzitutto preparare il dischetto mediante la formattazione: # fdformat /dev/fd0[ Invio ] Il dischetto appena formattato non ha ancora una struttura; bisogna infatti crearci un file system adatto. Nel nostro caso si può utilizzare l’opzione ‘vfat’ o ‘msdos’. # mkfs -t msdos /dev/fd0[ Invio ] Ora che il dischetto possiede un file system, per operarvi, occorre innestarlo al file system principale in uno dei suoi punti di montaggio. Se il punto di montaggio risulta essere ‘/mnt/floppy’, il comando per la procedura di innesto sarà: # mount /dev/fd0 /mnt/floppy[ Invio ] Si procede quindi con l’operazione di copia: # cp file.txt /mnt/floppy[ Invio ] Infine si distacca il file system del dischetto da quello principale: # umount /mnt/floppy[ Invio ] 388.5.2) Non riesco a montare dischetti con file system Ext2; se uso dischetti con file system Dos invece non ho problemi, perché? Questo generalmente si verifica quando si cerca di innestare (montare) il file system di un dispositivo mediante il comando ‘mount’ specificando solamente il nome del dispositivo contenente il file system da innestare o solamente il punto di montaggio. In tale maniera vengono richiamate le impostazioni riposte nel file ‘/etc/fstab’. Nel file suddetto, nella riga riguardante ‘/dev/fd0’, in corrispondenza del campo in cui viene indicato il file system del dispositivo, sarà presente la voce ‘msdos’ o ‘vfat’. Amministrazione del sistema 4448 Occorre sostituirla con la voce ‘ext2’ o qualora si desideri continuare a mantenere tale impostazione in ‘/etc/fstab’ occorre procedere al montaggio del file system del dischetto manualmente, indicando tutte le opzioni necessarie: # mount -t ext2 /dev/fd0 /mnt/floppy[ Invio ]18 Un’altra soluzione consiste nell’inserire un’altra riga nel file ‘/etc/fstab’ contenente le indicazioni di montaggio dello stesso dispositivo contenente però un file system diverso (in questo caso ‘ext2’) da innestare su un altro punto di montaggio. 388.5.3) Come si può montare una partizione con file system NTFS (MS-Windows NT)? Occorre ricompilare il kernel includendo l’opzione NTFS filesystem support (read only) per accedere alla partizione di MS-Windows NT. Il seguente comando permette di montare la partizione: # mount -t NTFS /dev/hdx /y [ Invio ]19 388.5.4) Come si monta una partizione contenente MS-Windows 2000? Il file system di MS-Windows 2000 può essere di due tipi: • NTFS; • FAT32. Nel primo caso, l’immagine del kernel che si utilizza deve contenere il supporto per il file system NTFS (questo supporto può essere compilato all’interno dell’immagine oppure può essere caricato mediante il modulo apposito). Una volta abilitato questo supporto, il comando per effettuare il montaggio è: # mount -t ntfs /dev/x /y [ Invio ]20 Nel secondo invece, se la partizione di MS-Windows 2000 presenta un file system FAT32, allora il comando sarà il seguente: # mount -t ntfs /dev/x /y [ Invio ]21 388.5.5) Come si fa a dare agli utenti il permesso di montare il lettore dischetti e il lettore CD-ROM? Occorre modificare il file ‘/etc/fstab’ inserendo nel terzultimo campo dei dispositivi ‘/dev/ fd0’ e ‘/dev/cdrom’ quanto segue: users,noauto 18 19 ‘/mnt/floppy’ è in questo caso il punto di montaggio desiderato. dove x rappresenta la partizione contenente il file system NTFS e y il punto di montaggio (es. ‘/mnt/nt’). x rappresenta la partizione contenente il file system NTFS di MS-Windows 2000 e y il punto di montaggio (es. ‘/mnt/win2k’). 21 Valgono le indicazioni del comando precedente. 20 Amministrazione del sistema 4449 Ecco un estratto di un ‘/etc/fstab’ che contiene tale configurazione: # cat /etc/fstab [ Invio ] # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> /dev/hda2 / ext2 defaults,errors=remount-ro /dev/hda3 none swap sw proc /proc proc defaults /dev/fd0 /floppy auto users,noauto /dev/cdrom /cdrom iso9660 users,noauto /dev/hdb7 /mnt/debian2.1 ext2 defaults,user,auto /dev/hda1 /mnt/win95 vfat defaults,user,auto <dump> <pass> 0 1 0 0 0 0 0 0 0 0 0 0 0 0 388.5.6) Ma cosa cambia se si mette ‘user’ o ‘users’ nei campi di ‘/etc/fstab’? La risposta la troviamo nelle pagine di manuale di ‘mount’ (mount(8)): [...] For more details, see fstab(5). Only the user that mounted a filesystem can unmount it again. If any user should be able to unmount, then use users instead of user in the fstab line. [...] [...] Per ulteriori dettagli, controllate fstab(5). Solamente l’utente che ha montato un file system può smontarlo. tutti gli utenti dovessero avere la possibilità di smontarlo, allora utilizzate users al posto di user nella riga del file fstab. [...] Se 388.5.7) Come si concedono tutti i permessi di una partizione ad ogni utente del sistema? Occorre indicare nel file ‘/etc/fstab’ le opzioni ‘user’, ‘quiet’ ed ‘umask’: /dev/hda1 /mnt/msdos vfat quiet,umask=000 0 0 da mount(8): user Permette ad un utente normale di montare il file system. Questa opzione implica anche le opzioni noexec, nosuid, e nodev (finché ciò non sia cambiato dal superuser usando, ad esempio, la seguente riga di opzioni: user,exec,dev,suid). quiet Abilita il flag quiet. Tentativi di chown o chmod su file non restituiscono errori, sebbene falliscano. Usare con cautela! umask=valore Imposta l’umask (la bitmask dei permessi che non sono presenti). Il default è l’umask del processo corrente. Il valore va dato in ottale. 4450 Amministrazione del sistema 388.5.8) No final new line in /etc/fstab Questo messaggio viene visualizzato quando manca un <CR> alla fine dell’ultima riga del file ‘/etc/fstab’. Occorre aprire il file per la modifica, posizionarsi alla fine dell’ultima riga, premere [ Invio ] e salvare. 388.5.9) Come si fa a montare automaticamente i dischi all’avvio? Il file ‘/etc/fstab’ è un file di configurazione composto da righe. Ogni riga, oltre ad indicare quale dispositivo deve essere montato, dove deve essere agganciato al file system principale, di che tipo è (‘vfat’, ‘ext2’, ‘iso9660’, ‘ntfs’, ecc.), presenta altre opzioni. Tra queste abbiamo l’opzione ‘auto’. Le righe che presentano tale opzione consentono al dispositivo in questione di venire montato automaticamente all’avvio del sistema, senza bisogno di alcun tipo di comando. Le partizioni che non devono essere montate automaticamente, presentano invece l’opzione ‘noauto’ (il CD-ROM ad esempio) che è una delle opzioni comprese in ‘default’. Inoltre, se un dispositivo è elencato in ‘/etc/fstab’ ma non presenta l’opzione ‘auto’, sarà sufficiente impartire il comando: # mount dispositivo [ Invio ] oppure: # mount /punto_di_montaggio [ Invio ] per montare il dispositivo in questione, e sarà l’eseguibile ‘mount’ a rilevare le opzioni necessarie dal file ‘/etc/fstab’. 388.5.10) Come è possibile montare le partizioni Dos/MS-Windows 9x (file system vfat)? Per montare le partizioni Dos/MS-Windows 9x occorre disporre di un’immagine del kernel che contenga il supporto per file system vfat. Una volta ricompilato il kernel, o se si disponesse già di un’immagine con tale supporto, per montare le partizioni Dos/MS-Windows occorrerà indicare ‘vfat’ come tipo di file system: # mount -t vfat /dispositivo / punto_di_montaggio [ Invio ] 388.5.11) Effettuando il login da un’altra console, si ottengono a volte numerosi messaggi relativi a dispositivi già montati. Come si possono eliminare? Si può evitare questo fenomeno indirizzando lo standard error su ‘/dev/null’. Il comando per montare i dispositivi in questione, risulterà così: # mount /dispositivo /punto_di_montaggio 2>/dev/null[ Invio ] ‘2>’ è appunto il comando di reindirizzamento dello standard error. Generalmente questo accade solo se il dispositivo o i dispositivi in questione, vengono montati a mano. Montare i dischi di frequente utilizzo mediante il file ‘/etc/fstab’ risulta essere la modalità più corretta. Amministrazione del sistema 4451 388.5.12) Come è possibile accedere a partizioni GNU/Linux (file system Ext2) da MS-Windows? Si possono usare ext2 tools 22 FSDEXT2 23 Explore2fs 24 . I pacchetti possono essere prelevati rispettivamente presso <ftp://ftp.pg.gda.pl/pub/linux/util/ e <http://uranus.it.swin.edu.au/~jn/linux/explore2fs.htm>. fsdext2.zip> Il primo è molto sicuro e si utilizza da riga di comando, il secondo permette di montare partizioni Ext2 come se fossero dischi Dos, solo che è molto pericoloso perché molte volte blocca i canali dell’interfaccia IDE/EIDE. 388.6 LILO 388.6.1) Installazione e configurazione di LILO Il file di configurazione di LILO 25 è ‘/etc/lilo.conf’. Segue un esempio di ‘/etc/ lilo.conf’ di un sistema che presenta due dischi fissi, il primo contenente MS-Windows ed il secondo contenente GNU/Linux. LILO verrà installato sul primo disco e farà partire in maniera predefinita MS-Windows dal momento che è il primo dei due sistemi operativi indicati. boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 other=/dev/hda1 \011label=dos \011table=/dev/hda image=/boot/vmlinuz-2.2.5-15 \011label=linux \011root=/dev/hdb1 \011read-only Al prompt di LILO si avranno a disposizione 5 secondi (timeout = 50) per scegliere il sistema da avviare. Per avviare GNU/Linux occorrerà inserire ‘linux’ come dichiarato nella variabile label del secondo sistema operativo. Si deve ricordare che non basta modificare il file ‘/etc/lilo.conf’ per rendere effettive le modifiche. Occorrerà invece lanciare l’eseguibile ‘lilo’: # lilo -v[ Invio ]26 388.6.2) Come posso avviare Linux con un dischetto di avvio, in maniera veloce? I dischetti di avvio generalmente contengono, oltre al gestore degli avvii (boot loader), anche l’immagine del kernel per cui l’operazione di caricamento del sistema risulta molto lenta. Si può in ogni caso accelerare tale procedura mantenendo solo il gestore degli avvii (boot loader) su dischetto, ad esempio LILO, e utilizzando un’immagine del kernel presente sul file system principale. Per fare questo occorre modificare il file ‘/etc/lilo.conf’ che dovrà risultare simile a questo: 22 ext2 tools GPL FSDEXT2 GPL 24 Explore2fs GPL 25 LILO licenza speciale senza vincoli particolari 26 ‘-v’ mostra alcuni messaggi sullo stato del processo. 23 Amministrazione del sistema 4452 boot=/dev/fd0 vga=3 compact read-only prompt timeout=0 (l’avvio avverrà da dischetto) image = /vmlinuz (indica il percorso dell’ immagine del kernel) root = /dev/hdb2 (indica la partizione che sarà il file system principale in questo caso è la seconda partizione del secondo disco della prima catena IDE/EIDE) (l’avvio avverrà immediatamente dopo l’accesso al dischetto) label = linux Occorre a questo punto inserire un dischetto formattato nel lettore dei dischetti, e lanciare: # lilo -v[ Invio ] Al termine si riavvia il sistema assicurandosi di avere riabilitato nel BIOS l’avvio da dischetto. Può capitare, anche se è molto raro, che il kernel non si avvii. In tal caso, dopo avere verificato l’esattezza dei dati inseriti in ‘/etc/lilo.conf’, si può provare a eliminare la riga ‘compact’ perché su alcuni sistemi può non funzionare. Questo comporta solamente un leggerissimo rallentamento della fase di avvio. Il fatto di potere provare l’avvio del sistema da dischetto permette di provare in tutta sicurezza i procedimenti di avvii multipli dei sistemi operativi. Capita spesso di avere delle difficoltà nel configurare un sistema che debba poter avviare alternativamente Linux, MS-Windows 9x e MSWindows NT. Una volta soddisfatti delle configurazioni provate su dischetto, basterà sostituire ‘/dev/fd0’ con ‘/dev/hda’ e rilanciare: # lilo -v[ Invio ] 388.6.3) Come si installa LILO in una posizione diversa da quella attuale? Il file ‘/etc/lilo.conf’ contiene la riga: boot= Questa indica su quale dispositivo o su quale partizione dovrà essere installato LILO. Indicando ‘/dev/hda’ LILO verrà installato nel settore di avvio (boot) del primo disco fisso IDE/EIDE; indicando invece ‘/dev/hdb2’, verrà installato nella seconda partizione del secondo disco fisso della prima catena IDE/EIDE. In questo ultimo caso, la partizione deve essere resa avviabile (mediante il comando ‘a’ di ‘fdisk’ o l’apposita casella di ‘cfdisk’). Dopo aver fatto le modifiche, LILO deve essere rilanciato mediante il comando: # lilo -v[ Invio ] Amministrazione del sistema 4453 388.6.4) Come si elimina LILO? Da un sistema con sistema operativo Dos o MS-Windows: C:\> fdisk /mbr[ Invio ] oppure, dopo avere avviato da un disco di ripristino di MS-Windows: C:\> sys c:[ Invio ] Da Linux invece: # lilo -U[ Invio ] oppure si può utilizzare ‘dd’ per riscrivere il MBR originario grazie al file di backup che LILO crea al momento della sua installazione. Questo file generalmente risiede in ‘/boot’ e ha di solito un nome tipo ‘boot.xxxx’ (xxxx può assumere diversi valori). Il comando per riscrivere il MBR è: # dd if=boot.xxxxx of =/dev/hda bs=446 count=1[ Invio ] 388.6.5) Come si fa a scegliere quale sistema operativo avviare in maniera predefinita con LILO? Il sistema operativo che si avvia in maniera predefinita è il primo di quelli indicati nel file ‘/etc/ lilo.conf’. Se ad esempio si dispone di un ‘/etc/lilo.conf’ come il seguente, il sistema operativo predefinito sarà GNU/Linux boot=/dev/sdb1 map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/vmlinuz \011label=linux \011root=/dev/sdb1 \011initrd=/boot/initrd \011read-only other=/dev/sda1 \011label=dos \011table=/dev/sda Se invece si ha l’intenzione di rendere MS-Windows il sistema predefinito, occorrerà semplicemente invertire le sezioni ‘image’ e ‘other’: boot=/dev/sdb1 map=/boot/map install=/boot/boot.b prompt timeout=50 other=/dev/sda1 \011label=dos \011table=/dev/sda image=/boot/vmlinuz \011label=linux \011root=/dev/sdb1 \011initrd=/boot/initrd \011read-only 4454 Amministrazione del sistema Ogni cambiamento effettuato dovrà comunque essere sempre seguito dal comando ‘lilo’: # lilo -v[ Invio ] Amministrazione del sistema 4455 388.6.6) Come è possibile con LILO gestire più distribuzioni GNU/Linux sullo stesso sistema? Assumendo che il ‘/etc/lilo.conf’ sia originariamente simile a questo: boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/bzImage \011label=linux.debian \011root=/dev/hda1 \011read-only si deduce che LILO è per ora in grado di avviare una sola distribuzione. Per permettere a LILO di avviare altre distribuzioni, sarà necessario aggiungere tante sezioni ‘image’ quante saranno le ulteriori distribuzioni da avviare. Ogni sezione ‘image’ indicherà il nome dell’immagine del kernel da avviare, il suo percorso, la partizione su cui montare il file system principale (root). Se si volesse quindi aggiungere una sezione che possa invocare una seconda distribuzione, presente su ‘/dev/hda4’, si dovrà aggiungere il seguente codice: image=/boot/vmlinuz-2.2.5-15 label=linux.redhat root=/dev/hda4 read-only Questo presume che occorre copiare nella directory ‘/boot’ della prima distribuzione, l’immagine del kernel della seconda; la directory ‘/lib/modules/x’ 27 deve essere copiata nella directory ‘/lib/modules/’ della prima distribuzione. ‘linux.redhat’ sarà l’etichetta che servirà ad invocare la seconda distribuzione. Ecco quindi il ‘/etc/lilo.conf’ completo: boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/bzImage label=linux.debian root=/dev/hda1 read-only image=/boot/vmlinuz-2.2.5-15 label=linux.redhat root=/dev/hda4 read-only 388.6.7) Come si deve configurare LILO se sulla macchina è installato anche MS-Windows NT? Assumendo che sul primo disco sia installato GNU/Linux e MS-Windows ad esempio sulle partizioni ‘/dev/hda1’ e ‘/dev/hda2’ e che MS-Windows NT sia installato sul disco fisso slave, il file ‘/etc/lilo.conf’ dovrà essere configurato come nell’esempio seguente: 27 x è la versione del kernel della seconda distribuzione. Amministrazione del sistema 4456 boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=30 other=/dev/hda1 label=dos table=/dev/hda image=/boot/vmlinuz-2.2.5-15 label=linux root=/dev/hda2 read-only other=/dev/hdb label=nt map-drive=0x80 to = 0x81 map-drive=0x81 to = 0x80 LILO verrà quindi installato sul MBR del primo disco fisso. La configurazione ora descritta, permetterà di scegliere al prompt di LILO uno dei tre sistemi operativi mediante le tre etichette: 1. dos 2. linux 3. nt La scelta di uno dei primi due sistemi operativi comporterà il loro avvio in maniera convenzionale. La scelta invece di MS-Windows NT comporterà lo scambio logico dei codici dell’identificazione dei dischi. Essi sono tipicamente 8016 per il primo disco IDE master) e 8116 per il secondo (slave). La porzione: map-drive=0x80 to = 0x81 map-drive=0x81 to = 0x80 effettuerà questo scambio permettendo a MS-Windows NT di trovarsi su un disco master. Considerando questa possibilità è bene provvedere, ad installare MS-Windows NT o su un disco montato come master o su un disco slave dopo aver provveduto a disabilitare dal BIOS il disco fisso master contenente gli altri sistemi operativi. Dopo l’installazione, si dovrà reimpostare come slave il disco in oggetto. 388.6.8) Come si configura LILO se si vuole installare una distribuzione GNU/Linux sul primo disco fisso e MS-Windows su un altro? MS-Windows per avviarsi deve risiedere nel primo disco fisso della prima catena IDE/EIDE; se questo non è possibile si deve ricorrere alle opzioni ‘map-drive’ di LILO. Mediante queste opzioni, si effettuerà lo scambio logico dei codici dell’identificazione dei dischi. Essi sono 8016 per il disco master della prima catena IDE/EIDE e 8116 per il disco slave della stessa catena e così via. Lo scambio permette di rendere master dischi slave e viceversa. Con il ‘/etc/lilo.conf’ configurato in questo modo: boot=/dev/hda map=/boot/map install=/boot/boot.b Amministrazione del sistema 4457 default=linux prompt timeout=20 read-only root=/dev/hda1 image=/vmlinuz \011label=linux other=/dev/hdb1 \011label=win \011map-drive=0x80 \011to=0x81 \011map-drive=0x81 \011to=0x80 MS-Windows potrà essere avviato normalmente seppure esso non risieda nel primo disco fisso della prima catena IDE/EIDE. 388.6.9) Se si reinstalla MS-Windows, il MBR contenente LILO verrà sovrascritto; come posso prevenire questo problema? Si consiglia in genere, prima di trovarsi in situazioni spiacevoli di replicare su dischetto il proprio LILO una volta soddisfatti del suo funzionamento. Per fare questo, basta sostituire, all’interno del file ‘/etc/lilo.conf’ queste righe: boot=/dev/hda map=/boot/map install=/boot/boot.b con queste altre: boot=/dev/fd0 compact read-only e rilanciare ‘lilo’ con un dischetto inserito nel lettore: # lilo -v[ Invio ] In tal modo, qualora il MBR (Master Boot Record) venisse sovrascritto, si sarà in grado di avviare il sistema esattamente come prima ma da dischetto. A quel punto non resterà altro che rilanciare ‘lilo’ assicurandosi che le impostazioni di ‘boot’, ‘map’ e ‘install’ siano corrette. 388.6.10) Come si può impostare una password per LILO? L’indicazione della password per LILO deve essere posta nel file ‘/etc/lilo.con’. La sintassi è semplice ed è indicata dalla pagina di manuale di lilo.conf (1): password=password La password può essere inserita sia nella sezione con le impostazioni generali che nelle singole sezioni specifiche di ogni sistema operativo. Amministrazione del sistema 4458 388.6.11) Perché digitare «linux 1» al prompt di LILO consente l’accesso al sistema senza richiesta di password? Tutto dipende dal fatto che per poter dare questo comando bisogna avere l’accesso fisico al sistema. Un server di solito, al contrario di macchine casalinghe, si trova in luoghi protetti il cui accesso è riservato a poche persone. Riavviare un server è un operazione a volte possibile esclusivamente via hardware. Ecco quindi che la possibilità di dare un comando a LILO è una facoltà riservata spesso solo a coloro che possono accedere fisicamente alla macchina. E’ possibile in ogni caso impostare una password aggiungendo la riga: password=password al file ‘/etc/lilo.conf’; in questo modo anche se il sistema verrà riavviato, ci sarà un controllo al prompt di LILO. Inoltre, se viene aggiunta anche la riga: restricted LILO chiederà la password ogni volta che si cercherà di fornirgli degli argomenti. Dal momento che la password viene scritta in chiaro, il file dovrà essere accessibile solo da ‘root’. 388.6.12) ‘Error 0x10’ - visualizzazione di ripetuti 01 con LILO In questi casi si deve controllare che: • il disco fisso contenente GNU/Linux sia impostato nel BIOS con la modalità LBA attivata; • la partizione radice (root) risieda entro il cilindro 1024. Se così non è, LILO non funziona. 28 388.6.13) Da cosa può dipendere se si riceve la segnalazione della presenza di un virus nel settore di avvio (boot)? Qualora all’avvio del sistema, dopo che sia stato scelto il sistema operativo desiderato mediante LILO, si presenti un messaggio che indichi che è stato rilevato un virus nel settore di avvio (boot), occorre disattivare dal BIOS, il controllo dei virus. Il BIOS confonde LILO con un virus. Se dopo tale operazione, il problema persistesse è probabile allora che ci sia un virus. 388.6.14) Ci sono delle valide alternative a LILO? LILO è solo uno dei tanti gestori degli avvii (boot loader). Tra gli altri gestori liberi ricordiamo: • GRUB; 29 • GAG; 30 • Smart BootManager; 31 28 Come già accennato, le recenti versioni di LILO non hanno più questa limitazione. GNU GRUB GPL 30 GAG GPL 31 Smart BootManager GPL 29 Amministrazione del sistema • Psiko. 32 Figura 388.5. Una schermata di GAG. Figura 388.6. Una schermata di GAG. 32 Psiko GPL 4459 Amministrazione del sistema 4460 Figura 388.7. Una schermata di GAG. Alternativamente, si deve sempre ricordare che è possibile avviare GNU/Linux tramite un dischetto di avvio (boot) o tramite Loadlin. 388.7 Kernel 388.7.1) Come si può sapere quale è l’ultima versione del kernel? Si può fare mediante ‘finger’: [bigpaul@localhost /~]$ finger @linux.kernel.org[ Invio ] o: [bigpaul@localhost /~]$ finger @finger.kernel.org[ Invio ] e verrà restituito qualcosa simile a questo: [linux.kernel.org] The latest stable version of the Linux kernel is: The latest beta version of the Linux kernel is: The latest prepatch (alpha) version *appears* to be: 2.2.12 2.3.18 none Amministrazione del sistema 4461 Figura 388.8. Il comando finger. 388.7.2) Come si visualizza la versione del kernel in uso? Si visualizza con ‘uname’ seguito dall’opzione -n : [bigpaul@localhost /~]$ uname -r[ Invio ] 388.7.3) Come è possibile conoscere il nome del file dell’immagine del kernel che è stata caricata? Esiste la variabile BOOT_IMAGE di LILO che contiene il file dell’immagine del kernel che è stata caricata. Purtroppo essa viene azzerata da qualche processo, per cui dopo il login risulta vuota. Bisogna usarla prima di ‘depmod’ in ‘rc.sysinit’ per visualizzarne il valore. Si deve ricordare comunque che con: # uname -a[ Invio ] viene restituita una riga di questo tipo: Linux server 2.2.13 #4 Sun Nov 21 14:13:37 CET 1999 i586 unknown da cui è possibile capire almeno la versione del kernel utilizzato. 388.7.4) Come si ricompila il kernel? La metodica qui di seguito spiegata si riferisce sia alla ricompilazione di un kernel già in utilizzo, sia alla ricompilazione di una nuova versione. Qualora si intenda ricompilare il kernel gi presente nel sistema, occorre assicurarsi che nella directory ‘/usr/src’ sia generalmente presente un collegamento simbolico chiamato ‘linux’ che punti alla directory che contiene tutti i sorgenti del kernel installato. A volte non è presente tale collegamento simbolico ma c’è direttamente la directory ‘linux’. Qualora non sia presente nessuno dei due, occorre individuare la directory contenente i sorgenti e creare in ‘/usr/src’ un collegamento simbolico chiamato ‘linux’ che vi punti. Amministrazione del sistema 4462 Se si deve invece ricompilare una nuova versione del kernel, si deve copiare il pacchetto in ‘/usr/src’ e successivamente si deve decomprimerlo mediante: # cd /usr/src/[ Invio ] # tar -zxvf pacchetto.tar.gz[ Invio ] In questo modo verrà creata una nuova directory chiamata ‘linux’ dove sono presenti i sorgenti del nuovo kernel. Se la directory creata dal processo di decompressione non si chiama ‘linux’, si dovrà rinominarla: # mv directory_creata linux[ Invio ] o creare un collegamento simbolico simbolico ad essa: # ln -s directory_creata linux[ Invio ] Ora occorre entrare nella directory ‘/usr/src/linux’ (collegamento simbolico o directory che sia) e si devono eseguire questi comandi: # make mrproper[ Invio ] (Questo comando cancella il file ‘.config’ riazzerando tutte le opzioni selezionate nell’ultimo tentativo di ricompilazione.) 33 # make menuconfig[ Invio ] se si vuole una schermata interattiva testuale, oppure, per una schermata grafica: # make xconfig[ Invio ] Figura 388.9. make xconfig. A questo punto si devono scegliere tutte le componenti che si desiserano utilizzare e il supporto per le periferiche di cui si dispone. A scelta ultimata, si salva la configurazione (che verrà salvata nel file ‘.config’) e si impartiscono i seguenti comandi: # make dep[ Invio ] # make clean[ Invio ] # make bzImage[ Invio ] 33 Si deve ricordare che questo è un comando facoltativo, infatti se vogliamo ricompilare il kernel una seconda volta modificando pochissimi valori dall’ultima ricompilazione, il comando sopra indicato, cancellerà tutte le ultime impostazioni. Se lo omettiamo quindi, ritroveremo tutte le opzioni selezionate in precedenza. Amministrazione del sistema 4463 che possono essere anche inclusi tutti insieme in un unico comando: # make dep clean bzImage[ Invio ] Conviene fare: # make bzImage[ Invio ] e non: # make zImage[ Invio ] perché il secondo comando crea un’immagine del kernel più grande che il LILO può non accettare; per cui conviene subito compilare con l’opzione ‘bzImage’. Se alcune componenti sono state dichiarate come modulo, va dato il comando: # make modules[ Invio ] e subito dopo: # make modules_install[ Invio ] A questo punto l’immagine del kernel sarà stata creata nella directory ‘/usr/src/linux/ arch/i386/boot’ con il nome ‘bzImage’. L’immagine va copiata nella directory ‘/boot/’: # cp bzImage /boot[ Invio ] Si deve in seguito modificare opportunamente il file ‘/etc/lilo.conf’ indicando il nuovo nome dell’immagine. Nella sezione corrispondente al sistema GNU/Linux si deve inserire il nome del file dell’immagine dopo: image= Se ad esempio non si è rinominato il file dell’immagine, si dovrà inserire la riga seguente: image=bzImage Le modifiche effettuate al file ‘/etc/lilo.conf’ non saranno effettive fino a che non si lancia ‘lilo’: # /sbin/lilo[ Invio ] A questo punto al riavvio, partirà la nuova versione del kernel. 388.7.5) Come funziona la ricompilazione del kernel in una distribuzione GNU/Linux Debian? In una distribuzione GNU/Linux Debian, la gestione del kernel presenta una particolarità sebbene sia sempre possibile operare in maniera convenzionale come indicato nella LDR 388.7.4. La particolarità consiste nella possibilità di creare pacchetti Debian del proprio kernel con il vantaggio quindi di potere installare e disinstallare rapidamente diversi pacchetti del kernel e specialmente di potere facilmente utilizzare la stessa immagine su più macchine. Per fare ciò, è necessario installare i pacchetti ‘kernel-package’ e ‘bin86’. La descrizione del pacchetto ‘kernel-package’ è la seguente: Amministrazione del sistema 4464 This package provides the capability to create a debian kernel-image package by just running make-kpkg kernel_image in a kernel source directory tree. It can also build the kernel source package as a debian file, the kernel headers package. In general, this package is very useful if you need to create a custom kernel, if, for example, the default kernel does not support some of your hardware, or you wish a leaner, meaner kernel. If you are running on an intel x86 platform, and you wish to compile a custom kernel (why else are you considering this package?), then you may need the package bin86 as well. (This is not required on other platforms). Questo pacchetto consente di poter creare un pacchetto debian contenente l’immagine del kernel. Esso può inoltre creare un file debian, il pacchetto delle intestazioni del kernel, da un pacchetto del sorgente del kernel. In generale, questo pacchetto è molto utile se avete bisogno di creare kernel personalizzati, se ad esempio, il kernel predefinito non gestisce una parte del vostro hardware, o se aveste bisogno di un kernel più piccolo. Se state utilizzando una piattaforma intel x86, e vorreste compilare un kernel personalizzato (altrimenti perché dovreste considerare questo pacchetto?), allora avrete bisogno anche del pacchetto bin86. (Non richiesto per altre piattaforme). Una volta installati i suddetti pacchetti, si seguono tutti i passaggi indicati nella LDR 388.7.4 fino a ‘make menuconfig’ (o ‘make xconfig’). Non serviranno quindi i seguenti comandi: ‘make dep’, ‘make clean’, ‘make zlilo’, ‘make modules’, ‘make modules install’. A questo punto, per creare il pacchetto personalizzato, si deve impartire il seguente comando: # make-kpkg nome[ Invio ]34 Nella directory esterna ai sorgenti del kernel sarà ora presente un pacchetto ‘deb’ contenente il kernel compilato e tutti i moduli necessari. Disponendo ora di un pacchetto ‘deb’, lo si può installare: # dpkg -i /usr/src/nome[ Invio ] Per verificarne il funzionamento, si dovrà riavviare il sistema: # shutdown -r now[ Invio ] Oltre al pacchetto del kernel, ‘make-kpkg’ è in grado di generare pacchetti Debian particolari: • ‘kernel-headers’ (‘.h’ per compilare programmi dipendenti dal kernel) • ‘kernel-source’ (crea un pacchetto con i sorgenti del kernel) • ‘kernel-doc’ (documentazione del kernel) Occorre prestare attenzione a Dselect, che potrebbe sovrascrivere il proprio kernel. Per ovviare a tale problema, premere il tasto [ = ] sul pacchetto ‘kernel-image’ installato; in questo modo Dselect o ‘dpkg’ non potrà sostituirlo. 34 dove ‘nome’ è il nome del pacchetto appena creato. Amministrazione del sistema 4465 388.7.6) Cosa succede se copio la nuova immagine del kernel in ‘/boot’ ma lì c’è la vecchia immagine? Non è importante che l’immagine del kernel abbia sempre lo stesso nome. Si possono infatti copiare nella directory ‘/boot/’ diversi file immagine. Sarà allora compito del gestore degli avvii (boot manager) richiamare le immagini desiderate all’avvio del sistema. Se ad esempio disponiamo di un file ‘/etc/lilo.conf’ configurato nel seguente modo: boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/bzImage-2.2.0 label=predefinto root=/dev/hda1 read-only image=/boot/bzImage-2.2.5-15 label=prova root=/dev/hda1 read-only nella directory ‘/boot/’ saranno presenti i due file immagine ‘bzImage-2.2.0’ e ‘bzImage-2.2.5-15’ che saranno invocati dal prompt di LILO mediante le etichette ‘predefinito’ e ‘prova’. Si può notare che le due voci puntano alla stessa directory radice per cui si fornisce la scelta di due immagini del kernel diverse per lo stesso sistema GNU/Linux. 388.7.7) Quanto spazio occupa il sorgente del kernel? Si può cancellare dopo la ricompilazione? I sorgenti decompressi occupano circa 60-70 Mibyte. 388.7.8) Come si applica una patch al kernel? L’applicazione di una patch al kernel risulta una operazione molto comoda in quanto consente di evitare lo scaricamento dell’intero sorgente che è generalmente di grosse dimensioni. Per applicare una patch al kernel, si deve innanzitutto copiare il file di modifiche (patch) all’interno della directory ‘/usr/src/’. Entrati quindi nella stessa directory mediante il comando: # cd /usr/src[ Invio ] applichiamo il file di modifiche (patch): # bzip2 -dc nomefile.bz2 |patch -p1[ Invio ] o: # gzip -dc nomefile.gz |patch -p0[ Invio ] se è in formato ‘.gz’. Oltre a questa metodica, si può ricorrere all’eseguibile ‘patch-kernel’ presente nella directory ‘/usr/src/linux/scripts/’. Con questa metodica, come nella precedente, si copiano i file di modifiche (patch) nella directory ‘/usr/src/’ e si lancia l’eseguibile ‘patch-kernel’: Amministrazione del sistema 4466 # cd /usr/src/linux/scripts/patch-kernel[ Invio ] ‘patch-kernel’ è in pratica uno script che provvede a cercare i file di modifiche (patch) nella directory ‘/usr/src/’ e ad applicarli. 388.7.9) Dopo avere applicato una patch al kernel, la procedura di ricompilazione subisce dei cambiamenti? No, dopo l’applicazione del file di modifiche (patch) tutti i file sono stati aggiornati e il sorgente del kernel che ne risulta è identico a quello della versione alla quale si è effettuato l’aggiornamento. In ogni caso è bene aggiornare la configurazione con il comando: # make oldconfig[ Invio ] 388.7.10) Durante la ricompilazione del kernel, viene segnalata la mancanza di ‘wish’, perché? Wish non è altro che l’interprete Tcl. Occorre quindi installare il pacchetto ‘tk’ (toolkit Tk) che in ogni caso necessita del pacchetto ‘tcl’ (Tool Command Language - TCL). I pacchetti ora descritti vengono di solito forniti con qualsiasi distribuzione. 388.7.11) Dopo avere ricompilato il kernel, come è possibile provare senza rischio l’immagine appena creata? La seguente procedura presume che la ricompilazione sia già stata effettuata (388.7.4) e che l’immagine del kernel rinominata in ‘bzImage-prova’ si trovi nella directory ‘/boot/’. Il file ‘/etc/lilo.conf’ attuale dovrebbe somigliare a questo: boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/bzImage \011label=linux \011root=/dev/hda3 \011read-only (eventuale altro sistema operativo) ‘bzImage’ (o qualsiasi altro nome) è il nome dell’immagine del kernel attuale e ‘/dev/hda3’ è la partizione radice. Se come si è detto la nuova immagine del kernel è stata copiata in ‘/boot/’, dovremo aggiungere al file ‘lilo.conf’, un’altra sezione: image=/boot/bzImage-prova \011label=prova \011root=/dev/hda3 \011read-only Il file ‘lilo.conf’ risulterà quindi: Amministrazione del sistema 4467 boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/bzImage \011label=linux \011root=/dev/hda3 \011read-only image=/boot/bzImage-prova \011label=prova \011root=/dev/hda3 \011read-only (eventuale altro sistema operativo) Per rendere operative le modifiche apportate a ‘lilo.conf’, si dovrà rilanciare LILO: # lilo -v[ Invio ]35 Al riavvio del sistema, al prompt di LILO digitando ‘prova’ verrà avviata la nuova immagine del kernel. Qualora la nuova immagine non funzionasse a dovere, sarà sempre possibile utilizzare l’etichetta ‘linux’ (in ogni caso la predefinita) per caricare la vecchia immagine del kernel. Prima di eliminare la vecchia immagine del kernel, è consigliato un certo periodo di prova. Una volta sicuri del funzionamento della nuova configurazione sarà possibile rimuovere la sezione: image=/boot/bzImage \011label=linux \011root=/dev/hda3 \011read-only dal file ‘/etc/lilo.conf’ e sostituire ‘prova’ con ‘linux’. Ricordarsi sempre, dopo qualsiasi modifica al file di configurazione di LILO, di impartire: # lilo -v[ Invio ] per rendere effettive le modifiche. 388.7.12) Si può trasportare l’immagine del kernel da una distribuzione ad un’altra? Se l’immagine del kernel da spostare include il supporto per caratteristiche del sistema ricevente, sarà un’operazione possibile. Per poter spostare il kernel sono necessari: • il file ‘bzImage’ (l’immagine del kernel, presente generalmente in ‘/boot/’, può assumere qualsiasi nome); • la directory ‘/usr/src/linux/include/’; • la directory ‘/lib/modules/x.x.xx’ relativa alla versione del kernel che si sta spostando. ‘kernel-package’ (388.7.5) di una distribuzione Debian GNU/Linux consente di creare un pacchetto ‘deb’ di tutte le componenti di un kernel. L’utilizzo quindi dello stesso kernel, su più sistemi, risulterà quindi più semplice e versatile. 35 -v abilita la modalità prolissa Amministrazione del sistema 4468 388.7.13) A cosa serve il file ‘initrd-x.x.xx.img’ nella directory ‘/boot’? La guida The Official Red Hat Linux Reference Guide riporta quanto segue: An initrd image is needed for loading your SCSI module at boot time. The shell script /sbin/mkinitrd can build a proper initrd image for your machine if the following conditions are met: The loopback block device is available. The /etc/conf.modules file has a line for your SCSI adapter; for example: alias scsi_hostadapter BusLogic Viene richiesta un’immagine initrd per caricare il vostro modulo SCSI all’avvio. Lo script /sbin/mkinitrd può costruire un’immagine initrd corretta per la vostra macchina se si presentano le seguenti condizioni: È disponibile il dispositivo di blocco del loopback Il file /etc/conf.modules presenta una riga per l’adattatore SCSI; ad esempio: alias scsi_hostadapter BusLogic ‘initrd-x.x.xx.img’ è quindi un’immagine utilizzata per caricare il modulo SCSI all’avvio. La si può creare con il comando ‘/sbin/mkinitrd’. 388.7.14) Il kernel di Linux è in grado di gestire periferiche USB? Occorre avere come minimo un kernel 2.2.14 con il backport oppure un 2.3.xx . 388.7.15) Come è possibile ottimizzare il kernel per macchine con processore Pentium? Lo si può fare modificando il makefile che si trova in ‘/usr/src/linux’. In pratica bisogna cercare le voci: • HOSTCFLAGS • MAKE • CFLAGS e modificare il loro contenuto nel seguente modo: HOSTCFLAGS =-Wall -Wstrict-prototypes -O3 -march=pentium -mcpu=pentium -ffa st-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-dou ble -fno-exceptions MAKE =make -j 4 CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malig n-double -fno-exceptions (nella versione 2.3.47 si trova CFLAGS := $(CPPFLAGS) mentre fino alla 2.2.14 c’è solo CFLAGS =). È da notare che si deve utilizzare come compilatore ‘pgcc’ (un compilatore gcc ottimizzato per processori pentium). Amministrazione del sistema 4469 388.7.16) Dove si trovano i sorgenti del kernel? I sorgenti del kernel si trovano generalmente nella directory ‘/usr/src/linux’. 388.7.17) Perché sopraggiungono dei problemi relativi a ‘ipfwadm’ con i kernel della serie 2.2.x ? Perché dai kernel della serie 2.2.x , non si usa più ‘ipfwadm’ ma ‘ipchains’. 388.7.18) Perché nei kernel della serie 2.2.x non è presente l’opzione drop source-routed frames ? La risposta è tratta dal file ‘/usr/src/linux/Documentation/Changes’: In 2.0.x the kernel could be configured to drop source routed IP packets via a compile time configuration option. In 2.2.x, this has been replaced by a sysctl. Nei kernel della serie 2.0.x ci potrebbe essere la configurazione che (ri)lasci i pacchetti IP sorgenti (originali) instradati mediante un’opzione di configurazione del tempo di compilazione. Nella serie 2.2.x, questa caratteristica è stata sostituita da una sysctl. 388.7.19) Come si verifica quali sono i pacchetti RPM del kernel installati? Con il comando: # rpm -qa | grep kernel | sort[ Invio ] 388.7.20) Come si possono memorizzare gli eventuali messaggi (di errore e non) che possono risultare dalla procedura di ricompilazione del kernel? Durante la ricompilazione del kernel, possono verificarsi numerose problematiche che vengono di solito visualizzate mediante messaggi. Con il comando: # make dep;make clean;make bzImage > LOG-k 2> ERR-k;make modules > LOG-m 2> ERR-m[ Invio ] sarà possibile registrare nei file ‘LOG-k’ e ‘LOG-m’ gli avvertimenti e gli errori verificatesi durante la ricompilazione del kernel e l’installazione dei moduli. Risulterà quindi più facile individuare i problemi e le cause degli errori. 388.7.21) Perché dopo la ricompilazione del kernel c’è una diminuzione dello spazio nel disco? La ricompilazione del kernel comporta una diminuzione dello spazio su disco di circa 20 - 30 Mibyte. Per recuperare lo spazio, occorre dare: # make clean[ Invio ] dopo essersi posizionati in ‘/usr/src/linux’. Amministrazione del sistema 4470 388.7.22) Dove devo copiare il file ‘System.map’ e che operazioni devo compiere su di esso? Il file ‘System.map’ si viene a trovare nella directory ‘/usr/src/linux/’ alla fine del processo di ricompilazione del kernel e va copiato nella directory ‘/boot/’. Per ogni immagine del kernel, esiste un ‘System.map’ diverso. Occorre quindi provvedere, nel caso si desideri utilizzare più di un’immagine del kernel nel proprio sistema, a sostituire i vari file ‘System.map’ a seconda dell’immagine del kernel che si sta utilizzando. Un modo per fare questo è rinominare i vari ‘System.map’ in ‘System.map.x.y.z’36 , e creare ogni volta un collegamento simbolico che punti al ‘System.map.x.y.z’ desiderato. Se ad esempio si è appena ricompilato il kernel 2.2.12 occorrerà copiare in ‘/boot/’ l’immagine del kernel e il file ‘System.map’ rinominando quest’ultimo in ‘System.map.2.2.12’: # cp /usr/src/linux/arch/i386/boot/bzImage /boot/[ Invio ] e: # cp /usr/src/linux/System.map /boot/System.map.2.2.12[ Invio ] Occorrerà quindi creare il collegamento simbolico in ‘/boot’: # ln -s /boot/System.map.2.2.12 /boot/System.map[ Invio ] lrwxrwxrwx -rw-r--r-- 1 root 1 root root root 19 Jun 186846 Jun 5 14:38 System.map -> System.map.2.2.12 5 14:30 System.map-2.2.12 388.7.23) Come si possono gestire più file ‘System.map’ quando si dispone di più immagini del kernel? Per far sì che il sistema carichi all’avvio i file ‘/boot/System.map’ corretti a seconda dell’immagine del kernel che si è scelto di caricare, si dovrà modificare il file ‘/etc/rc.d/init.d/ syslog’ (‘/etc/init.d/sysklogd’ in una distribuzione Debian). La riga: daemon klogd -k /boot/System.map dovrà essere sostituita con: daemon klogd -k /boot/System.map-‘uname -r‘ Ora si devono copiare in ‘/boot’ i file ‘System.map’ dei rispettivi kernel, rinominandoli nel seguente modo: # mv System.map System.map-x.y.z[ Invio ]37 388.7.24) Perché il sistema mi avverte che la versione del file ‘System.map’ è sbagliata? Ogni immagine del kernel, ha un ‘System.map’ che vi si riferisce. Probabilmente in ‘/boot/’ c’è un ‘System.map’ che non si riferisce all’immagine del kernel caricata. Questo di solito accade se si dimentica di copiare il file ‘System.map’ presente in ‘/usr/src/linux/’ in ‘/boot/’ al termine della ricompilazione del kernel. 36 x ,y e z identificano la versione del kernel cui il file ‘System.map’ fa riferimento x , y e z identificano la versione del kernel; La versione dell’immagine del kernel caricata, si può rilevare mediante il comando ‘uname -r’. 37 Amministrazione del sistema 4471 Qualora si intenda utilizzare sempre e solo l’ultima immagine creata dal kernel, conviene rendere ‘/boot/System.map’ un collegamento simbolico a ‘/usr/src/linux/System.map’; in questo modo ogni volta che il kernel verrà aggiornato, il collegamento farà sempre riferimento all’ultima versione di ‘System.map’ e non verranno più segnalati problemi di incongruenza. 388.7.25) as86 Command not found Questo errore si verifica nella fase di creazione dell’immagine del kernel, dopo il comando: # make bzImage[ Invio ] In genere viene visualizzato qualcosa del genere: make[1]: Entering directory ’/linux/arch/i386/boot’ as -0 -a -o bootsect.o bootsect.s make[1]: as86: command not found make[1]: *** [bootsect.o] Error 127 make[1]: Leaving directory ’/linux/arch/i386/boot’ make: *** [zImage] Error 2 Il problema si presenta perché manca il pacchetto ‘bin86’ di cui ‘as86’ fa parte. 388.7.26) /dev/lp0 :not detected Spesso dopo l’aggiornamento del kernel da una versione 2.0.x ad una 2.2.x , capita di ricevere segnalazioni analoghe alla seguente: /dev/lp0 :not detected Se non viene riconosciuta la porta parallela può dipendere dal fatto che in ‘/etc/ conf.modules’ manca la riga riguardante il modulo ‘parport_pc.o’. Occorre quindi aggiungere al file suddetto le seguenti righe: alias parport_lowlevel parport_pc options parport_pc io=0x378,0x278 irq=7,auto modificando opportunamente gli indirizzi con quelli del proprio sistema. 388.7.27) signal 11 Se durante operazioni abbastanza impegnative per il sistema (la ricompilazione del kernel ad esempio), si ricevono messaggi quali: Internal compiler error: program cc1 got fatal signal 11</em> È bene prendere in considerazione il fatto che ci possano essere dei problemi di malfunzionamento della RAM. Potrebbe essere difettosa. Amministrazione del sistema 4472 388.7.28) No setup Signature found Questo messaggio generalmente appare non appena l’immagine del kernel comincia ad essere caricata. Esso è la manifestazione del fatto che l’immagine del kernel non è stata predisposta ad utilizzare il file system principale desiderato. A tale scopo si utilizza il programma ‘rdev’: # rdev /boot/bzImage /dev/partizione [ Invio ] Occorrerà sostituire ‘/boot/bzImage’ con la posizione dell’immagine del kernel all’interno del file system (‘/boot/vmlinuz’, ‘/boot/vmlinuz-2.2.9’, ‘/boot/zImage’, ecc.). partizione dovrà essere sostituita dal nome del dispositivo della partizione radice. 388.8 Moduli 388.8.1) Cosa si deve fare per i moduli dopo la ricompilazione del kernel? I moduli devono essere installati e lo si fa mediante il comando: # make modules modules_install[ Invio ] dopo avere dato: # make bzImage[ Invio ] Questo comando crea la directory ‘/lib/modules/x.y.z’. 38 388.8.2) Come si possono caricare i moduli del kernel all’avvio? Se ad esempio si intende caricare il modulo ‘ip_masq_ftp.o’ ad ogni avvio del sistema invece di impartire ogni volta: # modprobe ip_masq_ftp[ Invio ] è necessario inserire la riga: /sbin/modprobe ip_masq_ftp.o all’interno del file ‘/etc/rc.d/rc.local’ o nei file corrispondenti delle diverse distribuzioni. 388.8.3) modprobe: can’t locate module... Se nel file ‘/var/log/messages’ sono presenti messaggi simili a questi: ‘May 7 20:59 linuxfaq.it modprobe: can’t locate module ppp-compress-21’ ‘May 7 20:59 linuxfaq.it modprobe: can’t locate module ppp-compress-26’ ‘May 7 20:59 linuxfaq.it modprobe: can’t locate module ppp-compress-24’ per rimuoverli è necessario inserire le seguenti righe nel file ‘/etc/modules.conf’: alias ppp-compress-21 bsd-comp alias ppp-compress-26 ppp_deflate alias ppp-compress-24 ppp_deflate 38 x , y e z identificano la versione del kernel. Amministrazione del sistema 4473 388.9 Configurazione del sistema 388.9.1) Come è possibile mantenere sulla propria macchina più di una distribuzione GNU/Linux? Verrà qui spiegato come poter gestire attraverso LILO L’avvio di due distribuzioni GNU/Linux installate sulla stessa macchina. Come esempio si prenderà in considerazione l’ipotesi di poter avviare una distribuzione GNU/Linux Debian e una Red Hat. Nel file ‘/etc/lilo.conf’ , dovranno essere presenti due sezioni distinte, una per Debian e una per Red Hat. All’interno della directory ‘/boot/’ della distribuzione da cui si impartirà ‘lilo’, ammettiamo che sia Debian ad esempio, dovranno essere presenti tutte e due le immagini del kernel con i rispettivi ‘System.map’. Questi ultimi dovranno essere rinominati in ‘System.map.x.y.z’ in cui x , y e z identificano la versione del kernel cui si riferiscono. Inoltre, in ‘/lib/modules/’ della stessa distribuzione Debian, dovranno essere copiate le directory dei moduli di Red Hat. In pratica la directory ‘x.y.z/’ presente in ‘/lib/modules/’ della distribuzione Red Hat, dovrà essere copiata all’interno della directory ‘/lib/modules/’ della distribuzione Debian. Il file ‘/etc/lilo.conf’ assumerà questo aspetto: boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 password=********** restricted default=linux image=/boot/vmlinuz-2.2.15 label=debian root=/dev/hda2 read-only image=/boot/vmlinuz-2.2.12 label=redhat root=/dev/hdc5 read-only Da questo file si deduce che: • LILO verrà installato sulla prima partizione del primo disco della catena IDE/EIDE; • LILO mostrerà il prompt per 5 secondi prima di avviare la distribuzione Debian presente sulla seconda partizione del primo disco della catena IDE/EIDE; • le etichette per avviare le due distribuzioni sono rispettivamente ‘debian’ e ‘redhat’; • la partizione radice della distribuzione Red Hat si trova nella quinta partizione del terzo disco della catena IDE/EIDE; Per verificare tutte le impostazioni prima di avviare ‘lilo’ controlliamo le directory dei moduli: [bigpaul@localhost]$ ls /lib/modules[ Invio ] total 2 drwxr-xr-x drwxr-xr-x 6 root 11 root root root 1024 Oct 31 18:34 2.2.12/ 1024 Oct 27 01:59 2.2.15/ Amministrazione del sistema 4474 Controlliamo anche che nella directory ‘/boot/’ siano presenti le immagini del kernel delle due distribuzioni e i relativi file ‘System.map’: [bigpaul@localhost]$ ls /boot[ Invio ] total 2735 -rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-------rw-r--r--rw-r--r-- 1 1 1 1 1 1 1 1 root root root root root root root root root root root root root root root root 149820 186846 512 4544 612 26624 454123 617431 Oct Apr Oct Apr Apr Nov Oct Apr 31 20 27 13 13 1 31 20 17:30 1999 01:55 1999 1999 15:31 17:30 1999 System.map-2.2.12 System.map-2.2.15 boot.0303 boot.b chain.b map vmlinuz-2.2.12 vmlinuz-2.2.15 Occorre infine assicurarsi che nel file ‘/etc/rc.d/init.d/syslog’ (‘/etc/init.d/ sysklogd’ in una distribuzione Debian) la riga: daemon klogd sia sostituita da: daemon klogd -k /boot/System.map-‘uname -r‘ per far riconoscere senza problemi ai vari kernel i propri ‘System.map’. 388.9.2) Esiste la deframmentazione in GNU/Linux? I programmi per la deframmentazione del disco per GNU/Linux esistono ma non sono quasi mai necessari e se ne sconsiglia l’uso. Normalmente la frammentazione di un file system Ext2 si stabilizza tra il 4 e il 5 per cento, a meno che non ci sia una grande quantità di installazioni, ma anche in questo caso non viene mai superato un certo limite. Il metodo migliore e meno rischioso per deframmentare un disco, se proprio si desidera farlo, è archiviare (su nastro o su qualsiasi altro supporto) tutto il contenuto del file system, cancellare il file system stesso e ripristinare il contenuto dell’archivio. 388.9.3) Quali sono le differenze tra i file ‘/etc/profile’, ‘~/.bashrc’, ‘~/ .bash_profile’ e ‘~/.inputrc’? Esistono principalmente due tipi di shell: interattiva e non interattiva. La prima è una shell in cui l’utente è chiamato ad interagire con essa, ad inserire comandi. La shell non interattiva non richiede l’intervento dell’utente ed è quella che viene eseguita durante l’esecuzione di uno script. La shell interattiva si divide a sua volta in shell di login e shell normale. La prima consiste in quello che si ha di fronte quando è stata completata la procedura di accesso. A seconda del tipo di shell, verranno letti diversi tipi di file: Se è una shell di login, se ‘/etc/profile’ esiste, lo legge; se ‘~/.bash_profile’ esiste, lo legge, altrimenti se ‘~/.bash_login’ esiste, lo legge, altrimenti se ‘~/.profile’ esiste, lo legge. Se all’uscita dalla shell ‘~/.bash_logout’ esiste, lo legge. Se è una shell non di login, all’avvio se ‘~/.bashrc’ esiste, lo legge. Infine se si tratta di una shell non interattiva, se la variabile di ambiente ENV non è nulla, la espande e legge il file che indica, come se fosse stato eseguito il comando: Amministrazione del sistema 4475 if [ "$ENV" ]; then . $ENV; fi Ecco un estratto della pagina di manuale di bash(1) relativamente ai file letti dai vari tipi di shell: /etc/profile Il file di inizializzazione generale per il sistema, eseguito per le shell di login ~/.bash_profile Il file di inizializzazione personale, eseguito per le shell di login ~/.bashrc Il file di inizializzazione individuale per shell interattiva ~/.inputrc Il file di inizializzazione individuale per readline ‘readline’ è la libreria che gestisce la lettura dell’input quando si usa una shell interattiva. 388.9.4) Come si rendono disponibili anche per gli utenti le modifiche fatte al file ‘/etc/ bashrc’? Per fare questo, occorre inserire nel file ‘.bashrc’ dell’utente le seguenti righe: if [ -f /etc/bashrc ]; then . /etc/bashrc fi 388.9.5) Dopo aver modificato un file di configurazione, è necessario riavviare il sistema per rendere effettive le modifiche? No, è necessario invocarlo mediante l’eseguibile ‘source’: # source .bashrc[ Invio ] oppure ad esempio: # source ~/.bash_profile[ Invio ] Per ricaricare tutti i file di configurazione relativi alla shell, sia essa interattiva (di login o meno) che non interattiva, sarà sufficiente fare riferimento alla LDR 388.9.3 per sapere quali file ricaricare mediante ‘source’. 388.9.6) Perché alcune modifiche apportate al sistema durante situazioni di emergenza non sono riscontrabili al riavvio? Questo succede generalmente perché non si è scaricata la memoria cache, quindi le modifiche sono rimaste nella RAM e non sono state applicate. Per fare scrivere effettivamente quello che si è fatto, occorre digitare: # sync[ Invio ] In ogni caso è bene riavviare mediante il comando: # shutdown -r now[ Invio ] e non tramite il pulsante ‘reset’. Anche in situazioni di emergenza, se si possono fare modifiche al file system, si può anche avviare lo spegnimento. 4476 Amministrazione del sistema 388.9.7) Come vengono gestiti i servizi in una distribuzione GNU/Linux Debian? I servizi di una distribuzione GNU/Linux Debian sono gestiti dagli script e dai collegamenti simbolici presenti all’interno delle directory ‘/etc/rcx.d/’ , dove x assume i valori S,0,1,2,3,4,5,6 e della directory ‘/etc/init.d/’. In particolare, in ‘/etc/init.d/’ saranno raccolti tutti gli script che si intende lanciare durante la fase di avvio. Per poterli eseguire durante tale fase però, occorrerà creare un collegamento simbolico (link) all’interno della directory relativa al livello di esecuzione (runlevel) impostato. Se quest’ultimo è ad esempio il livello di esecuzione numero 3, il collegamento simbolico dovrà essere posto in ‘/etc/rc3.d/’. 388.9.8) Come si lancia un programma durante la fase di avvio di una distribuzione GNU/Linux Debian? Per eseguire un programma durante la fase di avvio, occorrerà creare uno script che invochi il programma stesso. Lo script dovrà essere collocato nella directory ‘/etc/init.d’ e dovrà essere richiamato da collegamenti simbolici ad esso presenti nella directory del livello di esecuzione (runlevel) impostato. Se quest’ultimo è ad esempio il livello di esecuzione numero 3, il collegamento simbolico dovrà essere posto in ‘/etc/rc3.d/’. 388.9.9) Come vengono gestiti i servizi in una distribuzione GNU/Linux Red Hat? In Red Hat e nelle distribuzioni da essa derivate, nella directory ‘/etc/rc.d/’ esistono le directory dei vari livelli di esecuzione (runlevel); esse sono caratterizzate dal nome ‘rcx.d’ dove x può assumere i seguenti valori: • 0: livello di spegnimento; • 1: livello monoutente; • 2,3: livelli di lavoro; • 5: livello modalità grafica; • 6: livello di riavvio. Oltre alle suddette directory c’è la directory ‘/etc/rc.d/rc.local/’. Queste directory contengono dei collegamenti simbolici a script presenti nella directory ‘/etc/rc.d/init.d/’. Praticamente, se in ‘/etc/rc.d/rc.local/’ si inserisce un collegamento simbolico ad uno script presente in ‘/etc/rc.d/init.d/’, ad ogni avvio questo verrà eseguito; se se ne inserisce un altro in ‘/etc/rc.d/rc3.d/’ questo verrà eseguito quando il sistema sarà avviato in livello di esecuzione (runlevel) 3 e verrà terminato allo spegnimento del sistema, al riavvio o se si passerà ad un altro livello di esecuzione. Bisogna ricordare che i nomi dei collegamenti simbolici agli script presenti nella directory ‘/etc/rc.d/init.d/’ sono nomi codificati. Essi infatti sono composti da una lettera maiu- scola iniziale (S o K), da un numero e dal nome dello script cui puntano. La lettera (S o K) determina rispettivamente l’avvio o il non avvio dello script ed il numero ne determina invece l’ordine di esecuzione. Se ad esempio nella directory ‘/etc/rc.d/rc3.d/’ sono presenti: Amministrazione del sistema 4477 K75netfs -> ../init.d/netfs S10network -> ../init.d/network S50inet -> ../init.d/inet all’avvio con livello di esecuzione (runlevel) 3, «netfs» non verrà eseguito (la «K» nel nome del collegamento ne nega l’esecuzione), mentre «network» e «inet» saranno eseguiti seguendo l’ordine indicato dal numero dopo la «S». 388.9.10) Come si possono disattivare i servizi in Red Hat? All’interno della directory ‘/etc/rc.d/rcx.d/’ 39 , sono presenti i collegamenti simbolici agli script dei servizi collocati all’interno della directory ‘/etc/rc.d/init.d/’. Con il comando: # ls -l /etc/rc.d/rc3.d/[ Invio ]40 risulteranno evidenti i collegamenti simbolici. Questi collegamenti come già descritto nella LDR 388.9.9 sono fatti nel seguente modo: sono composti da una lettera maiuscola iniziale (S o K), da un numero e dal nome dello script cui puntano. La lettera (S o K) determina rispettivamente l’avvio o il non avvio dello script ed il numero ne determina invece l’ordine di esecuzione. Per disattivare un servizio, basterà quindi sostituire la «S» con la «K» o eliminare il collegamento simbolico. 388.9.11) Come si fanno ripartire i demoni se si sono modificati i file di configurazione? Occorre individuare il PID del demone attraverso il comando ‘ps’: # ps -aux | grep demone[ Invio ] Una volta trovato il PID, per riavviare il demone si darà il comando: # kill -HUP PID [ Invio ] Quest’ultimo in pratica arresta il processo del demone e lo fa ripartire, facendogli in questo modo indirettamente rileggere i file di configurazione modificati. Per riavviare, di solito si può anche mandare il sengale 1 al processo con il seguente comando: # kill -1 PID [ Invio ] In Apache ad esempio basta uccidere il primo dei processi attivi (definito ‘root’) per far ripartire con le nuove impostazioni anche i processi figli. Un modo ancora più pulito è andare nella directory ‘/etc/init.d/’ o ‘/etc/rc.d/init.d/’ e fare ripartire il demone usando lo script di inizializzazione, ad esempio: # cd /etc/init.d/[ Invio ] # ./apache restart[ Invio ] 39 40 dove x assume il valore del livello di esecuzione di cui si vogliono disattivare i servizi. se il livello di esecuzione è il numero 3 Amministrazione del sistema 4478 388.9.12) Come si cambia il nome della macchina? Il nome della macchina che quasi sempre, in maniera predefinita, è ‘localhost’, può essere sostituito modificando il file ‘/etc/hosts’. In questo file infatti è indicato l’indirizzo IP e il nome della macchina. Questo esempio cambia il nome della macchina locale da ‘localhost’ a ‘miarete’ sostituendo la seguente riga del file ‘/etc/hosts’, con questa: 127.0.0.1 localhost in (ad esempio): 127.0.0.1 miarete 388.9.13) Come si imposta l’orologio? La data va impostata mediante il comando ‘date’: # date 12070820[ Invio ] Questo comando imposterà l’orario alle 08.20 del 7 Dicembre dell’anno corrente. Per mantenere però queste impostazioni nel sistema, per aggiornare insomma l’orologio del BIOS, si dovrà dare il comando: # hwclock --systohc &[ Invio ] Ricordiamo inoltre che ‘timeconfig’ è il programma di utilità per impostare l’orario di una distribuzione Red Hat. 388.9.14) Come si mantiene aggiornato l’orologio? Mantenere aggiornato l’orologio del sistema con server remoti preposti a tale scopo, è un’operazione che si fa mediante gli eseguibili ‘ntpdate’ e ‘rdate’. Se non presenti nel sistema, andranno installati i relativi pacchetti: ‘ntpdate’ e ‘rdate’. Dopo aver terminato il processo di ‘xntpd’ occorrerà dare il comando: # ntpdate www.clock.org[ Invio ] un comando simile è: # rdate -sp tempo.cstv.to.cnr.it[ Invio ] Per aggiornare l’orologio del BIOS, si dovrà in ogni caso dare il comando: # hwclock --systohc &[ Invio ] Amministrazione del sistema 4479 388.9.15) Cosa si deve fare per impostare l’ora legale in GNU/Linux? L’ora legale viene aggiornata automaticamente. È opportuno fare in modo che l’orologio interno dell’elaboratore sia posizionato sull’ora di riferimento definita dal GMT, (Greenwich Mean Time). 388.9.16) Come si visualizza un calendario? Per visualizzare il calendario del mese corrente: $ cal[ Invio ] Per visualizzare il calendario dell’anno corrente: $ cal -y[ Invio ] Per visualizzare il calendario dell’anno 2002: $ cal 2002[ Invio ] Per visualizzare solo il mese di Febbraio 2000: $ cal 2 2000[ Invio ] Figura 388.10. Il comando cal. 388.9.17) Come è possibile attivare ad ogni avvio la spia della tastiera relativa al tasto [ BlocNum ]? Se da BIOS non è possibile impostare la spia, si dovrà operare in maniera diversa a seconda della distribuzione che si possiede. Red Hat: Amministrazione del sistema 4480 Con questa distribuzione, si dovranno inserire nel file ‘/etc/rc.d/rc.sysinit’ le seguenti righe: for t in 1 2 3 4 5 6 do /usr/bin/setleds -D +num < /dev/tty$t > /dev/null done oppure: INITTY=/dev/tty[1-8] for tty in $INITTY; do setleds -D +num < $tty done Debian GNU/Linux: In questa distribuzione, occorrerà creare uno script con le righe sopra esposte, e posizionarlo nella directory ‘/etc/rc.boot’. Slackware: In questo caso lo script andrà inserito nel file ‘rc.keymap’. 388.9.18) Si può cancellare il contenuto della directory ‘/tmp/’ o è pericoloso? Molti programmi in esecuzione, appoggiano alcuni file nella directory ‘/tmp/’. Può essere una buona idea ripulire quella directory prima che qualsiasi programma possa scriverci qualcosa dentro. Ecco quindi che l’avvio del sistema risulta essere il momento opportuno. Si deve allora creare uno script da inserire nella directory del sistema contenente tutti i servizi (‘/etc/init.d/’, ‘/etc/rc.d/init.d/’, ecc.). Alcune distribuzioni eseguono in maniera predefinita tale procedura. Lo script da inserire consta semplicemente di una riga: rm -rf /tmp/* 388.9.19) Come si visualizza lo spazio disponibile su disco? A tale scopo si utilizza il comando ‘df’: # df[ Invio ] Il suddetto comando restituirà la percentuale di occupazione di ciascun file system montato, lo spazio occupato e lo spazio residuo. Mediante l’opzione -h , lo spazio residuo verrà visualizzato in maniera più chiara. L’opzione -T mostrerà anche il tipo di ogni file system. 388.9.20) Come si possono visualizzare le variabili d’ambiente? Per visualizzare le variabili, occorre digitare: # printenv[ Invio ] oppure: # set[ Invio ] Amministrazione del sistema 4481 388.9.21) Come si impostano le variabili d’ambiente? Le variabili d’ambiente si impostano mediante il comando ‘export’: # $ export VARIABILE=valore[ Invio ] Ecco qualche esempio: # export HOSTNAME="‘cat /etc/HOSTNAME‘"[ Invio ] # export MOZILLA_HOME=/usr/lib/netscape[ Invio ] # export MAILDIR=/var/spool/mail[ Invio ] # export TERM=linux[ Invio ] # export PS1=’\n\u@\h:[‘pwd‘] [\t] --> \!\n* ’[ Invio ] 388.9.22) Come si possono visualizzare le librerie usate da un programma? Con il comando ‘ldd’: # ldd programma[ Invio ] 388.9.23) Come mi devo comportare se un applicativo mi chiede una libreria di una versione più vecchia di quella attualmente installata nel mio sistema? Se un programma richiede una versione di una libreria più vecchia di quella installata nel proprio sistema, a volte è sufficiente creare un collegamento simbolico alla libreria più vecchia. Il nome del collegamento simbolico dovrà essere quello della libreria di versione precedente. Se ad esempio un programma richiedesse le librerie ‘libjpeg’ 61 ma nel sistema fosse installata solo la versione 62, sarebbe sufficiente creare nella directory ‘/usr/lib/’ un collegamento simbolico alla libreria più recente: # cd /usr/lib/[ Invio ] # ln -s libjpeg.so.62 libjpeg.so.61[ Invio ] 388.9.24) C’è un modo per evitare di scrivere ogni volta comandi molto lunghi utilizzati di frequente? Per fare questo, occorre ricorrere agli alias. Questi ultimi non sono altro che dei nomi cui vengono associati comandi che si usano frequentemente e che comunque presentano numerose opzioni, difficili da ricordare o troppo lunghe da digitare. Per creare un alias è sufficiente il comando ‘alias’: # alias ls=’ls -la --color’[ Invio ] In questo caso basterà digitare ‘ls’ per avere un elenco dettagliato e colorato di tutti i file (anche quelli nascosti). Se si intende mantenere gli alias, si dovranno inserire i comandi nel file ‘~/ .bash_profile’ se sono specifici per un utente, o nel file ‘/etc/profile’ se saranno tutti gli utenti del sistema a poterne beneficiare. 4482 Amministrazione del sistema 388.9.25) Esiste la possibilità di sospendere (ibernare) un sistema GNU/Linux? Per abilitare questa funzione, bisogna includere tra le opzioni del kernel, il supporto per l’APM. Per sospendere il sistema si dovrà dare il comando: # apm --suspend[ Invio ] 388.10 Utenti e password 388.10.1) Dove sono raccolte le informazioni sugli utenti del sistema? Queste informazioni sono raccolte nel file ‘/etc/passwd’. Se si usano le shadow password, si dovrà controllare anche il file ‘/etc/shadow’. 388.10.2) Dove sono raccolte le informazioni sui gruppi di utenti del sistema? L’elenco dei gruppi di utenti è contenuto nel file ‘/etc/group’. Se si usano le shadow password, si dovrà controllare anche il file ‘/etc/gshadow’. 388.10.3) In che modo è possibile rimuovere un account di un utente? Si può eliminare un utente dal sistema mediante il seguente comando: # userdel IDutente[ Invio ]41 Alcune distribuzioni dispongono di ‘deluser’ al posto di ‘userdel’. In ogni caso si deve ricordare che ogni utente possiede generalmente i propri dati nella directory ‘/home/utente’ e la sua presenza nel sistema dipende dalle impostazioni presenti nei file ‘/etc/passwd’ e ‘/etc/group’. L’eliminazione quindi di queste componenti, comporta in effetti la rimozione dell’utente dal sistema. 388.10.4) Come si cancellano tutti i file di un utente presenti nel sistema? Il comando è: # find / -user uid -exec rm {} \;[ Invio ]42 oppure: # find / -uid ‘id -u utente‘ | xargs rm -f[ Invio ] Per evitare di commettere errori che potrebbero risultare spiacevoli è meglio controllare cosa questo comando andrà a cancellare con: # find / -user uid | less[ Invio ] 41 IDutente è il numero di identificazione dell’utente. Questo numero si può recuperare nel file ‘/etc/passwd’ o mediante il comando ‘id -u utente’. 42 dove uid è il valore numerico dell’utente del quale vuoi cancellare i file; (da rilevare in ‘/etc/passwd’ o mediante il comando ‘id -u utente’). Amministrazione del sistema 4483 388.10.5) Come si fa a diventare momentaneamente un altro utente? Con il comando: # su utente[ Invio ] Per riassumere l’identità dell’utente precedente, si dovrà digitare: # exit[ Invio ] 388.10.6) Come si cambia la propria password? La propria password si può cambiare con: # passwd[ Invio ] 388.10.7) Come si cambia la password degli utenti del sistema? Il comando è: # passwd utente[ Invio ]43 Si deve ricordare in ogni caso che il comando deve essere impartito dall’utente ‘root’. 388.10.8) Cosa sono le password shadow? Le password shadow si utilizzano per motivi di sicurezza. Sebbene le password presenti in ‘/etc/passwd’ siano codificate, con gli strumenti necessari e con un po’ di tempo, è possibile risalire alla password originale. L’accesso al file ‘/etc/passwd’ è consentito a tutti gli utenti. Con le password shadow invece le password vengono mantenute nel file ‘/etc/shadow’, accessibile solo dall’utente ‘root’. 388.10.9) Come si può evitare la richiesta della password all’avvio? Per fare ciò, occorre modificare il file che contiene le password44 . Occorrerà cancellare la password (che appare codificata) relativa all’utente desiderato. Per esempio, se avessimo un file ‘/etc/passwd’ di questo tipo: root:Wteoh1TDSchyA:0:0:root:/root:/bin/bash studente::100:100:,,,:/home/studente:/bin/bash se si accede al sistema in qualità di utente ‘root’ verrà richiesta la password, mentre non verrà richiesta accedendo da utente ‘studente’. 388.10.10) Come si può evitare la richiesta del login e della password all’avvio? Prima di proseguire con la spiegazione, si consiglia innanzitutto di creare un dischetto di avvio per essere in grado in ogni caso di poter accedere al sistema e poi si devono tenere presenti i seguenti tre punti: 43 44 utente è l’utente di cui si vuole cambiare la password. ‘/etc/passwd’ o ‘/etc/shadow’. Amministrazione del sistema 4484 1. il file ‘/etc/inittab’ contiene le azioni che ‘init’ deve compiere dopo l’avvio del kernel. Viene infatti lanciato ‘mingetty’ o ‘getty’ per effettuare il login ed abilitare i terminali virtuali. Il termine ‘respawn’ (in ‘/etc/inittab’) significa che il processo indicato deve ripartire una volta che è terminato. Ecco perché, impartendo ‘exit’ si ritorna al prompt del login; 2. la shell Bash, eseguita in modalità login come è spiegato nella LDR 388.9.3, cerca in successione diversi file di configurazione: ‘/etc/profile’, ‘$HOME/.bash_profile’, ‘$HOME/.bash_login’ e ‘$HOME/.profile’ e se li trova li esegue; 3. normalmente, dopo avere inserito login e password vengono impostate le variabili d’ambiente ‘HOME’, ‘PATH’, ‘SHELL’, ‘TERM’, ‘MAIL’ e ‘LOGNAME’ ed infine viene lanciata la shell dell’utente specificata in ‘/etc/passwd’. Il normale processo di login quindi, avvia anche l’interprete dei comandi adatto, impostando poi la corretta variabile d’ambiente ‘HOME’. Di conseguenza, saltando il processo di login, la ‘HOME’ rimane impostata a ‘/’, e non alla directory dell’utente che accede. Esposte queste tre premesse, ecco come procedere: 1. Si deve modificare il file ‘/etc/profile’: HOME="/utente" export HOME 45 . 2. Occorrerà poi modificare il file ‘/etc/inittab’. Le seguenti righe: # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 # xdm is now a separate service x:5:respawn:/etc/X11/prefdm -nodaemon dovranno essere modificate e se ne dovranno aggiungere altre due. Il risultato dovrà essere simile a quanto segue: #Avvio senza login 1:12345:wait:/bin/bash -login # Run gettys in standard runlevels #1:2345:respawn:/sbin/mingetty tty1 #2:2345:respawn:/sbin/mingetty tty2 #3:2345:respawn:/sbin/mingetty tty3 #4:2345:respawn:/sbin/mingetty tty4 #5:2345:respawn:/sbin/mingetty tty5 #6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 # xdm is now a separate service # x:5:respawn:/etc/X11/prefdm -nodaemon Il termine ‘wait’ significa che si deve aspettare la fine del processo ma questo, una volta terminato, non sarà riavviato. Infatti, digitando ‘exit’ al prompt, l’interprete dei comandi si chiuderà e sarà necessario avviare lo spegnimento. 45 questo permetterà di mantenere le configurazioni salvate nella directory home